You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Swarm工作节点无法访问自身托管的Nginx服务求助

排查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:
    sudo iptables -F
    sudo systemctl restart docker
    
    (注意:这个操作会清除实例上的自定义iptables规则,测试环境可以放心执行)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:35:29