Docker compose&;traefik2&;自定义域路由到本地主机
情景: 我已经设置了一个docker compose(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
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