Docker Swarm同主机无法访问服务(docker-compose非Stack部署运行正常)
问题核心原因
Docker Swarm的服务发现、网络模型和单机docker-compose存在明显差异,你的访问失败主要是未匹配Swarm的解析规则导致的,按以下不同访问场景排查即可:
场景1:同一ams_stack内的其他服务访问ads服务
- 正确访问地址为 服务名+容器内部监听端口:
ads:9000,不需要加Stack前缀,也不要用你自定义的hostname访问 - 故障排查:
- 执行
docker inspect <访问方容器ID> | grep Networks,确认访问方容器和ads服务都在ams_stack_defaultoverlay网络下 - 进入访问方容器执行
nslookup ads,如果能正常返回IP说明DNS解析正常,否则检查Stack网络配置 - 检查ads服务内9000端口是否绑定在
0.0.0.0而非127.0.0.1,绑定本地回环地址会拒绝所有外部访问
- 执行
场景2:跨Stack的其他服务访问ads服务
- 正确访问地址为 服务名.Stack名+容器内部监听端口:
ads.ams_stack:9000 - 故障排查:
- 确认两个Stack的服务都加入了同一个共享的overlay网络,或者将
ams_stack_default网络设置为可被其他Stack附加 - 同上验证DNS解析和端口绑定规则
- 确认两个Stack的服务都加入了同一个共享的overlay网络,或者将
场景3:宿主机/外部网络访问ads服务
- 正确访问地址为 Swarm任意节点的IP+映射端口:比如Swarm节点IP为192.168.1.20,访问地址为
192.168.1.20:9001,无需关心ads服务实际运行在哪个worker节点,Swarm的Ingress网络会自动转发请求 - 如果你需要继续用域名访问,在宿主机hosts文件添加映射即可:
192.168.1.20 ads ams_stack_ads,之后可正常使用ads:9001访问 - 故障排查:
- 检查所有Swarm节点的防火墙是否放开9001端口,以及Swarm集群通信所需端口(2377/tcp、7946/tcp/udp、4789/udp)
- 直接登录ads运行的worker节点,执行
curl 127.0.0.1:9000验证服务本身是否正常响应
额外注意
你配置的hostname: ams_stack_ads仅为容器内部的主机名,不会被Swarm的服务发现系统注册解析,无需使用该地址访问。
内容的提问来源于stack exchange,提问作者vel
相关产品推荐
相关产品推荐

