Traefik v2 и Docker: развёртывание и практика
Быстрые ссылки
Getting Started
Starting Traefik
Routing Traffic
Adding SSL
Using the Dashboard
Заключение

Traefik — современный обратный прокси и балансировщик нагрузки для облачных и контейнеризированных сред. Он работает как edge-роутер и публикует ваши сервисы в сеть, динамически обнаруживая контейнеры и автоматически настраивая маршруты.
Определение: entrypoint — точка входа, на которой Traefik слушает трафик (порт/протокол). Providers — источники конфигурации (Docker, Kubernetes, file и т.д.).
Getting Started
Проще всего запускать Traefik как Docker-образ. В этом руководстве предполагается, что вы используете Docker. Альтернатива — одиночный бинарный файл для запуска вне Docker.
Перед стартом создайте файл конфигурации. Ниже — минимальный рабочий пример traefik.toml с двумя entrypoints (HTTP и HTTPS) и провайдером Docker. Комментарии поясняют смысл каждой секции.
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.http.redirections.entryPoint]
to = "https"
scheme = "https"
[entryPoints.https]
address = ":443"
[providers]
[providers.docker]
network = "traefik"Пояснения:
- entryPoints.http и entryPoints.https — слушают 80 и 443 порты.
- Правило редиректа перенаправляет HTTP на HTTPS; удалите секцию редиректа, если хотите разрешить обычный HTTP.
- providers.docker говорит Traefik следить за Docker и брать инструкции из меток контейнеров. Контейнеры должны быть в Docker-сети
traefik.
Создайте сеть:
docker network create traefikВажно: сеть должна быть одной для Traefik и всех проксируемых контейнеров.
Starting Traefik
Запустите контейнер Traefik, пробросив порты и смонтировав socket Docker, чтобы Traefik мог автоматом обнаруживать контейнеры.

Пример команды запуска (локальный демон):
docker run -d \
-p 80:80 \
-p 443:443 \
-v $PWD/traefik.toml:/traefik.toml \
-v /var/run/docker.sock:/var/run/docker.sock \
--name traefik \
--network traefik \
traefik:2.6Запустите тестовые сервисы, чтобы убедиться, что маршрутизация работает:
docker run -d \
--label traefik.http.routers.apache.rule=Host(`apache.example.com`) \
--name apache \
--network traefik \
httpd:latest
docker run -d \
--label traefik.http.routers.nginx.rule=Host(`nginx.example.com`) \
--name nginx \
--network traefik \
nginx:latestПроверьте DNS: apache.example.com и nginx.example.com должны указывать на IP хоста с Traefik. В браузере вы увидите дефолтные страницы Apache и NGINX.
Routing Traffic
Traefik поддерживает разные сопоставители (matchers): Host, Path, Headers, Method, Query, IP и т. д. Вы можете комбинировать их для сложных правил.
Пример middleware, добавляющего заголовок X-Proxied-By:
docker run -d \
--label traefik.http.routers.nginx.rule=Host(`nginx.example.com`) \
--label traefik.http.middlewares.demo.headers.customrequestheaders.X-Proxied-By=traefik \
--name nginx \
--network traefik \
nginx:latestПорт в контейнере по умолчанию берётся из Docker-образа (EXPOSE). Если приложение слушает на другом порту, задайте его в метке сервиса:
--label traefik.http.services.demo.loadbalancer.server.port=8080Советы по маршрутизации:
- Для REST API удобно использовать метод + путь (Method и PathPrefix).
- Для многодоменных приложений используйте HostRegexp.
- Для A/B тестирования применяйте заголовки и weighted services.
Adding SSL
Чтобы обеспечить HTTPS, используйте встроенную интеграцию с Let’s Encrypt (ACME). Добавьте в traefik.toml:
[certificatesResolvers.lets-encrypt.acme]
email = "you@example.com"
storage = "/acme.json"
[certificatesResolvers.lets-encrypt.acme.tlsChallenge]Пояснения:
- Замените email на свой, чтобы получать уведомления об истечении сертификатов.
storage— файл внутри контейнера для хранения сертификатов и учётных записей ACME. Файл должен быть создан на хосте с правами 600.tlsChallenge— один из методов верификации; он удобен, если доступ по HTTP ограничен.
Перезапустите контейнер Traefik, смонтировав acme.json:
docker run -d \
-p 80:80 \
-p 443:443 \
-v $PWD/acme.json:/acme.json \
-v $PWD/traefik.toml:/traefik.toml \
-v /var/run/docker.sock:/var/run/docker.sock \
--name traefik \
--network traefik \
traefik:2.6Важно: создайте acme.json и задайте права 600 (chmod 600 acme.json).
Using the Dashboard
Веб‑панель Traefik показывает маршруты, сервисы и провайдеры. Экспонируется как отдельный роут или на локальном порте 8080.

Пример статической секции для включения API/Dashboard в traefik.toml:
[api]
dashboard = true
[providers.file]
filename = "/traefik_dashboard.toml"Создайте файл traefik_dashboard.toml с маршрутом и базовой аутентификацией:
[http.middleware.dashboard_auth.basicAuth]
users = [
"admin:$2y$..."
]
[http.routers.api]
rule = "Host(`traefik.example.com`)"
entrypoints = ["https"]
middlewares = ["dashboard_auth"]
service = "api@internal"
[http.routers.api.tls]
certResolver = "lets-encrypt"Используйте htpasswd для генерации строки в формате bcrypt/MD5. Пример генерации:
sudo apt install apache2-utils
htpasswd -nbB admin your_password
# Вывод: admin:$2y$...Если вы хотите открыть панель только локально, можно опубликовать порт 8080 и включить insecure флаг (только для локальной отладки):
[api]
dashboard = true
insecure = trueЗапуск с портом 8080:
docker run -d \
-p 8080:8080 \
-p 80:80 \
-p 443:443 \
-v $PWD/acme.json:/acme.json \
-v $PWD/traefik.toml:/traefik.toml \
-v /var/run/docker.sock:/var/run/docker.sock \
--name traefik \
--network traefik \
traefik:2.6Важно: insecure = true не применять в продакшне.
Практические шаблоны меток (cheat sheet)
Часто используемые docker labels:
- traefik.http.routers.
.rule — правило маршрутизации (Host, Path). - traefik.http.routers.
.entrypoints — список entrypoints. - traefik.http.routers.
.middlewares — список middleware. - traefik.http.services.
.loadbalancer.server.port — порт сервиса. - traefik.docker.network — сеть контейнера (если отличается).
Пример для приложения на порту 8080:
docker run -d \
--label traefik.http.routers.app.rule=Host(`app.example.com`) \
--label traefik.http.services.app.loadbalancer.server.port=8080 \
--name app \
--network traefik \
myapp:latestКритерии приёмки
- Traefik контейнер запущен и отвечает на 80/443.
- DNS записи указывают на IP хоста.
- Let’s Encrypt успешно выдал сертификаты и
acme.jsonсодержит учётные записи. - Dashboard доступен и отображает роуты/сервисы.
Безопасность и соответствие (Security & Privacy)
Важно:
- Доступ к Docker socket (
/var/run/docker.sock) даёт полные права на Docker — рассматривайте запуск Traefik с ограниченными правами или использовать контейнерный runtime с изолированным интерфейсом. acme.jsonсодержит приватные ключи — храните файл с правами 600 и бэкапьте безопасно.- Dashboard требует аутентификации. Не выставляйте
insecure = trueна публичный интерфейс. - Логи и метрики могут содержать персональные данные — учитывайте требования GDPR при их хранении и экспорте.
Альтернативные подходы
Если Traefik не подходит, рассмотрите другие решения:
- NGINX (более зрелый, низкоуровневый контроль конфигурации).
- HAProxy (высокая производительность, богатые возможности балансировки).
- Envoy (мощный data‑plane для сервис‑меша).
Когда выбрать Traefik:
- Вы хотите динамическую интеграцию с Docker/Kubernetes.
- Нужна быстрая настройка HTTPS через Let’s Encrypt.
Когда он не подходит:
- Если необходима тонкая ручная оптимизация HTTP/2 или специфичные TCP‑фичи.
- В средах с жёсткими требованиями к аудиту доступа к Docker socket.
Ментальные модели и эвристики
- «Traefik — контроллер на границе» — он принимает входящий трафик и передаёт на внутренние сервисы.
- Сетевой трёхслой: edge (Traefik) → балансировка → варианты сервисов.
- Разделяй статическую и динамическую конфигурацию: Traefik v2 разделяет static (traefik.toml) и dynamic (providers/file).
Уровни зрелости развёртывания
- Минимальный (dev): Traefik + Docker локально, insecure dashboard, тестовые сертификаты.
- Производственный (prod): HTTPS через Let’s Encrypt, dashboard за BasicAuth, acme.json с резервным бэкапом.
- Высокая доступность (HA): несколько инстансов Traefik за внешним балансировщиком (или в Kubernetes с DaemonSet + service), синхронизация состояния, мониторинг и SLI/SLO.
Playbook: быстрый SOP для обновления Traefik
- Подготовка:
- Проверить current image tag (
traefik:2.6) и changelog. - Создать бэкап
traefik.tomlиacme.json.
- Проверить current image tag (
- Тестирование:
- Развернуть обновлённый образ на тестовом хосте с копией конфигурации.
- Проверить доступность сервисов и SSL.
- Обновление в проде:
- Отключить новые запросы на старый инстанс (через LB).
- Запустить новый контейнер с теми же томами/метками.
- Мониторить логи и метрики 5–15 минут.
- Откат:
- Если ошибка, остановить новый контейнер и запустить старый образ с бэкапом конфигурации.
Incident runbook и откат
Сценарий: после обновления Traefik перестал обслуживать HTTPS.
Шаги:
- Быстрый откат: запустите предыдущий образ с бэкапом конфигурации. Команда для запуска старой версии — как в разделе Starting Traefik, измените тег на предыдущую версию.
- Проверить
docker logs traefikдля ошибок ACME или проблем с Docker provider. - Убедиться, что
acme.jsonдоступен и имеет правильные права. - Если проблема в сертификатах, временно включите
insecure = trueна локальном порту 8080 для доступа к Dashboard и диагностике. - После фикса — перейти на обновлённый образ и повторить тесты.
Тесты и критерии приёмки
- Unit: конфигурация TOML валидна (парсер Traefik стартает без фатальных ошибок).
- Integration: при запуске контейнера Traefik отображает роуты в Dashboard.
- End-to-End: запросы к
https://app.example.comвозвращают корректный ответ и корректный сертификат от Let’s Encrypt. - Security: доступ к Dashboard требует аутентификации;
acme.jsonзащищён.
Сравнение: Traefik vs NGINX vs Envoy (кратко)
- Traefik: лучше для динамических сред, простая интеграция с Docker/K8s, автоматический ACME.
- NGINX: зрелый, гибкий, большой экосистемой модулей, но конфигурация менее динамичная.
- Envoy: ориентирован на сервис‑меши и сложные сценарии наблюдаемости.
Советы по миграции с Traefik v1 → v2
- Traefik v2 изменил модель: routers, services, middlewares — вместо старых frontend/backend.
- Перепишите метки и конфигурацию в новую модель:
traefik.http.routersиtraefik.http.services. - Тестируйте на стенде; локальный профиль
traefik:2.xполезен для проверки отличий.
Локальные альтернативы и подводные камни
- При использовании Docker Desktop на macOS/Windows пути к сокету отличаются — проверьте права доступа.
- Если контейнеры создаются в разных сетях, явно указывайте
--network traefik. - Watch out: динамическая конфигурация из file provider перезагружает маршруты — убедитесь, что файл валиден.
1‑строчный глоссарий
- Entrypoint: порт/точка входа (80/443).
- Router: правило маршрутизации (что соответствует запросу).
- Service: целевой набор бэкендов (контейнеры).
- Middleware: модификатор запроса (например, auth, headers).
- Provider: источник конфигурации (docker, file, kubernetes).
Decision flow (Mermaid)
flowchart TD
A[Нужна динамическая интеграция с Docker/K8s?] -->|Да| B[Использовать Traefik]
A -->|Нет| C[Нужен строгий low-level контроль?]
C -->|Да| D[Использовать NGINX]
C -->|Нет| E[Оценить Envoy/HAProxy]Заключение
Traefik — удобный инструмент для публикации контейнеризованных сервисов с автоматической маршрутизацией и встроенной поддержкой Let’s Encrypt. Он отлично подходит для сред, где сервисы запускаются и исчезают динамически. В статье мы прошли от базовой конфигурации до безопасности, плейбуков для обновления и сценариев отката.
Важно: это руководство покрывает базовые и средние сценарии. Для высокой доступности и критичных нагрузок дополнительно продумывайте HA‑архитектуру, мониторинг и резервные политики.
Ключевые выводы
- Traefik упрощает публикацию контейнеров и автоматизирует SSL.
- Всегда защищайте
acme.jsonи Docker socket. - Тестируйте обновления на стенде и имейте план отката.
Похожие материалы
Как освежить станции Pandora и управлять Thumbs
Как стримить на Twitch с Xbox
Исправить Video Memory Management Internal в Windows 11
Search indexing was turned off: решение в Windows 11