Гид по технологиям

Traefik v2 и Docker: развёртывание и практика

7 min read DevOps Обновлено 12 Dec 2025
Traefik v2 и Docker: развёртывание и практика
Traefik v2 и Docker: развёртывание и практика

Быстрые ссылки

  • Getting Started

  • Starting Traefik

  • Routing Traffic

  • Adding SSL

  • Using the Dashboard

  • Заключение

Логотип Traefik

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 мог автоматом обнаруживать контейнеры.

Скриншот: развертывание Traefik в Docker

Пример команды запуска (локальный демон):

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.

Скриншот веб‑панели Traefik

Пример статической секции для включения 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

  1. Подготовка:
    • Проверить current image tag (traefik:2.6) и changelog.
    • Создать бэкап traefik.toml и acme.json.
  2. Тестирование:
    • Развернуть обновлённый образ на тестовом хосте с копией конфигурации.
    • Проверить доступность сервисов и SSL.
  3. Обновление в проде:
    • Отключить новые запросы на старый инстанс (через LB).
    • Запустить новый контейнер с теми же томами/метками.
    • Мониторить логи и метрики 5–15 минут.
  4. Откат:
    • Если ошибка, остановить новый контейнер и запустить старый образ с бэкапом конфигурации.

Incident runbook и откат

Сценарий: после обновления Traefik перестал обслуживать HTTPS.

Шаги:

  1. Быстрый откат: запустите предыдущий образ с бэкапом конфигурации. Команда для запуска старой версии — как в разделе Starting Traefik, измените тег на предыдущую версию.
  2. Проверить docker logs traefik для ошибок ACME или проблем с Docker provider.
  3. Убедиться, что acme.json доступен и имеет правильные права.
  4. Если проблема в сертификатах, временно включите insecure = true на локальном порту 8080 для доступа к Dashboard и диагностике.
  5. После фикса — перейти на обновлённый образ и повторить тесты.

Тесты и критерии приёмки

  • 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.
  • Тестируйте обновления на стенде и имейте план отката.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как освежить станции Pandora и управлять Thumbs
Музыка

Как освежить станции Pandora и управлять Thumbs

Как стримить на Twitch с Xbox
Игры

Как стримить на Twitch с Xbox

Исправить Video Memory Management Internal в Windows 11
Windows

Исправить Video Memory Management Internal в Windows 11

Search indexing was turned off: решение в Windows 11
Windows

Search indexing was turned off: решение в Windows 11

Настроить часовой пояс в Slack
Продуктивность

Настроить часовой пояс в Slack

Запись дикторской дорожки в Premiere Pro
Аудиопроизводство

Запись дикторской дорожки в Premiere Pro