Docker Swarm同Overlay网络服务无法通信问题求助
看起来你遇到了Swarm集群中Overlay网络服务DNS解析失败的问题,即使使用VIP也无法通信,下面是我整理的一步步排查方案:
确认Overlay网络的健康状态
首先检查这个Overlay网络的详细信息,确认所有节点都已正确加入网络:docker network inspect hh8zmhc9gx0p9iwukozo31dgs重点看
Containers和Peers部分,确认dev_db和dev_slavedb对应的容器都在网络中,且集群节点的状态都是健康的(没有断开连接的节点)。验证Swarm DNS解析功能
Swarm服务的域名解析依赖内置的DNS服务,你可以进入其中一个服务的容器,直接测试DNS解析:# 先获取dev_slavedb的容器ID docker ps --filter "name=dev_slavedb" --format "{{.ID}}" # 进入容器 docker exec -it <container-id> /bin/bash # 测试DNS解析 nslookup dev_db dig dev_db如果解析失败,说明Swarm的DNS服务出现了异常;如果能解析到VIP但还是无法通信,那问题可能出在网络连通性上。
检查节点间的Overlay网络必备端口
Overlay网络依赖以下端口的连通性,确保集群节点之间这些端口没有被防火墙/安全组拦截:- TCP 2377:Swarm管理节点间通信
- TCP/UDP 7946:节点间的发现与通信
- UDP 4789:VXLAN数据包传输
在swarm01节点上测试和swarm02的连通性:
# 测试4789端口 nc -zv swarm02 4789 # 测试7946端口 nc -zv swarm02 7946如果端口不通,先关闭节点上的防火墙(比如
ufw disable或者systemctl stop firewalld)测试,确认是防火墙问题后再配置规则放行这些端口。检查服务任务的实际运行状态
虽然服务显示存在,但任务可能有异常,检查任务的详细状态:docker service ps dev_db docker service ps dev_slavedb看任务的
STATE是否是Running,有没有重启循环的情况。如果任务状态异常,查看容器日志确认postgres服务是否正常启动:docker logs <container-id>如果postgres服务没正常启动,即使网络正常也无法通信。
排查Host模式端口发布的影响
注意到你的两个服务都使用了PublishMode: host,这种模式会将端口直接绑定在节点的主机网络上,虽然两个服务在不同节点不会端口冲突,但可能会绕过Swarm Overlay网络的部分逻辑。可以临时修改其中一个服务的发布模式为ingress测试:docker service update --publish-rm 5432:5432/tcp --publish-add 5432:5432/tcp --publish-mode ingress dev_db修改后再测试服务间的通信,看是否恢复正常。
确认集群节点Docker版本一致性
不同版本的Docker可能存在Overlay网络的兼容性问题,在所有节点上执行:docker version确保所有节点的Docker版本(尤其是Swarm相关的版本)完全一致,如果有版本差异,升级到同一稳定版本再测试。
重启Docker服务或Swarm节点(谨慎操作)
如果以上步骤都没解决问题,可以尝试重启单个节点的Docker服务(先确保服务有副本或者业务允许中断):systemctl restart docker如果是管理节点,重启后需要确认Swarm集群状态正常:
docker node ls
内容的提问来源于stack exchange,提问作者VaTo

