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

使用Eureka和traefik与docker compose进行微服务发现,docker,docker-compose,amazon-ecs,netflix-eureka,traefik,Docker,Docker Compose,Amazon Ecs,Netflix Eureka,Traefik,特莱菲克的傻瓜问题。我正在尝试使用docker compose使用traefik作为反向代理来设置spring云微服务 我的目标是,微服务应该通过服务名称(例如:service registry app)相互通信,traefik应该将其解析为ip地址。一旦它在本地机器中工作,我想将其扩展到在AWS ECS上运行 我已经使用创建了ana_网络 docker network create ana_network traefik配置: 文件:docker-compose.yml version: '

特莱菲克的傻瓜问题。我正在尝试使用docker compose使用traefik作为反向代理来设置spring云微服务

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

我已经使用创建了ana_网络

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
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
微服务配置: 文件: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
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访问service registry应用程序

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}\u ana_网络。通过使用以下标记将其标记为外部来修复:

networks:
  ana_network:
    external:
      name: ana_network
在第二个compose文件中,您定义了一个web服务,它看起来像是在试图定义一个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_主机设置为外部名称,但仍要使用容器到容器网络,则可以配置网络别名:

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

第二个撰写文件末尾的web部分试图做什么?看起来您想定义一个网络,但却定义了一个服务。谢谢您指出。在这里打字是打字错误。仍然面临同样的问题,我已经更新了我的问题。更正了缩进并更新了问题的更多细节。仍然无法访问另一个容器服务,请帮助。上面的答案建议的不仅仅是拼写错误更正。