接入同一Docker网络的node服务与redis容器无法连通问题求助
问题根因与解决方案
核心问题排查
补充说明:你观察到
docker network inspect wellerman没有显示redis容器条目是正常现象,该命令只会列出当前节点上接入该网络的容器,如果redis服务被调度到Swarm集群的其他节点,当前节点的查询结果就不会展示。
1. 修正overlay网络配置
你当前使用的wellerman overlay网络Attachable属性为false,会导致非Swarm原生调度的资源无法正常接入、网络DNS解析异常。如果你需要保留该外部网络,先执行命令重新创建支持附加的overlay网络:
docker network rm wellerman docker network create --driver overlay --attachable --scope swarm wellerman
如果没有强制使用外部网络的需求,可以直接删除docker-compose.yml里的外部网络声明,让stack自动创建专属overlay网络,修改网络配置段为:
networks: wellerman: driver: overlay
2. 修正docker-compose无效配置与环境变量
- Swarm模式下
links参数已经完全废弃,删掉对应配置行 - 最初
REDIS_HOST设为localhost属于配置错误:容器内的localhost指向自身,不会访问到redis容器 - 修正后backend服务核心配置段如下:
backend: # 其他原有配置保留 environment: REDIS_HOST: 'redis' REDIS_PORT: 6379 depends_on: - redis # 删掉 links: - redis 配置行
3. 验证Swarm服务发现与网络连通性
如果修改后还是出现解析失败,可临时启动测试容器验证网络内DNS解析:
docker run --rm --network wellerman alpine nslookup redis
如果解析失败,执行命令强制更新redis服务重新接入网络:
docker service update --network-add wellerman backend_redis
4. 跨节点通信排查
如果你的Swarm集群有多个节点,确认redis和backend服务调度节点之间的以下端口未被防火墙拦截:
- 7946 TCP/UDP:容器网络发现端口
- 4789 UDP:overlay网络VXLAN通信端口
端口拦截会直接导致跨节点的overlay网络通信失败。
内容的提问来源于stack exchange,提问作者AbreQueVoy
相关产品推荐
相关产品推荐

