Вопрос или проблема
Как мне настроить 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, правильно изолировав контейнеры друг от друга. Прежде всего, убедитесь, что все сервисы подключены к нужным сетям и имеют заданные метки. Это обеспечит корректную работу и высокий уровень безопасности вашего приложения.