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
相关产品推荐
相关产品推荐

