Docker Swarm跨节点无法访问服务问题排查求助
Docker Swarm服务仅容器节点可访问的排查要点
针对你遇到的问题,以下是几个实用的排查方向:
防火墙/安全组未开放必要端口
Docker Swarm的Ingress路由依赖节点间的特定端口通信,同时你发布的服务端口也需要在所有节点开放:- 必须开放的Swarm集群端口:2377(TCP,集群管理)、7946(TCP/UDP,节点间发现与通信)、4789(UDP,Overlay网络VXLAN)
- 你指定的
<PUBLISHED-PORT>需在所有节点的防火墙(如ufw、firewalld、iptables)及云服务商安全组中放行 - 测试方法:在任意节点用
nc -zv <其他节点IP> 4789验证端口连通性
Ingress网络异常
Ingress网络是Swarm实现跨节点端口路由的核心,若它故障会导致路由失效:- 检查Ingress网络状态:
docker network inspect ingress,确认所有节点都在Containers列表中,无异常报错 - 若异常,可尝试重建Ingress网络:先停止所有关联服务,执行
docker network rm ingress,Swarm会自动重新创建Ingress网络;若未自动创建,可手动执行docker network create --driver overlay --ingress ingress
- 检查Ingress网络状态:
服务发布模式错误
若服务发布时指定了mode=host,会绕过Ingress路由,仅在容器所在节点开放端口:- 检查服务配置:
docker service inspect <SERVICE-NAME>,查看EndpointSpec.Ports中的PublishMode字段,确认值为ingress而非host - 若为
host模式,需删除服务重新创建,默认发布模式即为ingress,无需额外指定
- 检查服务配置:
节点间Overlay网络通信故障
Overlay网络是Swarm节点间容器通信的基础,若节点间VXLAN通信受阻,Ingress路由无法工作:- 检查节点间网络连通性:在各节点互相
ping对方IP,确保网络可达 - 查看Docker日志:
docker logs docker,搜索是否有Overlay网络相关的错误信息,如VXLAN初始化失败
- 检查节点间网络连通性:在各节点互相
发布端口被占用
若其他节点的<PUBLISHED-PORT>被本地进程占用,Swarm无法在该节点监听端口:- 检查端口占用情况:在问题节点执行
ss -tulpn | grep <PUBLISHED-PORT>,确认端口是否被其他进程占用 - 若被占用,需停止占用进程,或修改服务的
published端口重新创建服务
- 检查端口占用情况:在问题节点执行
内容的提问来源于stack exchange,提问作者Sachin Maharjan
相关产品推荐
相关产品推荐

