You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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也存在相同的端口不匹配问题。

修复方案(二选一):

  1. 修改Spring配置文件,将服务端口改为Tomcat默认的8080:
    • Eureka Server配置:server.port=8080
    • Eureka Client配置:server.port=8080
    • 同时修改Eureka Client的注册地址:eureka.client.serviceUrl.defaultZone=http://sm-discovery:8080/eureka
  2. 修改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)

核心问题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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:05:29