Docker compose&;traefik2&;自定义域路由到本地主机

Docker compose&;traefik2&;自定义域路由到本地主机,docker,networking,docker-compose,traefik,Docker,Networking,Docker Compose,Traefik,情景: 我已经设置了一个docker compose(v3)环境,其中包含3个自定义docker微服务。这3个微服务是负载平衡的,并通过traefik 2.x路由 在本地计算机上,我使用通配符dns/域服务,如nip.io,以便在本地开发环境中使用fqdn。(这是windows 10,使用docker desktop最新版本) 现在,我可以通过浏览器适当地访问3个微服务: 但是,当微服务尝试相互连接时,我得到以下错误: Gethttps://m1.nip.io/api-call-tes

情景:

我已经设置了一个docker compose(
v3
)环境,其中包含3个自定义docker微服务。这3个微服务是负载平衡的,并通过traefik 2.x路由

在本地计算机上,我使用通配符dns/域服务,如
nip.io
,以便在本地开发环境中使用fqdn。(这是windows 10,使用docker desktop最新版本)

现在,我可以通过浏览器适当地访问3个微服务:

但是,当微服务尝试相互连接时,我得到以下错误:

Gethttps://m1.nip.io/api-call-test: 拨打tcp 127.0.0.1:443:连接:连接被拒绝“

这在某种程度上是意料之中的,因为traefik正在端口443上的主机上侦听,而不是在调用其他微服务的docker内部

将请求更改为
https://m1/api-call-test
因为这是docker容器的名称。但这意味着我必须在代码中构建自定义逻辑,以检测我是否在docker容器中本地运行,这不是一个大问题,但我希望尽可能避免这种情况

如果可能,最好使用与traefik一起工作的纯docker compose解决方案

我目前拥有的docker compose文件示例:

version: '3'

services:

  traefik:
    image: traefik:v2.1
    container_name: traefik
    restart: always
    ports:
      - 443:443
      - 80:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./docker/traefik/traefik.toml:/etc/traefik/traefik.toml
      - ./docker/traefik/traefik.config.toml:/etc/traefik/traefik.config.toml
      - ./docker/certs/public.pem:/certs/public.pem
      - ./docker/certs/private.pem:/certs/private.pem
    labels:
      - traefik.enable=true
      - traefik.http.routers.traefik.rule=Host(`traefik.nip.io`)
      - traefik.http.routers.traefik.entrypoints=websecure
      - traefik.http.routers.traefik.tls=true
      # global redirect router, only need to define this once
      - traefik.http.services.traefik.loadbalancer.server.port=8080
      - traefik.http.routers.https-redirect.rule=HostRegexp(`{any:.*}`)
      - traefik.http.routers.https-redirect.middlewares=redirect@file
      - traefik.http.routers.https-redirect.service=api@internal

  m1:
    image: golang:alpine
    container_name: m1
    restart: always
    volumes :
      - ./microservices/m1:/go/src/microservices/m1
      # cache build files
      - go-cache:/go/pkg
    working_dir:/go/src/microservices/m1
    env_file:
      - ./docker/main.env
    ports:
      - 9100:9100
    links:
      - db:db
      - redis:redis
    command: sh -c "go build -o deploy/m1.exe && ./deploy/m1.exe"
    labels:
      - traefik.enable=true
      - traefik.http.routers.m1.rule=Host(`m1.nip.io`)
      - traefik.http.routers.m1.entrypoints=websecure
      - traefik.http.routers.m1.tls=true
      - traefik.http.services.m1.loadbalancer.server.port=9100

  m2:
    image: golang:alpine
    container_name: m2
    restart: always
    volumes :
      - ./microservices/m1:/go/src/microservices/m2
      # cache build files
      - go-cache:/go/pkg
    working_dir:/go/src/microservices/m2
    env_file:
      - ./docker/main.env
    ports:
      - 9200:9200
    links:
      - db:db
      - redis:redis
    command: sh -c "go build -o deploy/m2.exe && ./deploy/m2.exe"
    labels:
      - traefik.enable=true
      - traefik.http.routers.m2.rule=Host(`m2.nip.io`)
      - traefik.http.routers.m2.entrypoints=websecure
      - traefik.http.routers.m2.tls=true
      - traefik.http.services.m2.loadbalancer.server.port=9200

  m3:
    image: golang:alpine
    container_name: sso
    restart: always
    volumes :
      - ./microservices/m3:/go/src/microservices/m3
      # cache build files
      - go-cache:/go/pkg
    working_dir:/go/src/microservices/m3
    env_file:
      - ./docker/main.env
    ports:
      - 9300:9300
    links:
      - db:db
      - redis:redis
    command: sh -c "go build -o deploy/m3.exe && ./deploy/m3.exe"
    labels:
      - traefik.enable=true
      - traefik.http.routers.m3.rule=Host(`m3.nip.io`)
      - traefik.http.routers.m3.entrypoints=websecure
      - traefik.http.routers.m3.tls=true
      - traefik.http.services.m3.loadbalancer.server.port=9300