Traefik со службой в отдельном файле docker-compose перестает работать при использовании нескольких сетей

Как относительный докер и новичок в 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, так и во внутренней сети.

Любая помощь будет принята с благодарностью.

Независимо от вашего вопроса, использование вами depends_on фактически не имеет отношения к операции. Чтобы быть эффективным, вам необходимо использовать расширенную форму этой опции вместе с проверками работоспособности в контейнере базы данных.

larsks 19.05.2024 14:38

Можете ли вы объединить все это в один файл Compose и удалить всю ручную networks: настройку? Если все находится в одном файле, готовая сетевая настройка Compose должна работать нормально для приложений масштаба Compose.

David Maze 19.05.2024 16:57
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
2
129
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если у вас есть служба, подключенная к нескольким сетям, 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>
.
.
.

Другие вопросы по теме