微服务:使用Eureka和Traefik进行服务发现的Docker Compose配置

4

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

但是使用docker compose和traefik进行配置服务器和api网关无法访问服务注册表。

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

编辑1:

更正缩进,将网络部分从服务移动到网络中,这是一个笔误。

我是一个新手,对容器和分布式系统不太熟悉,因此我可能会问一些幼稚的问题,如果有任何针对traefik的入门指南,那将非常有帮助。

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

1)容器之间的通信 - 例如,容器2(在本例中为配置服务器)应如何通过服务名称(如service-registry)或其他方式与容器1(service-registry)通信,并如何从外部世界访问这些容器(在本例中为服务注册表)?

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


你第二个compose文件末尾的web部分是想做什么?看起来你想定义一个网络,但却定义了一个服务。 - BMitch
谢谢指出。这是我在打字时的笔误。我仍然面临同样的问题,我已经更新了我的问题。 - menneni
1个回答

1
您的容器到容器网络似乎在多个地方出现了问题。使用traefik compose文件,您定义了一个网络,但没有将其标记为外部网络,因此compose会创建一个其他项目看不到的${project}_ana_network网络。通过将其标记为外部网络来解决这个问题:
networks:
  ana_network:
    external:
      name: ana_network

在您的第二个compose文件中,您定义了一个Web服务,看起来像是您正在尝试定义Web网络,并且这似乎是由于"networks"缩进不正确引起的。老实说,我甚至不知道如何按照所写的方式运行,因为"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"

已更正缩进并更新问题的详细信息。仍无法访问另一个容器服务,请帮忙。 - menneni
以上的答案建议不仅仅是更正了那个打字错误。 - BMitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接