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

Docker部署Eureka注册服务时localhost:8761连接拒绝问题排查

问题:Docker环境下Eureka注册中心报错尝试连接localhost:8761

API-Gateway微服务实例注册到Docker上运行的Eureka注册中心后,应用运行正常且实例注册成功,但Eureka注册中心持续抛出运行时异常,错误日志显示系统尝试连接localhost:8761,而配置中并未设置该地址。

错误日志

2023-09-08 14:31:01 2023-09-08T13:31:01.536Z  INFO 1 --- [nio-9001-exec-2] c.n.e.registry.AbstractInstanceRegistry  : Registered instance API-GATEWAY/479d5ae21d41:api-gateway:9000 with status UP (replication=false)
2023-09-08 14:31:03 2023-09-08T13:31:03.618Z ERROR 1 --- [get_localhost-4] c.n.e.cluster.ReplicationTaskProcessor   : Network level connection to peer localhost; retrying after delay
2023-09-08 14:31:03 
2023-09-08 14:31:03 ***jakarta.ws.rs.ProcessingException: org.apache.http.conn.HttpHostConnectException: Connect to localhost:8761 [localhost/127.0.0.1] failed: Connection refused***
2023-09-08 14:31:03     at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:439) ~[jersey-client-3.1.3.jar!/:na]
2023-09-08 14:31:03     at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:345) ~[jersey-client-3.1.3.jar!/:na]
2023-09-08 14:31:03     at com.netflix.eureka.transport.Jersey3ReplicationClient.submitBatchUpdates(Jersey3ReplicationClient.java:116) ~[eureka-core-jersey3-2.0.1.jar!/:2.0.1]
2023-09-08 14:31:03     at com.netflix.eureka.cluster.ReplicationTaskProcessor.process(ReplicationTaskProcessor.java:80) ~[eureka-core-2.0.1.jar!/:2.0.1]
2023-09-08 14:31:03     at com.netflix.eureka.util.batcher.TaskExecutors$BatchWorkerRunnable.run(TaskExecutors.java:190) ~[eureka-core-2.0.1.jar!/:2.0.1]
2023-09-08 14:31:03     at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
2023-09-08 14:31:03 Caused by: org.apache.http.conn.HttpHostConnectException: Connect to localhost:8761 [localhost/127.0.0.1] failed: Connection refused
2023-09-08 14:31:03     at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:159) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:03     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:359) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:03     at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:381) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:03     at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:03     at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:03     at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:03     at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:13     at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
2023-09-08 14:31:13 Caused by: org.apache.http.conn.HttpHostConnectException: Connect to localhost:8761 [localhost/127.0.0.1] failed: Connection refused
2023-09-08 14:31:13     at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:159) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:13     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:359) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:13     at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:381) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:13     at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:13     at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185) ~org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:381) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:23     at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:23     at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:23     at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:23     at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:23     at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:23     at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72) ~[httpclient-4.5.3.jar!/:4.5.3]
2023-09-08 14:31:23     at org.glassfish.jersey.apache.connector.ApacheConnector.apply(ApacheConnector.java:483) ~[jersey-apache-connector-3.1.3.jar!/:na
2023-09-08 14:31:23 
2023-09-08 14:31:26 2023-09-08T13:31:26.682Z  INFO 1 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 98ms
2023-09-08 14:31:33 2023-09-08T13:31:33.757Z ERROR 1 --- [et_localhost-16] c.n.e.cluster.ReplicationTaskProcessor   : Network level connection to peer localhost; retrying after delay

相关配置

Eureka注册中心application.yml

server:
  port: 9001

spring:
  application:
    name: discovery-server

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
  instance:
    hostname: localhost

management:
  tracing:
    sampling:
      probability: 1.0

Eureka注册中心Docker Compose

version: '3.8'

services:
  discovery-service:
    image:  discoveryservice
    container_name: discovery-service
    hostname: discovery-service
    environment:
      EUREKA_INSTANCE_HOSTNAME: discovery-service
    ports:
      - "9001:9001"
    networks:
      - grammercetamol
networks:
  grammercetamol:
    name: grammercetamol
    external: true

API-Gateway application.yml

server:
  port: 9000

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:9001/eureka
  instance:
    hostname: localhost

spring:
  application:
    name: api-gateway
    http:
      multipart:
        max-file-size: 50MB
        max-request-size: 40
  cloud:
    discovery:
      enabled: true
    gateway:
      routes:
        - id: identity-service
          predicates:
            - Path=/api/auth/**
          uri: lb://identity-service

        - id: course-service
          predicates:
            - Path=/api/courses/**
          uri: lb://course-service

        - id: video-service
          predicates:
            - Path=/api/videos/**
          uri: lb://video-service

        - id: cloudinary-service
          predicates:
            - Path=/api/cloudinary/**
          uri: lb://cloudinary-service
logging:
  level:
    root: INFO
    org:
      springframework:
        cloud:
          gateway: TRACE
          gateway.route.RouteDefinitionLoader: INFO

API-Gateway Docker Compose

version: '3.8'

services:
  api-gateway:
    image: apigateway
    container_name: api-gateway
    ports:
      - "9000:9000"
    environment:
      EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: http://discovery-service:9001/eureka
      EUREKA_INSTANCE_HOSTNAME: api-gateway
    networks:
      - grammercetamol
networks:
  grammercetamol:
    name: grammercetamol
    external: true

问题原因

Eureka默认以集群模式运行,即使单节点部署,若未明确配置自身服务地址,节点会尝试向默认的localhost:8761发起实例信息复制请求。你的Eureka运行在9001端口,且Docker容器内未监听8761端口,因此出现连接拒绝错误。同时,Eureka配置文件与Docker环境变量的主机名配置存在冲突,进一步加剧了该问题。

修复方案

1. 更新Eureka注册中心配置

修改Eureka的application.yml,明确指定自身服务地址,统一主机名配置逻辑:

server:
  port: 9001

spring:
  application:
    name: discovery-server

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    # 明确指定自身服务地址,覆盖默认的localhost:8761复制目标
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
  instance:
    # 优先使用环境变量配置主机名,适配Docker环境
    hostname: ${EUREKA_INSTANCE_HOSTNAME:localhost}
    # 指定服务端口与server.port一致,避免默认8761端口冲突
    non-secure-port: ${server.port}

management:
  tracing:
    sampling:
      probability: 1.0

2. 保持Docker Compose配置不变

Eureka的Docker Compose配置已设置正确的主机名环境变量,无需修改,确保容器加入指定网络即可。

3. 验证API-Gateway配置

API-Gateway的Docker Compose配置已正确指向容器内可访问的Eureka地址,无需调整。

原理说明

通过在Eureka配置中明确指定defaultZone为自身服务地址,覆盖了默认的localhost:8761复制目标;同时配置non-secure-port与服务端口一致,确保复制请求使用正确的端口。Docker环境变量EUREKA_INSTANCE_HOSTNAME让Eureka使用容器主机名,保证容器间通信正常。

内容的提问来源于stack exchange,提问作者Badmus Sodiq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:55:55