如何在单独的 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?的主要内容,如果未能解决你的问题,请参考以下文章