Docker Swarm 503错误排查:节点地址错误导致健康副本无法访问(2026-10-02)

当你确认所有副本都是 Running,访问服务却返回 503 Service Unavailable 时,问题往往不在容器本身,而在 节点通告地址。本文用一个真实案例,带你快速定位并修复。

案例背景

某团队用 3 节点 Swarm 部署 API 服务,执行 docker service ps api 显示 3/3 副本健康。但通过外部负载均衡访问时,约 40% 的请求返回 503。奇怪的是,直连任意节点 IP 都能正常响应。

排查过程

第一步:确认服务与副本状态

docker service ls
docker service ps api --no-trunc

副本均为 Running,说明应用层无崩溃。

第二步:检查 Swarm 节点通告地址

docker node ls
docker node inspect <node-id> --format '{{.Status.Addr}}'

发现节点 A 的 Status.Addr 显示为 127.0.0.1,而非预期的 192.168.1.10。这就是根因:Swarm 内部路由网格将流量转发到错误地址,导致部分请求永远无法到达健康副本。

第三步:验证数据

修复方案

# 在错误节点上重新加入 Swarm,指定正确通告地址
docker swarm leave
docker swarm join --advertise-addr 192.168.1.10 \
  --token <worker-token> 192.168.1.1:2377

修复后立即验证:

docker node inspect <node-id> --format '{{.Status.Addr}}'
# 应输出 192.168.1.10

503 消失,请求成功率恢复 100%。

实用建议

行动号召

现在就执行 docker node ls 和 docker node inspect,检查你的 Swarm 节点通告地址是否正确。别让一个地址错误,掩盖了所有健康副本的努力。

免责声明:本文内容基于实际运维经验整理,操作前请备份 Swarm 配置并在测试环境验证。因执行本文命令导致的任何服务中断或数据损失,作者不承担责任。