Docker环境下Spring Boot Eureka Client无法注册至Server问题排查
问题描述
本地运行Eureka Server与Client功能正常,但使用Docker Compose部署时出现Connection Refused错误。
相关配置信息
Eureka Server(Discovery Service)配置文件
spring.application.name=eureka-server server.port=8761 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false
Eureka Client(Gateway Service)配置文件
server.port=8762 spring.application.name=gateway-service #尝试过使用localhost和主机IP配置eureka.client.service-url.default-zone,但均无效 eureka.client.serviceUrl.defaultZone=http://sm-discovery:8761/eureka
Eureka Server的Dockerfile
From tomcat:9.0.48-jdk11-openjdk-slim RUN rm -rf /usr/local/tomcat/webapps/* COPY ./target/discovery-service.war /usr/local/tomcat/webapps/ROOT.war CMD ["catalina.sh","run"]
Eureka Client的Dockerfile
From tomcat:9.0.48-jdk11-openjdk-slim RUN rm -rf /usr/local/tomcat/webapps/* COPY ./target/discovery-service.war /usr/local/tomcat/webapps/ROOT.war CMD ["catalina.sh","run"]
docker-compose.yml文件
version: "3" services: sm-discovery: image: sm-discovery container_name: sm-discovery build: ./discovery-service ports: - "8761:8080" restart: always sm-gateway: image: sm-gateway container_name: sm-gateway build: ./gateway-service ports: - "8762:8080" restart: always depends_on: - sm-discovery
错误信息
启动Docker Compose后,Eureka Client出现如下错误:
Request execution error. endpoint=DefaultEndpoint{ serviceUrl='http://sm-discovery:8761/eureka/}, exception=I/O error on POST request for "http://sm-discovery:8761/eureka/apps/GATEWAY-SERVICE": Connect to sm-discovery:8761 [sm-discovery/172.29.0.2] failed: Connection refused (Connection refused); nested exception is org.apache.http.conn.HttpHostConnectException: Connect to sm-discovery:8761 [sm-discovery/172.29.0.2] failed: Connection refused (Connection refused) stacktrace=org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://sm-discovery:8761/eureka/apps/GATEWAY-SERVICE": Connect to sm-discovery:8761 [sm-discovery/172.29.0.2] failed: Connection refused (Connection refused); nested exception is org.apache.http.conn.HttpHostConnectException: Connect to sm-discovery:8761 [sm-discovery/172.29.0.2] failed: Connection refused (Connection refused) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:785) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:711)
Docker网络检查结果
[ { "Name": "social-media_default", "Id": "0513ee1d4b80f21723e772f7eb3a100d9d78f3cb2a7a10a0f78bf5eb57ec4c6a", "Created": "2022-12-27T10:32:37.9902248Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.29.0.0/16", "Gateway": "172.29.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "43f35536a4cb8470b8a3278de9a62bc26284be9955409b83fba6c2d210995d42": { "Name": "sm-discovery", "EndpointID": "4babebdfadcf8a233e21ae87eea6d38ac22b0a75231505846eac97331127e24c", "MacAddress": "02:42:ac:1d:00:02", "IPv4Address": "172.29.0.2/16", "IPv6Address": "" }, "634c47e82d3c9d2dd85c9e23830a3bc579a874171dcb021a44d78041adb17fab": { "Name": "sm-gateway", "EndpointID": "3b2b128b8cd11b713cc0d19d5187bdf0d7503eeff03389449a3094ff221f1366", "MacAddress": "02:42:ac:1d:00:03", "IPv4Address": "172.29.0.3/16", "IPv6Address": "" } }, "Options": {}, "Labels": { "com.docker.compose.network": "default", "com.docker.compose.project": "social-media", "com.docker.compose.version": "2.12.1" } } ]
问题分析与解决方案
核心问题1:端口映射与容器内服务端口不匹配
Eureka Server配置文件中指定server.port=8761,但Docker Compose将主机8761端口映射到容器的8080端口(8761:8080)。容器内Tomcat默认运行在8080,但你的Eureka服务实际绑定的是8761端口,导致其他容器无法通过8080访问到Eureka Server。同理,Eureka Client也存在相同的端口不匹配问题。
修复方案(二选一):
- 修改Spring配置文件,将服务端口改为Tomcat默认的8080:
- Eureka Server配置:
server.port=8080 - Eureka Client配置:
server.port=8080 - 同时修改Eureka Client的注册地址:
eureka.client.serviceUrl.defaultZone=http://sm-discovery:8080/eureka
- Eureka Server配置:
- 修改Docker配置,让Tomcat运行在Spring配置的端口:
- 在Eureka Server的Dockerfile中修改启动命令:
CMD ["catalina.sh", "run", "-Dserver.port=8761"] - 在Eureka Client的Dockerfile中修改启动命令:
CMD ["catalina.sh", "run", "-Dserver.port=8762"] - 同时修改Docker Compose的端口映射:
8761:8761(sm-discovery)、8762:8762(sm-gateway)
- 在Eureka Server的Dockerfile中修改启动命令:
核心问题2:Eureka Client的Dockerfile复制了错误的WAR包
从配置可见,Eureka Client的Dockerfile中复制的是./target/discovery-service.war(Eureka Server的包),而非Gateway服务的WAR包,导致容器运行的是Eureka Server,自然无法向注册中心注册。
修复方案:
修改Eureka Client的Dockerfile:
From tomcat:9.0.48-jdk11-openjdk-slim RUN rm -rf /usr/local/tomcat/webapps/* COPY ./target/gateway-service.war /usr/local/tomcat/webapps/ROOT.war CMD ["catalina.sh","run"]
额外优化:保证服务就绪后再启动Client
depends_on仅保证容器启动顺序,不保证Eureka Server服务完全就绪。可以添加健康检查,确保Server就绪后再启动Client:
在docker-compose.yml中修改:
sm-discovery: # 原有配置不变 healthcheck: test: ["CMD-SHELL", "nc -z localhost 8080 || exit 1"] # 检查容器内8080端口是否可用,根据实际端口调整 interval: 10s timeout: 5s retries: 5 sm-gateway: # 原有配置不变 depends_on: sm-discovery: condition: service_healthy
内容的提问来源于stack exchange,提问作者Akheel Pasha
相关产品推荐
相关产品推荐

