Docker容器中Eureka客户端连接服务端报Connection refused异常求助
Docker容器跨容器Eureka通信问题排查与解决方案
问题根因
- 最核心的问题:你单独用
docker run启动客户端容器时,没有加入docker-compose为Eureka服务端创建的专属自定义网络,客户端容器无法解析eurekahost这个主机名,Eureka的内部回退逻辑会自动尝试连接localhost:8761,就会抛出你遇到的连接拒绝异常。 - 配置错误:客户端配置里
eureka.instance.hostname是指定客户端自身的主机名,你错误配置为Eureka服务端的主机名eurekahost,也会导致注册逻辑异常。
修复步骤
1. 修正配置文件
Eureka服务端配置(无需大改,保持统一即可):
spring.application.name=eureka-service server.port=8761 eureka.client.registerWithEureka = false eureka.client.fetchRegistry = false eureka.instance.hostname=eurekahost eureka.client.serviceUrl.defaultZone = http://eurekahost:8761/eureka
Eureka客户端配置(修正错误配置项):
server.port=8080 spring.application.name=user-service eureka.client.registerWithEureka = true eureka.client.fetchRegistry = true eureka.client.serviceUrl.defaultZone = http://eurekahost:8761/eureka eureka.client.instance.preferIpAddress = false # 移除错误的eureka.instance.hostname配置,或配置为客户端自身的标识
2. 调整容器启动方式,保证两个容器在同一个网络
方案A:将客户端也加入docker-compose配置(更推荐)
直接修改你的docker-compose.yaml,添加客户端服务定义,两个服务会自动加入同一个网络,无需额外配置:
services: eureka-server: image: eurekaservice hostname: eureka-server container_name: eurekahost ports: - "8761:8761" user-service: image: bankuser ports: - "8083:8080" depends_on: - eureka-server
修改后直接执行docker-compose up -d即可同时启动两个服务,自动完成通信。
方案B:手动指定客户端加入服务端的网络
首先在docker-compose.yaml所在目录执行以下命令,查询服务端所在的网络名:docker network ls
docker-compose默认创建的网络名格式为{当前目录名}_default,找到对应名称后,启动客户端时添加--network参数:docker run -p 8083:8080 --network 你的网络名 bankuser
3. 验证
如果启动后还有问题,可以进入客户端容器执行ping eurekahost,如果能正常连通说明网络配置正常,再检查配置文件即可。
内容的提问来源于stack exchange,提问作者Anton Cavanaugh
相关产品推荐
相关产品推荐

