gpt4 book ai didi

docker - 微服务 使用 Eureka 和 traefik 与 docker compose 进行服务发现

转载 作者:行者123 更新时间:2023-12-02 04:34:32 26 4
gpt4 key购买 nike

Traefik 傻瓜问题。我正在尝试使用 traefik 作为反向代理使用 docker compose 设置 Spring Cloud 微服务。

我的目标是微服务应该通过服务名称(例如:service-registry-app)相互通信,并且 traefik 应该将其解析为 IP 地址。一旦它在本地机器上运行,我想将其扩展为在 AWS ECS 上运行。

我使用

创建了 ana_network
docker network create ana_network

traefik 配置:

文件:docker-compose.yml

version: '2'

services:
proxy:
image: traefik
command: --api --docker --docker.domain=docker.localhost --logLevel=DEBUG
networks:
- ana_network
ports:
- "80:80"
- "8080:8080"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /dev/null:/traefik.toml

networks:
ana_network:
driver: bridge

微服务配置:

文件:docker-compose.yml

version: '2'

services:
service-registry:
image: sqshq/piggymetrics-registry
restart: always
networks:
- web
expose:
- "8761"
labels:
- "traefik.backend=service-registry-app"
- "traefik.frontend.rule=Host:service-registry-app.example.com"
environment:
CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD
config-server:
image: sqshq/piggymetrics-config
restart: always
networks:
- web
expose:
- "8888"
depends_on:
- service-registry
environment:
EUREKA_HOST: service-registry-app.example.com
EUREKA_PORT: 8761
CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD

labels:
- "traefik.backend=config-server-app"
- "traefik.frontend.rule=Host:config-server-app.example.com"
networks:
web:
external:
name: ana_network

我可以使用curl访问服务注册表应用程序

curl -H Host:service-registry-app.example.com http://172.21.0.2:8761

但是配置服务器和 API 网关无法使用 docker compose 和 traefik 访问具有上述配置的服务注册表。

我需要做哪些更改才能使所有微服务能够相互发现以及如何扩展它以使其在 ECS 上工作?

编辑1:

更正了将网络部分从服务移动到网络的缩进,这是一个拼写错误。

我是容器和分布式系统的新手,因此我可能会问一些天真的明显问题,因此如果任何 traefik 对于傻瓜来说会非常有帮助,那就太好了。

以下是我目前面临的两个问题,

1) 容器到容器的通信 - 示例,容器 2(本例中的配置服务器)应如何通过服务名称(如服务注册表)或任何其他方式与容器 1(服务注册表)进行通信,以及如何访问这些容器来自外部世界(在本例中为服务注册表)?

2) 扩展它以使其在 ECS 中工作,因此每个任务都将有自己的任务定义并作为 ECS 集群内的服务运行 - 在这种情况下,容器应如何使用 traefik 相互通信?

最佳答案

您的容器到容器网络似乎在多个地方被破坏。使用 traefik compose 文件,您可以定义一个网络,但不将其标记为外部,这样 compose 将创建一个其他项目看不到的 ${project}_ana_network 网络。通过将其标记为外部来修复此问题:

networks:
ana_network:
external:
name: ana_network

在第二个撰写文件中,您定义了一个 Web 服务,看起来您正在尝试定义一个 Web 网络,而这似乎是由于错误地缩进“网络”造成的。老实说,我不知道这将如何按照书面方式运行,因为不存在可供其他服务使用的“网络”网络。

对于 traefik 集成,我更喜欢不定义后端名称,而是指定网络名称和端口,这样 traefik 知道如何连接到容器,以防您在容器上定义多个网络或端口。

结果如下:

version: '2'

services:
service-registry:
image: sqshq/piggymetrics-registry
restart: always
networks:
- web
expose:
- "8761"
labels:
- "traefik.frontend.rule=Host:service-registry-app.example.com"
- "traefik.docker.network=ana_network"
- "traefik.port=8761"
environment:
CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD
config-server:
image: sqshq/piggymetrics-config
restart: always
networks:
- web
expose:
- "8888"
depends_on:
- service-registry
environment:
EUREKA_HOST: service-registry-app.example.com
EUREKA_PORT: 8761
CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD

labels:
- "traefik.backend=config-server-app"
- "traefik.frontend.rule=Host:config-server-app.example.com"

networks:
web:
external:
name: ana_network

最后,我还没有设置 Eureka 安装,但如果您希望容器直接通过容器网络进行通信,我建议使用:

EUREKA_HOST: service-registry

指定 traefik 列出的地址将从 docker 发出请求,通过 traefik 返回,从而添加不必要的跃点。

如果您需要将 EUREKA_HOST 设置为外部名称,但仍想使用容器到容器网络,那么您可以配置网络别名:

services:
service-registry:
...
networks:
web:
aliases:
- "service-registry-app.example.com"

关于docker - 微服务 使用 Eureka 和 traefik 与 docker compose 进行服务发现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48865187/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com