Docker Swarm工作节点无法访问自身托管的Nginx服务求助
这是Docker Swarm集群里很典型的Ingress网络配置问题,结合你在AWS EC2上的环境,我整理了几个最可能的原因和对应的排查、解决步骤:
1. 检查Ingress网络的端口监听状态
Swarm的ingress模式会在集群所有节点上监听发布的端口(这里是80),由Docker代理进程转发到对应容器。你可以在工作节点上执行以下命令,确认80端口是否被正确监听:
sudo ss -tulpn | grep :80
如果输出里没有docker-proxy或者swarmkit相关的进程监听80端口,说明Ingress的端口发布在工作节点上没有生效。解决办法:
- 重启工作节点的Docker服务:
sudo systemctl restart docker - 如果重启后还是不行,退出Swarm集群再重新加入:
docker swarm leave -f docker swarm join --token <你的token> <Master Private IP>:2377
2. 验证本地防火墙(iptables)规则
AWS EC2实例默认会有iptables规则,Docker Swarm的Ingress网络依赖特定的iptables链来转发流量。你可以在工作节点上检查相关规则:
sudo iptables -L -n | grep DOCKER-INGRESS
如果看不到允许本地回环(127.0.0.0/8)访问80端口的规则,可能是Docker的iptables配置被干扰了。解决办法:
- 重置iptables并重启Docker:
(注意:这个操作会清除实例上的自定义iptables规则,测试环境可以放心执行)sudo iptables -F sudo systemctl restart docker
3. 测试非localhost的访问路径
有时候Ingress网络对回环地址(localhost/127.0.0.1)的转发存在异常,但通过节点的私有IP可以正常访问。你可以在工作节点上试试:
curl http://172.31.14.130
如果这个命令能正常返回Nginx页面,说明问题出在回环地址的路由上。你可以添加一条本地路由规则来修复:
sudo ip route add 127.0.0.1/32 dev docker0
4. 检查Ingress网络的健康状态
Ingress网络是Swarm默认的overlay网络,如果这个网络在工作节点上异常,也会导致流量转发失败。你可以检查Ingress网络的详情:
docker network inspect ingress
查看输出中工作节点的状态是否为healthy。如果有异常,尝试重建Ingress网络(注意:这个操作会中断集群内的现有服务,建议在测试环境执行):
- 在主节点上删除并重建Ingress网络:
docker network rm ingress docker swarm init --force-new-cluster - 然后让工作节点重新加入集群。
内容的提问来源于stack exchange,提问作者markovchain

