Traefik в качестве обратного прокси для нескольких стеков Docker

Вопрос или проблема

Как мне настроить Traefik и мои контейнеры так, чтобы один контейнер Traefik мог выполнять обратный прокси для всех остальных контейнеров, но при этом оставлять другие контейнеры изолированными друг от друга?

Я пробовал следующую конфигурацию с контейнером Pi-hole, но Traefik, похоже, не “видит” мой контейнер Pi-hole. Хотя Traefik отображается в той же сети “dns_default” вместе с Pi-hole. “dns.test.com” заменяет мой действительный домен – все работает отлично, когда я использую acme-lego в автономном режиме.

Стек Traefik:

services:

  traefik:
    image: "traefik:v3.1"
    container_name: "traefik"
    command:
      #- "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entryPoints.web.address=:80"
      - "--entryPoints.websecure.address=:443"
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--certificatesresolvers.letsencrypt.acme.dnschallenge=true"
      - "--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=ionos"
      #- "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "[email protected]"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    environment:
      - "IONOS_API_KEY=KEY"
    volumes:
      - "/opt/appdata/traefik/letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    networks:
      - default
      - dns_default

networks:
  dns_default:
    external: true

Стек Pi-hole (называется “dns”):

services:

  pihole:
    image: pihole/pihole:latest
    container_name: "pihole"
    restart: unless-stopped
    hostname: dns
    external_links:
        - unbound:unbound
    depends_on:
      unbound:
        condition: service_started
    ports:
      - "88:80/tcp"    
      - "53:53/tcp"
      - "53:53/udp"
      - "8443:443/tcp"
    volumes:
      - /opt/appdata/pihole_unbound/pihole:/etc/pihole
      - /opt/appdata/acme-lego-cron:/letsencrypt
    environment:
      TZ: 'Europe/Berlin'
      CUSTOM_CACHE_SIZE: 0
      DNS1: unbound#5533
      DNS2: no
      DNSMASQ_LISTENING: all
    healthcheck:
      disable: true
    labels:
      - "traefik.http.routers.pihole.rule=Host(`dns.test.com`)"
      - "traefik.http.routers.pihole.entrypoints=websecure"
      - "traefik.http.routers.pihole.tls=true"
      - "traefik.http.routers.pihole.tls.certresolver=letsencrypt"
      - "traefik.http.routers.pihole.tls.domains[0].main=dns.test.com"
      - "traefik.http.routers.pihole.tls.domains[0].sans=dns.test.com"
      - "traefik.http.services.pihole.loadbalancer.server.port=88"

...

Ответ или решение

Настройка Traefik в качестве обратного прокси для нескольких стеков Docker

Введение

Traefik представляет собой мощный инструмент, который позволяет работать в качестве обратного прокси-сервера для контейнеров Docker. Его гибкость позволяет направлять трафик различных доменов на разные контейнеры, при этом изолируя их друг от друга. В данной статье мы рассмотрим, как правильно настроить Traefik и контейнеры Docker, чтобы обеспечить эффективную работу с учетом изоляции.

Шаг 1: Настройка сети Docker

Для обеспечения изоляции контейнеров, важно создать отдельные сети для каждого из стеков. Например, можно создать сети traefik и dns, а затем подключить контейнеры только к нужной сети:

networks:
  traefik:
    driver: bridge
  dns:
    driver: bridge

Шаг 2: Конфигурация Traefik

Ваш стек с Traefik почти правильно настроен. Важно удостовериться, что Traefik видит контейнеры, находящиеся в другой сети. Обратите внимание, что exposedbydefault установлен в false, что означает, что вы должны явно указывать, какие контейнеры должны быть доступны через Traefik. Чтобы это сделать, вам нужно будут добавить правильные метки (labels) в сервисы, которые вы хотите проксировать.

Пример конфигурации для Traefik:

services:
  traefik:
    image: "traefik:v3.1"
    container_name: "traefik"
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entryPoints.web.address=:80"
      - "--entryPoints.websecure.address=:443"
      - "--certificatesResolvers.letsencrypt.acme.dnsChallenge=true"
      - "--certificatesResolvers.letsencrypt.acme.dnsChallenge.provider=ionos"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - "/opt/appdata/traefik/letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    networks:
      - traefik

Шаг 3: Конфигурация контейнеров приложения

В вашем случае pihole также должен быть настроен для работы в соответствующей сети и имеет необходимые метки, чтобы быть доступным для Traefik:

services:
  pihole:
    image: pihole/pihole:latest
    container_name: "pihole"
    restart: unless-stopped
    networks:
      - dns
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.pihole.rule=Host(`dns.test.com`)"
      - "traefik.http.routers.pihole.entrypoints=websecure"
      - "traefik.http.routers.pihole.tls=true"
      - "traefik.http.routers.pihole.tls.certresolver=letsencrypt"
      - "traefik.http.services.pihole.loadbalancer.server.port=80"

Убедитесь, что контейнер pihole подключен к сети dns, которая не пересекается с сетью Traefik.

Шаг 4: Проверьте Docker Compose

После внесения всех изменений в ваши Docker Compose файлы, выполните команды для пересоздания стека Traefik и pihole:

docker-compose -f traefik.yml up -d
docker-compose -f pihole.yml up -d

Шаг 5: Проверка работоспособности

После запуска контейнеров проверьте их статус командой docker ps. Далее убедитесь, что в логах Traefik нет ошибок и что он корректно видит pihole. Войдите в интерфейс управления Traefik (доступный по адресу http://YOUR_TRAEFIK_IP:8080) и проверьте наличие вашего маршрута.

Заключение

Используя приведенные шаги, вы сможете настроить Traefik как обратный прокси для нескольких стеков Docker, правильно изолировав контейнеры друг от друга. Прежде всего, убедитесь, что все сервисы подключены к нужным сетям и имеют заданные метки. Это обеспечит корректную работу и высокий уровень безопасности вашего приложения.

Оцените материал
Добавить комментарий

Капча загружается...