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

Docker Swarm中每两次请求就有一次路由失败问题排查求助

排查单节点Docker Swarm服务每两次请求一次失败的问题

看起来你遇到的是Swarm负载均衡或者服务实例异常导致的交替失败问题,结合你描述的telnet现象,我给你梳理几个排查方向和解决办法:

1. 先检查服务的副本数与实例状态

首先确认你的服务是不是启动了2个副本——如果是,Swarm的默认VIP负载均衡会轮询分发请求到两个实例,要是其中一个实例本身就有问题,就会出现一次通一次失败的情况。

  • 执行命令查看服务列表:
    docker service ls
    
    看对应服务的REPLICAS列是不是2/2(或者类似的多副本配置)。
  • 进一步查看每个副本的运行状态:
    docker service ps <你的服务名称>
    
    检查有没有副本处于Restarting或者Failed状态,或者节点调度异常。
  • 登录到每个容器内部,测试服务本身是否正常:
    docker exec -it <容器ID> curl localhost:8091
    
    如果其中一个容器内部访问就失败,那问题出在服务镜像或者启动配置上,和Swarm无关。

2. 检查端口映射模式

Swarm的端口映射默认用VIP模式(虚拟IP),单节点集群下偶尔会出现iptables规则异常,导致流量分配紊乱。你可以尝试切换成host模式绕过Swarm的负载均衡,验证问题是否消失:
修改你的docker-compose-swarm.yml中的端口配置:

services:
  <你的服务>:
    # 其他配置...
    ports:
      - target: 8091
        published: 8091
        mode: host

然后重新部署服务:

docker stack rm testing1
docker-compose -f docker-compose-swarm.yml config | docker stack deploy -c - testing1

如果切换后问题解决,那就是Swarm VIP机制在单节点下的小问题,你可以选择继续用host模式,或者重启docker daemon修复VIP规则:

systemctl restart docker  # Linux系统
# Windows/Mac的话在Docker Desktop里重启应用

3. 排查网络与防火墙问题

当第二次telnet卡住时,检查主机的网络状态和防火墙规则:

  • 查看8091端口的连接状态:
    netstat -anp | grep 8091  # Linux
    # Windows用 netstat -ano | findstr 8091
    
    看看卡住的连接是不是处于SYN_SENT状态,这可能是防火墙拦截了流量。
  • 检查Swarm的 ingress 防火墙链:
    iptables -L DOCKER-INGRESS -n
    
    确保没有拒绝8091端口流量的规则,要是有异常可以重置docker的iptables规则:
    iptables -F DOCKER-INGRESS
    systemctl restart docker
    

4. 查看日志找线索

最后,通过日志定位具体错误:

  • 查看docker daemon的日志,看有没有Swarm负载均衡相关的错误:
    journalctl -u docker.service -f  # Linux
    # Docker Desktop可以在设置里查看日志
    
  • 查看服务的日志,对比两个副本的输出差异:
    docker service logs -f <你的服务名称>
    

一般来说,按这个顺序排查,很快就能找到问题所在——大概率是某个服务实例异常,或者Swarm的VIP负载均衡在单节点下的临时故障。

内容的提问来源于stack exchange,提问作者Chris Stryczynski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:23:11