我是Spring Boot和Docker的新手。
编写了以下微服务。

  • 用户注册服务:在MySql数据库中创建用户,并使用Rest Template及其Eureka Client与“搜索和删除服务”交互。 GitHub上的link
  • 用户搜索和删除服务:从MySql数据库及其Eureka Client中搜索和删除。 GitHub上的Link
  • Eureka服务器:用于服务发现。 GitHub上的Link
  • Zuul服务器:用作API网关及其Eureka客户端。 GitHub上的Link

  • 我已经使用“Spring Boot STS”来开发服务。还使用“Spotify”依赖项来构建docker镜像。

    我能够在本地主机(Windows)上从STS运行所有服务,并且一切正常。前面提到的所有三个服务都已在Eureka服务器中注册。

    但是当我选择对服务进行docker化时,一切都停止了工作。我已经创建了四个服务的四个docker镜像。

    问题:在两个单独的容器中运行Eureka服务器和“用户注册服务”,但该服务未在Eureka中注册。实际上,这些服务都没有在Eureka上注册。

    我做了什么:

    尝试1:
    Ran the Eureka server and client using below commands:
    



    spring-boot - 如何在单独的Docker容器中配置和运行Eureka Server,微服务(Eureka Client),Zuul?-LMLPHP

    看来Eureka Client(用户注册服务)无法找到Eureka服务器。我发现,Eureka服务器正在具有不同IP(172.0 ...)的容器中运行,而Eureka客户端无法连接该服务器。

    尝试2:

    使用以下命令运行Eureka服务器和客户端。试图链接两个容器(Eureka Server和Client):



    这也不起作用。

    Try 2 Error

    尝试3:

    使用以下命令运行Eureka服务器和客户端。尝试将主机名传递给Eureka镜像,以便客户端可以使用主机名找到Eureka服务器。还链接了两个容器。



    Try 3 Error

    这也不起作用。

    有人可以帮助我了解我在做什么错吗? 无论我如何尝试,在不同容器中运行时,Eureka客户端都无法向Eureka服务器注册。

    我的目标是在不同的容器中运行服务(Eureka服务器,应用程序服务等),并且所有服务都将在Eureka服务器中注册,以便可以从Postman或SOAP UI调用API。

    最佳答案

    我建议,每个Spring引导项目都有一个单独的Dockerfile。

    FROM maven:3.6.0-jdk-8
    MAINTAINER xxx@yyyyy.com
    COPY . /usr/src/project-name
    WORKDIR /usr/src/project-name
    CMD ["mvn","spring-boot:run"]
    

    还有一个docker-compose.yml,用于控制服务,网络以及容器之间的链接。

    例如:
    version: '3.5'
    services:
    
      discovery-server:
        build:
          context: ./discovery-server
        hostname: discovery-server
        environment:
          - SPRING_APPLICATION_NAME=discovery-server
          - SPRING_PROFILES_ACTIVE=dev
        command: ["mvn", "spring-boot:run"]
        expose:
          - "8761"
        volumes:
          - maven-home:/root/.m2
        networks:
          services-network-01:
            aliases:
              - discovery-server
    
      user-service:
        build:
          context: ./user-service
        hostname: user-service
        environment:
          - SPRING_APPLICATION_NAME=user-service
          - SPRING_PROFILES_ACTIVE=dev
        command: ["mvn", "spring-boot:run"]
        ports:
          - "8080:8080"
        volumes:
          - maven-home:/root/.m2
        networks:
          services-network-01:
            aliases:
              - user-service
        depends_on:
          - discovery-server
    
    volumes:
      maven-home:
    
    networks:
      services-network-01:
        name: services-network-01
        driver: bridge
    

    Docker Compose File Refrence

    最终取决于Eureka发现服务器和微服务的配置。
    application.yml中的Eureka Discovery Server配置:
    server:
      port: 8761
    eureka:
      client:
        register-with-eureka: false
        fetch-registry: false
        region: region1
        serviceUrl:
          zone1: http://discovery-server:8761/eureka/
        availability-zones:
          region1: zone1
      instance:
        hostname: discovery-server
        metadata-map:
          zone: zone1
    

    微服务中application.yml中的Eureka客户端配置:
    # Eureka client
    eureka:
      instance:
        prefer-ip-address: true
        metadata-map:
          zone: zone1
      client:
        prefer-same-zone-eureka: true
        register-with-eureka: true
        region: region1
        service-url:
          zone1: http://discovery-server:8761/eureka/
        availability-zones:
          region1: zone1
    

    运行docker compose:
    docker-compose up -d --build --force-recreate
    

    Docker Compose Commands Refrence

    07-28 13:11