如何在单独的 docker 容器内配置和运行 Eureka Server、微服务(Eureka Client)、Zuul?

Suv*_*dal 0 containers docker spring-boot microservices

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

  1. 用户注册服务:在 MySql 数据库中创建用户,并使用 Rest Template 及其 Eureka 客户端与“搜索和删除服务”交互。GitHub链接
  2. 用户搜索和删除服务:从MySql数据库及其Eureka客户端搜索和删除。GitHub链接
  3. Eureka Server:用于服务发现。GitHub链接
  4. Zuul Server:用作 API 网关及其 Eureka 客户端。GitHub链接

我使用“Spring Boot STS”来开发服务。还使用“Spotify”依赖项来构建 Docker 映像。

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

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

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

我做了什么:

尝试1:

Ran the Eureka server and client using below commands:
Run Code Online (Sandbox Code Playgroud)

docker run --rm -it --name eurekaserver-container -p 8761:8761 eurekaserver-alpine-linux

docker run --rm -it -d --name 用户注册容器 -p 8081:8081 用户注册

在此输入图像描述

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

尝试2:

使用以下命令运行 Eureka 服务器和客户端。尝试链接两个容器(尤里卡服务器和客户端):

docker run --rm -it --name eurekaserver-container -p 8761:8761 eurekaserver-alpine-linux

docker run --rm -it -d --name user-registration-container -p 8081:8081 --link eurekaserver-container:eureka-server 用户注册

这也行不通。

尝试2次错误

尝试3:

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

docker run --rm -it -d --name eurekaserver-container -h discovery-eurekaserver.com -p 8761:8761 eurekaserver-alpine-linux /bin/bash

docker run --rm -it -d --name user-registration-container -p 8081:8081 --link eurekaserver-container:eureka-server 用户注册

尝试3个错误

这也行不通。

谁能帮助我理解我做错了什么?无论我尝试过什么,Eureka 客户端在不同容器中运行时都无法向 Eureka 服务器注册。

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

Mas*_*tti 5

我建议,每个 Spring boot 项目都有一个单独的 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"]
Run Code Online (Sandbox Code Playgroud)

以及用于控制服务和网络以及容器之间的链接的 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
Run Code Online (Sandbox Code Playgroud)

Docker 撰写文件参考

最终取决于 Eureka 发现服务器和微服务的配置。

尤里卡发现服务器配置application.yml

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
Run Code Online (Sandbox Code Playgroud)

微服务中的 Eureka 客户端配置application.yml

# 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
Run Code Online (Sandbox Code Playgroud)

运行 docker compose:

docker-compose up -d --build --force-recreate
Run Code Online (Sandbox Code Playgroud)

Docker Compose 命令参考