如何通过独立Docker-Compose文件连接Eureka Server与Client
问题描述
我尝试通过Docker Compose部署Eureka Server和Eureka Client并实现两者连接,现有配置如下:
Eureka Client 配置
application.yml
spring: jackson: serialization: fail-on-empty-beans: false application: name: usersMicro jpa: show-sql: true database: POSTGRESQL hibernate: ddl-auto: create-drop datasource: url: jdbc:postgresql://localhost:5432/my_test_db username: root password: admin driver-class-name: org.postgresql.Driver server: port: 8089 #eureka: # client: # serviceURL: # defaultZone: http://localhost:8761/eureka/ eureka: client: serviceURL: defaultZone: http://localhost:8761/eureka/ service-url: zone1: http://localhost:8761/eureka/ region: region-1 availability-zones: region-1: zone1
Dockerfile
FROM ubuntu:latest LABEL authors="user" ENTRYPOINT ["top", "-b"] FROM openjdk:17-jdk-slim VOLUME /tmp COPY target/usersMicro-1.jar user-service.jar ENTRYPOINT ["java","-jar","/user-service.jar"]
docker-compose.yml
version: "3.9" services: user-service: container_name: user-service image: user-service restart: unless-stopped build: context: . dockerfile: Dockerfile ports: - "8089:8089" networks: - postgres networks: postgres: name: shared-network external: true
Eureka Server 配置
application.yml
spring: application: name: eureka_server server: port: - "8761:8761" eureka: hostname: localhost client: register-with-eureka: false fetch-registry: false
Dockerfile(仅差异部分)
COPY target/eureka_server-1.jar eureka-server.jar ENTRYPOINT ["java","-jar","/eureka-server.jar"]
docker-compose.yml
version: '3.9' services: # EUREKA-SERVER CONTAINER............................................ eureka_server-service: container_name: eureka_server image: eureka_server restart: on-failure build: context: . dockerfile: Dockerfile ports: - "8761:8761" networks: - postgres # NETWORKS CONFIGURATION.................................................... networks: postgres: name: shared-network external: true
问题现象
Server和Client的docker-compose文件位于不同目录,此前已成功连接不同磁盘上的数据库,但Docker部署时出现连接拒绝错误:
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
或
2024-08-06T13:28:24.835500447Z Caused by: org.apache.hc.client5.http.HttpHostConnectException: Connect to http://localhost:8761 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused
IDE中直接启动时连接正常。
解决方案
1. 修正容器间访问地址
容器内的localhost指向容器自身,而非宿主机或其他容器。由于两个容器已加入同一外部网络shared-network,可以直接通过容器名称或服务名称访问Eureka Server。
修改Eureka Client的application.yml中Eureka配置部分:
eureka: client: serviceURL: defaultZone: http://eureka_server:8761/eureka/ # 替换为Eureka Server的容器名称 service-url: zone1: http://eureka_server:8761/eureka/ # 同样替换 region: region-1 availability-zones: region-1: zone1
2. 修复Eureka Server的端口配置错误
Server的application.yml中server.port配置错误,Spring Boot的端口应为单个数值,而非Docker Compose的端口映射格式。修改如下:
spring: application: name: eureka_server server: port: 8761 # 修正为单个端口值 eureka: hostname: eureka_server # 可选:改为容器名称,方便其他容器识别 client: register-with-eureka: false fetch-registry: false
3. 修正数据库连接地址(可选)
如果数据库部署在宿主机,容器内的localhost无法访问,需根据操作系统调整:
- Windows/macOS:使用
host.docker.internal替代localhost,即jdbc:postgresql://host.docker.internal:5432/my_test_db - Linux:使用宿主机的实际IP地址,或在docker-compose中添加
extra_hosts配置映射宿主机
4. 验证网络连通性
进入Eureka Client容器,执行以下命令测试是否能访问Eureka Server:
docker exec -it user-service curl http://eureka_server:8761
若返回Eureka Server的页面内容,说明网络连通正常。
内容的提问来源于stack exchange,提问作者Артём Орёл
相关产品推荐
相关产品推荐

