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

如何通过独立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,提问作者Артём Орёл

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:37:12