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

Posted

技术标签:

【中文标题】如何在单独的 docker 容器中配置和运行 Eureka Server、微服务(Eureka Client)、Zuul?【英文标题】:How to configure and run Eureka Server, Microservices (Eureka Client), Zuul inside separate docker containers? 【发布时间】:2019-07-24 13:26:45 【问题描述】:

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

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

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

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

但是当我选择 dockerize 服务时,一切都停止了。我创建了四个服务的四个 docker 镜像。

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

我做了什么:

尝试1:

Ran the Eureka server and client using below commands:

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 用户注册

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

尝试2:

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

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 用户注册

这也没有用。

Try 2 Error

尝试 3:

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

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

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

Try 3 Error

这也没有用。

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

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

【问题讨论】:

try 2 和 try 3 的错误响应是什么? 和Try 1一样 如果这是客户端的错误日志,那么 Eureka Server 或客户端尝试访问的任何内容都应该绑定到0.0.0.0,以便其他容器可以访问它。正如日志所说,连接被拒绝,这意味着客户端无法访问服务器,因为该端口上没有通过容器 ip 侦听的服务。检查服务本身的配置文件以便配置它 运行 Eureka Server 容器后,我运行了以下命令。 Rocks@Rocks-Lapi MINGW64 /c/Program Files/Docker Toolbox $ docker inspect -f '.Name - .NetworkSettings.IPAddress ' $(docker ps - aq) /eurekaserver-container - 172.17。 0.2 运行 Eureka Server 容器后,我运行了以下命令。 Rocks@Rocks-Lapi MINGW64 /c/Program Files/Docker Toolbox $ docker inspect -f '.Name - .NetworkSettings.IPAddress ' $(docker ps - aq) /eurekaserver-container - 172.17.0.2 。因此,这意味着 Eureka 在 172.17.0.2 IP 上运行,这只是一个容器 IP。但是在 Eureka 服务器属性文件中,我写了 "eureka.instance.hostname=discovery-eurekaserver.com" 。在 windows hosts 文件中,discovery-eurekaserver.com 是 127.0.0.1。在运行容器之前,如何在属性文件中提及 ip? 【参考方案1】:

我建议,每个 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"]

还有一个 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 发现服务器配置:

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

【讨论】:

discovery-server-01:8761/eureka这将如何被容器ip替换? 在 docker 网络中,docker compose 创建了一个控制 DNS 和主机名的新桥接网络。 默认情况下,Compose 会为您的应用设置单一网络。服务的每个容器都加入默认网络,并且可以被该网络上的其他容器访问,并且可以通过与容器名称相同的主机名被它们发现。docs.docker.com/compose/networking 我现在试试这个并反馈给你。谢谢。 只是需要澄清一下。在您的 docker-compose.yml 中,您如何调用 Docker 文件?如果我只是将 .jar 文件推送到图像中,可以吗?像这样: FROM java:8-alpine RUN apk --no-cache add netcat-openbsd COPY /UserSearch-0.0.1.jar /opt/lib/ COPY /UserSearchDelete.sh /opt/bin/UserSearchDelete.sh运行 chmod 755 /opt/bin/UserSearchDelete.sh 暴露 8082

以上是关于如何在单独的 docker 容器中配置和运行 Eureka Server、微服务(Eureka Client)、Zuul?的主要内容,如果未能解决你的问题,请参考以下文章

如何修改docker的nginx容器的配置

(Docker)如何在 WordPress 容器中使用单独的 Composer 容器安装依赖项?

Docker学习04

如何在容器中运行docker命令

如何在docker中运行odoo来配置pycharm

如何使用ssl设置Docker redis容器