Docker Swarm搭配Docker Compose v3主机名下划线问题求助
Docker Swarm Overlay网络服务通信问题解决方案
你遇到的核心问题是对Docker Swarm服务发现机制的理解偏差,以及错误使用容器名称而非服务名进行跨服务通信。下面是具体的分析和修复步骤:
问题根源解析
container_name在Swarm中的局限性:你给第一个服务指定了container_name: "eureka",但在Swarm模式下,这个设置会限制服务只能运行一个实例(容器名称必须全局唯一),更关键的是——Swarm的服务发现并不基于容器名称,而是依赖你在services块中定义的服务名。- 错误的主机名配置:第二个服务中你设置
EUREKA_HOST: eureka_web,这个名称根本不存在于Swarm的DNS解析体系中。Swarm中同一overlay网络内的服务,默认可以直接通过服务名进行访问,不需要额外拼接后缀。
修复后的配置示例
第一个服务(Eureka)的Compose配置
建议移除container_name,并把服务名改为更清晰的eureka(方便其他服务引用):
version: '3' services: eureka: image: eureka environment: EUREKA_HOST: eureka # 直接使用服务名作为Eureka的主机名 ports: - 8070:8070 networks: - net_swarm networks: net_swarm: external: name: net_swarm
第二个服务(Zuul)的Compose配置
调整EUREKA_HOST为第一个服务的服务名eureka,同时也可以把自身服务名改为更明确的zuul:
version: '3' services: zuul: image: zuul-service environment: EUREKA_HOST: eureka # 直接引用Eureka服务的服务名 ports: - 8069:8069 networks: - net_swarm networks: net_swarm: external: name: net_swarm
部署与验证步骤
- 确保overlay网络
net_swarm已创建(如果还没创建的话):
docker network create --driver overlay net_swarm
- 使用Swarm的stack命令部署两个服务(不要用
docker-compose up,这是单机模式的命令):
docker stack deploy -c ./eureka-compose.yml eureka-stack docker stack deploy -c ./zuul-compose.yml zuul-stack
- 验证通信:你可以进入Zuul的容器中,尝试ping
eureka,应该能正常解析到IP并连通:
docker exec -it <zuul_container_id> ping eureka
额外注意事项
- 永远不要在Swarm服务中指定
container_name,除非你明确知道服务只会运行一个实例,否则会导致部署失败。 - Swarm服务的DNS解析规则:同一网络内直接用服务名;跨网络的话可以用
<service_name>.<network_name>的格式。 - 如果你的服务需要多实例部署,Swarm会自动负载均衡到各个实例,这也是使用服务名而非容器名的另一个原因——容器会动态创建销毁,服务名才是稳定的入口。
内容的提问来源于stack exchange,提问作者vaibhav
相关产品推荐
相关产品推荐

