Docker Swarm Redis连通性异常求助:Manager节点无法访问本地6379端口
排查Docker Swarm中Manager节点无法访问Redis服务本地端口的问题
看起来你遇到的是Docker Swarm路由网格的异常问题——Redis服务调度到Worker节点后,Worker本地能正常访问,但Manager节点通过本地6379端口访问时报连接超时(不是拒绝),这说明不是简单的防火墙拦截,大概率是Swarm的路由网格转发出了问题。咱一步步来排查:
1. 先确认Redis服务的Swarm调度状态
首先在Manager节点leader-0上执行以下命令,确认服务本身没问题:
- 查看服务列表:
确保Redis服务的状态是docker service lsrunning,副本数和你配置的一致。 - 查看服务的运行节点:
确认服务确实调度到了docker service ps <你的Redis服务名>redis-0节点,没有重启、失败的状态。
2. 验证节点间的底层网络连通性
虽然你说防火墙规则一致,但先确认Manager和Worker节点之间的核心Swarm端口是通的:
- 在
leader-0上pingredis-0的主机IP,确保能ping通 - 测试Swarm必需的端口:
如果这些端口有不通的,那就是节点间网络的问题,哪怕你说防火墙规则一致,也可能存在规则优先级或者其他网络设备(比如交换机)的限制。# 测试2377/tcp(Swarm管理端口) nc -zv <redis-0-ip> 2377 # 测试7946/tcp/udp(节点间通信) nc -zv <redis-0-ip> 7946 nc -zvu <redis-0-ip> 7946 # 测试4789/udp(Overlay网络数据包转发) nc -zvu <redis-0-ip> 4789
3. 检查Ingress路由网格的状态
你的Redis用了mode: ingress的端口发布,这依赖Swarm的路由网格。咱检查Ingress网络的状态:
- 查看Ingress网络详情:
确认docker network inspect ingressleader-0和redis-0都在这个网络的Containers列表里,且状态是healthy。 - 检查Manager节点的端口转发规则:
如果你的Docker用的是iptables(默认),执行:
应该能看到把本地6379的流量转发到iptables-save | grep -i "6379"redis-0节点IP的规则;如果用的是IPVS(新版Docker可能默认用),执行:
同样要确认有对应的转发条目。如果没有这些规则,说明Docker没有正确配置路由网格。ipvsadm -Ln | grep 6379
4. 查看Docker服务的日志
在leader-0上查看Docker的系统日志,找有没有和Ingress网络、端口转发相关的错误:
journalctl -u docker.service | grep -i "ingress\|overlay\|port"
比如有没有iptables配置失败、网络接口创建异常这类日志,这些能直接定位问题根源。
5. 临时测试:切换端口发布模式
把docker-compose.yml里的mode: ingress改成mode: host,重新部署服务:
docker stack deploy -c docker-compose.yml <你的栈名>
然后在leader-0上尝试用redis-0的主机IP访问6379:
redis-cli -h <redis-0-ip> ping
- 如果能通:说明是Ingress路由网格的问题,你可以尝试重置Ingress网络:
- 先删除所有使用Ingress网络的服务
- 删除Ingress网络:
docker network rm ingress - 重新创建Ingress网络:
docker network create -d overlay --ingress ingress - 重新部署Redis服务
- 如果还是不通:那问题出在节点间的网络连通性,需要再仔细排查防火墙、路由或者交换机的规则。
内容的提问来源于stack exchange,提问作者Alex T
相关产品推荐
相关产品推荐

