Как относительный докер и новичок в Traefik, я пытаюсь запустить Traefik с несколькими службами в отдельных файлах для создания докеров. Для иллюстрации первый сервис A — это простой веб-сервис (nginxdemos/hello) с дополнительной базой данных (postgres).
Мой traefik/docker-compose.yml выглядит следующим образом:
version: '3.8'
services:
traefik:
image: traefik:v2.10
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
- "8080:8080" # Traefik Dashboard
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
networks:
- web
networks:
web:
external: true
Service-A/docker-compose.yml выглядит следующим образом:
version: '3.8'
services:
service-a:
image: nginxdemos/hello
environment:
- DATABASE_URL=postgresql://user:password@service-a-db:5432/dbname
labels:
- "traefik.enable=true"
- "traefik.http.routers.service-a.rule=Host(`a.dock.er`)"
- "traefik.http.services.service-a.loadbalancer.server.port=80"
networks:
# - service-a-network
- web
ports:
- 9080:80 # just for testing
# depends_on:
# - service-a-db
service-a-db:
image: postgres:13
environment:
- POSTGRES_DB=dbname
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
networks:
- service-a-network
networks:
service-a-network:
internal: true
web:
external: true
В этой конфигурации сервис доступен через Traefik через A.dock.er.
Однако как только я добавляю дополнительную сеть «service-a-network» (а также опцию «dependents_on») в service-a, служба больше не доступна через Traefik (но все еще доступна через порт 9080).
Я теряюсь, что является причиной этого. Я считаю, что это должна быть правильная конфигурация с разделением внутренних подсервисов на отдельные сети и, таким образом, с наличием основного сервиса как в «публичной» сети Traefik, так и во внутренней сети.
Любая помощь будет принята с благодарностью.
Можете ли вы объединить все это в один файл Compose и удалить всю ручную networks:
настройку? Если все находится в одном файле, готовая сетевая настройка Compose должна работать нормально для приложений масштаба Compose.
Если у вас есть служба, подключенная к нескольким сетям, traefik увидит несколько IP-адресов этой службы... и выберет случайный адрес при попытке подключения. Это не сработает, если он выберет адрес в сети, к которой он не подключен.
Вы можете указать traefik, какую сеть использовать, установив метку traefik.docker.network
на сервисе с несколькими подключениями. Если мы перепишем service-a
вот так, он будет работать как положено:
services:
service-a:
image: nginxdemos/hello
environment:
- DATABASE_URL=postgresql://user:password@service-a-db:5432/dbname
labels:
- "traefik.enable=true"
- "traefik.http.routers.service-a.rule=Host(`a.dock.er`)"
- "traefik.http.services.service-a.loadbalancer.server.port=80"
- "traefik.docker.network=web"
networks:
- service-a-network
- web
При этом:
$ curl -s http://localhost -H Host:a.dock.er
<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
.
.
.
Независимо от вашего вопроса, использование вами
depends_on
фактически не имеет отношения к операции. Чтобы быть эффективным, вам необходимо использовать расширенную форму этой опции вместе с проверками работоспособности в контейнере базы данных.