Docker Swarm跨主机服务无法互访问题排查求助
Docker Swarm服务间互访超时问题解决指南
问题背景
使用如下Docker Stack部署了两个Nginx服务,外部访问正常,但服务间无法通过服务名互访:DNS解析正常,但端口连接超时。
version: "3.2" services: web1: image: nginx ports: - "8081:80" deploy: placement: constraints: - node.role == manager web2: image: nginx ports: - "8082:80"
现象总结
- 外部访问正常:通过
http://docker_swarm_manager:8081和http://docker_swarm_node:8082可顺利打开服务 - 服务间互访失败:web1与web2互相访问时端口连接超时
- DNS解析正常:ping测试能成功解析服务IP地址
- 无IP/网络冲突,使用Swarm默认overlay网络,主机网段为172.X.X.X/24
问题定位
DNS解析正常说明服务发现机制没问题,端口连接超时指向Swarm overlay网络的数据包转发被拦截,大概率是防火墙未开放集群必需端口,或节点间网络策略限制了Swarm内部通信。
解决步骤
1. 开放Swarm集群必需端口
所有Swarm节点(manager和worker)都需要开放以下端口,确保overlay网络能正常通信:
- TCP 2377:集群管理命令传输
- TCP/UDP 7946:节点间gossip通信
- UDP 4789:overlay网络VXLAN数据包转发
Ubuntu/Debian系统:
sudo ufw allow 2377/tcp sudo ufw allow 7946/tcp sudo ufw allow 7946/udp sudo ufw allow 4789/udp sudo ufw reload
CentOS/RHEL系统:
sudo firewall-cmd --add-port=2377/tcp --permanent sudo firewall-cmd --add-port=7946/tcp --permanent sudo firewall-cmd --add-port=7946/udp --permanent sudo firewall-cmd --add-port=4789/udp --permanent sudo firewall-cmd --reload
2. 检查overlay网络状态
确认服务已正确加入stack的默认overlay网络:
# 替换为你的stack名称 docker network inspect <your_stack_name>_default
查看Containers字段,确保web1和web2的容器都在列表中,且IP地址与ping结果一致。如果网络状态异常,重新部署stack:
docker stack rm <your_stack_name> docker stack deploy -c docker-compose.yml <your_stack_name>
3. 验证节点间连通性
在manager节点测试与worker节点的关键端口连通性:
# 替换为worker节点IP nc -zv <worker_node_ip> 4789 nc -zv <worker_node_ip> 7946
如果连接失败,需排查主机路由、VPN或云服务商安全组规则,确保节点间网络无拦截。
4. 恢复Docker默认iptables规则
如果手动修改过iptables,可能破坏了Docker自动生成的overlay网络规则,重启Docker恢复默认配置:
sudo systemctl restart docker
验证
进入web1容器测试访问web2:
docker exec -it $(docker ps -q -f name=<your_stack_name>_web1) curl web2:80
返回Nginx默认页面则说明问题已解决。
内容的提问来源于stack exchange,提问作者Joao Vitorino
相关产品推荐
相关产品推荐

