Сценарий:
Я настроил docker -композиционную (v3
) среду с 3 пользовательскими docker микросервисами. Эти 3 микросервиса сбалансированы и направлены через traefik 2.x.
На моей локальной машине я использую службу подстановочных знаков dns / domain, например nip.io
, поэтому я могу использовать fqdn в локальной среде разработки. (это windows 10, и используется docker -desktop последняя версия)
Из моего браузера я теперь могу получить доступ к 3 микросервисам соответственно:
, но когда микросервисы пытаются подключиться друг с другом я получаю следующую ошибку:
Get https://m1.nip.io/api-call-test: dial tcp 127.0.0.1:443: connect: connection refused"
, что несколько ожидаемо, поскольку traefik прослушивает хост-машину через порт: 443, а не внутри docker, вызывая другой microservice.
Изменение запроса на https://m1/api-call-test
, поскольку это имя контейнера docker. но это означало бы, что я должен создать собственную логику c в своем коде, чтобы определить, работаю ли я локально в контейнере docker, не большая проблема, но я хотел бы избежать этого, если это возможно.
Чистое docker -композиционное решение, которое работает с traefik, было бы предпочтительным, если это возможно.
Пример файла компоновки docker, который у меня есть на данный момент:
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