开发环境Docker内连接Redis报Name or service not known错误求助
问题根因
你的报错核心是redis:6379域名解析失败,你的应用容器无法将redis这个主机名解析到对应Redis容器的IP地址,和本地Redis能连通是因为本地访问走的是宿主机网络,和Docker容器内部互访逻辑不同。
排查步骤
- 确认两个容器归属同一个Docker自定义网络
Docker默认的bridge网络不支持容器名解析,需要将应用容器和Redis容器都加入同一个自定义网桥。
执行命令查看容器所属网络:docker inspect <容器ID/容器名> | grep NetworkMode
如果不在同一网络,先创建公共网络:docker network create app-net,启动两个容器时都添加参数--network app-net即可。如果使用docker-compose编排,两个服务写在同一个yaml文件中时默认会创建公共网络,无需额外配置。 - 确认Redis容器的名称/网络别名正确
你代码中配置的Redis主机名为redis,需要保证Redis容器的名称或者网络别名确实为redis。如果启动Redis容器时命名为redis-test等其他名称,要么修改代码配置的主机名和容器名一致,要么启动Redis容器时添加别名参数:docker run --network app-net --network-alias redis <Redis镜像名>。docker-compose环境可在Redis服务配置下添加:networks: app-net: aliases: - redis - 容器内部验证连通性
进入应用容器内部执行命令验证连通性:nc -zv redis 6379,如果连通失败说明上述网络或别名配置有误,如果连通成功则检查代码是否加载了错误的配置文件,Redis地址配置是否硬编码错误。 - 避免localhost访问误区
不要在应用容器中使用localhost连接Redis,容器内的localhost指向应用容器本身,既不是宿主机也不是Redis容器,必须使用容器名/网络别名,或者宿主机的局域网IP进行连接。
内容的提问来源于stack exchange,提问作者VamshiKrishnaYedire
相关产品推荐
相关产品推荐

