You need to enable JavaScript to run this app. Docker Swarm同主机无法访问服务(docker-compose非Stack部署运行正常)
优惠活动
大模型
产品
解决方案
定价
更多

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解析和端口绑定规则

场景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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 10:06:08