Перейти к содержимому
Главная страница » Как использовать Traefik v2 в качестве обратного прокси для контейнеров Docker в Ubuntu 20.04

Как использовать Traefik v2 в качестве обратного прокси для контейнеров Docker в Ubuntu 20.04

Автор выбрала Girls Who Code для получения пожертвования в рамках программы Write for DOnations.

Введение

Docker может быть эффективным способом запуска веб-приложений в рабочей среде, но вы можете захотеть запускать несколько приложений на одном хосте Docker. В этой ситуации вам необходимо настроить обратный прокси-сервер. Это потому, что вы хотите предоставить остальному миру доступ только к портам 80 и 443 .

Traefik — это обратный прокси-сервер с поддержкой Docker, который включает в себя панель мониторинга. Traefik v1 уже давно широко используется, и вы можете следовать этому предыдущему руководству, чтобы установить Traefik v1). Но в этом руководстве вы установите и настроите Traefik v2, который включает в себя немало отличий.

Самая большая разница между Traefik v1 и v2 заключается в том, что интерфейсные и серверные части были удалены, а их объединенная функциональность распределена по маршрутизаторам, промежуточному ПО и сервисам. Раньше серверная часть выполняла работу по внесению изменений в запросы и передаче этого запроса тому, кто должен был его обрабатывать. Traefik v2 обеспечивает большее разделение задач за счет внедрения промежуточного программного обеспечения, которое может изменять запросы перед отправкой их в службу. Промежуточное программное обеспечение упрощает указание одного шага модификации, который может использоваться множеством различных маршрутов, чтобы их можно было использовать повторно (например, базовая аутентификация HTTP, которую вы увидите позже). Маршрутизатор также может использовать множество различных промежуточных программ.

В этом руководстве вы настроите Traefik v2 для маршрутизации запросов в два разных контейнера веб-приложений: контейнер WordPress и контейнер администратора, каждый из которых обращается к базе данных MySQL. Вы настроите Traefik для обслуживания всего через HTTPS с помощью Let’s Encrypt.

Предварительные условия

Чтобы выполнить это руководство, вам понадобится следующее:

  • Один сервер Ubuntu 20.04 с пользователем sudo без полномочий root и брандмауэром. Вы можете настроить это, следуя нашему руководству по первоначальной настройке сервера Ubuntu 20.04.
  • Docker установлен на вашем сервере, что можно выполнить, выполнив Steps 1 and 2 статьи «Как установить и использовать Docker в Ubuntu 20.04».
  • Docker Compose установлен с использованием инструкций из Step 1 «Как установить Docker Compose в Ubuntu 20.04».
  • Домен и три записи A, db-admin. your_domain , blog. your_domain и monitor. your_domain . Каждый из них должен указывать на IP-адрес вашего сервера. Вы можете узнать, как указать домены на капли DigitalOcean, прочитав документацию DigitalOcean по доменам и DNS. В этом руководстве заменяйте your_domain своим доменом в файлах конфигурации и примерах.

Шаг 1 — Настройка и запуск Traefik

У проекта Traefik есть официальный образ Docker, поэтому вы будете использовать его для запуска Traefik в контейнере Docker.

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

Вы будете использовать утилиту htpasswd для создания этого зашифрованного пароля. Сначала установите утилиту, которая входит в пакет apache2-utils :

  1. sudo apt-get установить apache2-utils

Затем сгенерируйте пароль с помощью htpasswd . Замените secure_password паролем, который вы хотите использовать для администратора Traefik:

  1. htpasswd -nb администратор безопасный_пароль

Вывод программы будет выглядеть так:

Выход
администратор: $apr1$ruca84Hq$mbjdMZBAG.KWn7vfN/SNK/

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

Чтобы настроить сервер Traefik, вы создадите два новых файла конфигурации с именами traefik.toml и traefik_dynamic.toml , используя формат TOML. TOML — это язык конфигурации, аналогичный файлам INI, но стандартизированный. Эти файлы позволяют нам настроить сервер Traefik и различные интеграции или providers , которые вы хотите использовать. В этом руководстве вы будете использовать три доступных поставщика Traefik: api , docker и acme . Последний из них, acme , поддерживает сертификаты TLS с использованием Let's Encrypt.

Создайте и откройте traefik.toml с помощью nano или предпочитаемого вами текстового редактора:

  1. нано траэфик.томл

Во-первых, вы хотите указать порты, которые Traefik должен прослушивать, используя раздел entryPoints вашего файла конфигурации. Вам нужны два, потому что вы хотите прослушивать порты 80 и 443 . Давайте назовем их web (порт 80 ) и websecure (порт 443 ).

Добавьте следующие конфигурации:

traefik.toml
 [ entryPoints ] [ entryPoints.web ] address = ":80" [ entryPoints.web.http.redirections.entryPoint ] to = "websecure" scheme = "https" [ entryPoints.websecure ] address = ":443"

Обратите внимание, что вы также автоматически перенаправляете трафик для обработки через TLS.

Затем настройте api Traefik, который предоставит вам доступ как к API, так и к интерфейсу панели управления. Заголовок [api] — это все, что вам нужно, потому что панель мониторинга включена по умолчанию, но пока вы будете откровенны.

Добавьте следующий код:

traefik.toml
 . . . [ api ] dashboard = true

Чтобы завершить защиту ваших веб-запросов, вы хотите использовать Let's Encrypt для создания действительных сертификатов TLS. Traefik v2 поддерживает Let’s Encrypt «из коробки», и вы можете настроить его, создав преобразователь сертификатов типа acme .

Давайте теперь настроим ваш распознаватель сертификатов, используя имя lets-encrypt :

traefik.toml
 . . . [ certificatesResolvers.lets-encrypt.acme ] email = " your_email@your_domain " хранилище = "acme.json" [ certificatesResolvers.lets-encrypt.acme.tlsChallenge ]

Этот раздел называется acme , потому что ACME — это имя протокола, используемого для связи с Let's Encrypt для управления сертификатами. Служба Let's Encrypt требует регистрации с действительным адресом электронной почты, поэтому, чтобы Traefik генерировал сертификаты для ваших хостов, установите ключ email на свой адрес электронной почты. Затем вы указываете, что будете хранить информацию, полученную от Let's Encrypt, в файле JSON с именем acme.json .

Раздел acme.tlsChallenge позволяет нам указать, как Let's Encrypt может проверить сертификат. Вы настраиваете его для передачи файла в рамках вызова через порт 443 .

Наконец, вам необходимо настроить Traefik для работы с Docker.

Добавьте следующие конфигурации:

traefik.toml
 . . . [ providers.docker ] watch = true network = "web"

Поставщик docker позволяет Traefik выступать в качестве прокси-сервера перед контейнерами Docker. Вы настроили поставщика для watch новых контейнеров в web сети, которые вы скоро создадите.

В нашей окончательной конфигурации используется поставщик file . В Traefik v2 статические и динамические конфигурации невозможно смешивать и сопоставлять. Чтобы обойти эту проблему, вы будете использовать traefik.toml для определения статических конфигураций, а затем сохраните динамические конфигурации в другом файле, который вы назовете traefik_dynamic.toml . Здесь вы используете поставщик file , чтобы сообщить Traefik, что он должен читать динамические конфигурации из другого файла.

Добавьте следующий поставщик file :

traefik.toml
  1. [ провайдеры.файл ]
  2. имя файла = "traefik_dynamic.toml"

Ваш заполненный traefik.toml будет выглядеть так:

traefik.toml
 [ entryPoints ] [ entryPoints.web ] address = ":80" [ entryPoints.web.http.redirections.entryPoint ] to = "websecure" scheme = "https" [ entryPoints.websecure ] address = ":443" [ api ] dashboard = true [ certificatesResolvers.lets-encrypt.acme ] email = " your_email@your_domain " хранилище = "acme.json" [ certificatesResolvers.lets-encrypt.acme.tlsChallenge ] [ поставщики.докер ] смотреть = истинная сеть = "веб" [ поставщики.файл ] имя файла = "traefik_dynamic.toml"

Сохраните и закройте файл.

Теперь давайте создадим traefik_dynamic.toml .

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

Промежуточное программное обеспечение настраивается для каждого протокола, и, поскольку вы работаете с HTTP, вы укажете его как раздел, связанный с http.middlewares . Далее следует имя вашего промежуточного программного обеспечения, чтобы вы могли ссылаться на него позже, а затем тип промежуточного программного обеспечения, которым в данном случае будет basicAuth . Давайте назовем ваше промежуточное программное обеспечение simpleAuth .

Создайте и откройте новый файл с именем traefik_dynamic.toml :

  1. нано traefik_dynamic.toml

Добавьте следующий код. Сюда вы вставите вывод команды htpasswd :

traefik_dynamic.toml
 [ http.middlewares.simpleAuth.basicAuth ] users = [ "admin: $apr1$ruca84Hq$mbjdMZBAG.KWn7vfN/SNK/ " ]

Чтобы настроить маршрутизатор для API, вам снова придется объединить имя протокола, но вместо использования http.middlewares вы будете использовать http.routers , за которым следует имя маршрутизатора. В этом случае api предоставляет собственный именованный маршрутизатор, который вы можете настроить с помощью раздела [http.routers.api] . Вы также настроите домен, который планируете использовать со своей информационной панелью, установив ключ rule с использованием соответствия хоста, точку входа для использования websecure и промежуточное программное обеспечение для включения simpleAuth .

Добавьте следующие конфигурации:

traefik_dynamic.toml
 . . . [ http.routers.api ] rule = "Host(`monitor. your_domain `)" точки входа = [ "websecure" ] промежуточное программное обеспечение = [ "simpleAuth" ] service = "api@internal" [ http.routers.api.tls ] certResolver = "lets-encrypt"

Точка входа web обрабатывает порт 80 , а точка входа websecure использует порт 443 для TLS/SSL. Вы автоматически перенаправляете весь трафик через порт 80 на точку входа websecure , чтобы обеспечить безопасные соединения для всех запросов.

Обратите внимание, что последние три строки здесь настраивают службу, включают tls и настраивают certResolver на "lets-encrypt" . Услуги — это последний шаг к определению того, где в конечном итоге будет обработан запрос. Служба api@internal — это встроенная служба, которая находится за предоставляемым вами API. Так же, как маршрутизаторы и промежуточное программное обеспечение, в этом файле можно настроить службы, но вам не нужно этого делать для достижения желаемого результата.

Готовый файл traefik_dynamic.toml будет выглядеть следующим образом:

traefik_dynamic.toml
 [ http.middlewares.simpleAuth.basicAuth ] users = [ "admin: $apr1$ruca84Hq$mbjdMZBAG.KWn7vfN/SNK/ " ] [ http.routers.api ] rule = "Host(` monitor.your_domain `)" точки входа = [ "websecure" ] промежуточное программное обеспечение = [ "simpleAuth" ] service = "api@internal" [ http.routers.api.tls ] certResolver = "lets-encrypt"

Сохраните файл и выйдите из редактора.

Имея эти настройки, вы запустите Traefik.

Шаг 2 – Запуск контейнера Traefik

На этом этапе вы создадите сеть Docker, чтобы прокси-сервер мог совместно использовать ее с контейнерами. После этого вы получите доступ к панели управления Traefik. Сеть Docker необходима для того, чтобы вы могли использовать ее с приложениями, запускаемыми с помощью Docker Compose.

Создайте новую сеть Docker под названием web :

  1. создать сеть докеров сеть

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

Затем создайте пустой файл, в котором будет храниться ваша информация Let's Encrypt. Вы поместите это в контейнер, чтобы Traefik мог его использовать:

  1. коснитесь acme.json

Traefik сможет использовать этот файл только в том случае, если пользователь root внутри контейнера имеет уникальный доступ к нему на чтение и запись. Для этого заблокируйте разрешения для acme.json , чтобы только владелец файла имел разрешения на чтение и запись.

  1. chmod 600 acme.json

Как только файл будет передан в Docker, владелец автоматически изменится на пользователя root внутри контейнера.

Наконец, создайте контейнер Traefik с помощью этой команды:

  1. докер запустить -d
  2. -v /var/run/docker.sock:/var/run/docker.sock
  3. -v $PWD /traefik.toml:/traefik.toml
  4. -v $PWD /traefik_dynamic.toml:/traefik_dynamic.toml
  5. -v $PWD /acme.json:/acme.json
  6. -p 80 :80
  7. -p 443 :443
  8. --сетевая сеть
  9. --name траефик
  10. траефик: v2.2

Эта команда немного длинная. Давайте разберемся.

Вы используете флаг -d для запуска контейнера в фоновом режиме в качестве демона. Затем вы делитесь своим файлом docker.sock с контейнером, чтобы процесс Traefik мог прослушивать изменения в контейнерах. Вы также размещаете в контейнере файлы конфигурации traefik.toml и traefik_dynamic.toml , а также acme.json .

Затем вы сопоставляете порты :80 и :443 вашего хоста Docker с теми же портами в контейнере Traefik, чтобы Traefik получал весь трафик HTTP и HTTPS на сервер.

Вы устанавливаете сеть контейнера в web и называете контейнер traefik .

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

ENTRYPOINT образа Docker — это команда, которая всегда запускается при создании контейнера из образа. В данном случае команда представляет собой двоичный файл traefik внутри контейнера. Вы можете передать этой команде дополнительные аргументы при запуске контейнера, но все параметры вы настроили в файле traefik.toml .

После запуска контейнера у вас теперь есть панель мониторинга, к которой вы можете получить доступ, чтобы увидеть состояние ваших контейнеров. Вы также можете использовать эту панель мониторинга для визуализации маршрутизаторов, служб и промежуточного программного обеспечения, зарегистрированных Traefik. Вы можете попытаться получить доступ к панели мониторинга, указав в браузере https://monitor. your_domain /dashboard/ (после / обязателен).

Вам будет предложено ввести имя пользователя и пароль admin и пароль, который вы установили на шаге 1.

После входа в систему вы увидите интерфейс Traefik:

Пустая приборная панель Traefik

Вы заметите, что уже зарегистрировано несколько маршрутизаторов и служб, но это те, которые поставляются с Traefik и конфигурацией маршрутизатора, которую вы написали для API.

Теперь у вас запущен прокси-сервер Traefik, и вы настроили его для работы с Docker и мониторинга других контейнеров. На следующем шаге вы запустите несколько контейнеров для прокси-сервера Traefik.

Шаг 3 — Регистрация контейнеров в Traefik

Когда контейнер Traefik запущен, вы готовы запускать за ним приложения. Запустим за Traefik следующие контейнеры:

  1. Блог, использующий официальный образ WordPress.
  2. Сервер управления базой данных, использующий официальный образ Adminer.

Вы будете управлять обоими этими приложениями с помощью Docker Compose, используя файл docker-compose.yml .

Создайте и откройте файл docker-compose.yml в своем редакторе:

  1. нано docker-compose.yml

Добавьте в файл следующие строки, чтобы указать версию и сети, которые вы будете использовать:

docker-compose.yml
 version : "3" networks : web : external : true internal : external : false

Вы используете Docker Compose версии 3 , поскольку это новейшая основная версия формата файлов Compose.

Чтобы Traefik мог распознать ваши приложения, они должны быть частью одной сети, и, поскольку вы создали сеть вручную, вы подключаете ее, указав сетевое имя web и установив для параметра external значение true . Затем вы определяете другую сеть, чтобы можно было подключить открытые контейнеры к контейнеру базы данных, который вы не будете предоставлять через Traefik. Вы назовете эту сеть internal .

Далее вы определите каждую из своих services по одной. Начнем с контейнера blog , который вы создадите на основе официального образа WordPress. Добавьте эту конфигурацию в конец файла:

docker-compose.yml
 ... services : blog : image : wordpress : 4.9.8 - apache environment : WORDPRESS_DB_PASSWORD : labels : - traefik.http.routers.blog.rule=Host(`blog. your_domain `) - traefik.http.routers.blog.tls=true - traefik.http.routers.blog.tls.certresolver=lets - шифровать - traefik.port=80 сети : - внутренние - сеть зависит_он : - mysql

Ключ environment позволяет указать переменные среды, которые будут установлены внутри контейнера. Не устанавливая значение для WORDPRESS_DB_PASSWORD , вы указываете Docker Compose получить значение из вашей оболочки и передать его при создании контейнера. Вы определите эту переменную среды в своей оболочке перед запуском контейнеров. Таким образом, вы не будете жестко записывать пароли в файл конфигурации.

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

  • traefik.http.routers.adminer.rule=Host(``` blog. your_domain ```) создает новый маршрутизатор для вашего контейнера, а затем указывает правило маршрутизации, используемое для определения соответствия запроса этому контейнеру.
  • traefik.routers. custom_name .tls=true указывает, что этот маршрутизатор должен использовать TLS.
  • traefik.routers. custom_name .tls.certResolver=lets-encrypt указывает, что созданный вами ранее преобразователь сертификатов под названием lets-encrypt должен использоваться для получения сертификата для этого маршрута.
  • traefik.port указывает открытый порт, который Traefik должен использовать для маршрутизации трафика в этот контейнер.

В этой конфигурации весь трафик отправляется на ваш хост Docker через порт 80 или 443 с доменом blog. your_domain будет перенаправлен в контейнер blog .

Вы назначаете этот контейнер двум разным сетям, чтобы Traefik мог найти его через web сеть и взаимодействовать с контейнером базы данных через internal сеть.

Наконец, ключ depends_on сообщает Docker Compose, что этот контейнер необходимо запустить после запуска его зависимостей. Поскольку для работы WordPress требуется база данных, перед запуском контейнера blog необходимо запустить контейнер mysql .

Далее настройте службу MySQL:

docker-compose.yml
 services : ... MySQL : изображение : MySQL : 5.7 среда : MYSQL_ROOT_PASSWORD : сети : - внутренний этикетки : - traefik.enable=false

Для этого контейнера вы используете официальный образ MySQL 5.7. Вы заметите, что снова используете элемент environment без значения. Переменным MYSQL_ROOT_PASSWORD и WORDPRESS_DB_PASSWORD необходимо будет установить одно и то же значение, чтобы убедиться, что ваш контейнер WordPress может взаимодействовать с MySQL. Вы не хотите предоставлять контейнер mysql доступу к Traefik или внешнему миру, поэтому вы назначаете этот контейнер только internal сети. Поскольку у Traefik есть доступ к сокету Docker, процесс по-прежнему будет предоставлять маршрутизатор для контейнера mysql по умолчанию, поэтому вы добавите метку traefik.enable=false , чтобы указать, что Traefik не должен предоставлять этот контейнер.

Наконец, определите контейнер администратора:

docker-compose.yml
 services : ... администратор : изображение : администратор : 4.6.3  автономный этикетки : - traefik.http.routers.adminer.rule=Host(`db - admin.your_domain`) - traefik.http.routers.adminer.tls=true - traefik.http.routers.adminer.tls.certresolver=lets - шифровать - traefik.port=8080 сети : - внутренний - сеть зависит от : - MySQL

Этот контейнер основан на официальном образе Adminer. Конфигурация network и depends_on для этого контейнера точно соответствует тому, что вы используете для контейнера blog .

Строка traefik.http.routers.adminer.rule=Host(``` db-admin. your_domain ```) сообщает Traefik о необходимости проверки запрошенного хоста. Если он соответствует шаблону db-admin. your_domain , Traefik будет направлять трафик в контейнер adminer через порт 8080 .

Готовый файл docker-compose.yml будет выглядеть так:

docker-compose.yml
 version : "3" networks : web : external : true internal : external : false services : blog : image : wordpress : 4.9.8 - apache environment : WORDPRESS_DB_PASSWORD : labels : - traefik.http.routers.blog.rule=Host(`blog. `) - traefik.http.routers.blog.tls=true - traefik.http.routers.blog.tls.certresolver=lets - encrypt - traefik.port=80 сети : - внутренние - сеть зависит_он : - mysql mysql : изображение : mysql : среда 5.7 : MYSQL_ROOT_PASSWORD : сети : - внутренние метки : - traefik.enable=false adminer : изображение : adminer : 4.6.3 - автономные метки : метки : - traefik.http.routers.adminer.rule=Host(`db - админ. ваш_домен `) - traefik.http.routers.adminer.tls=true - traefik.http.routers.adminer.tls.certresolver=lets - шифровать - traefik.port=8080 сети : - внутренние - сеть зависит_он : - mysql

Сохраните файл и выйдите из текстового редактора.

Затем установите значения в вашей оболочке для переменных WORDPRESS_DB_PASSWORD и MYSQL_ROOT_PASSWORD :

  1. экспорт WORDPRESS_DB_PASSWORD = secure_database_password
  2. экспортировать MYSQL_ROOT_PASSWORD = secure_database_password

Замените secure_database_password желаемым паролем базы данных. Не забудьте использовать один и тот же пароль для WORDPRESS_DB_PASSWORD и MYSQL_ROOT_PASSWORD .

Установив эти переменные, запустите контейнеры с помощью docker-compose :

  1. докер-составить -d

Теперь наблюдайте за панелью администратора Traefik, пока она заполняется.

Заполненная панель управления Traefik

Если вы изучите раздел Routers , вы найдете маршрутизаторы для adminer и blog , настроенные с помощью TLS:

HTTP-маршрутизаторы с TLS

Перейдите в blog. your_domain , заменяя your_domain своим доменом. Вы будете перенаправлены на TLS-соединение, и теперь вы сможете завершить настройку WordPress:

Экран настройки WordPress

Теперь получите доступ к администратору, посетив db-admin. your_domain в браузере, снова заменив your_domain своим доменом. Контейнер mysql не доступен внешнему миру, но контейнер adminer имеет к нему доступ через internal сеть Docker, которую они используют совместно, используя имя контейнера mysql в качестве имени хоста.

На экране входа в систему администратора введите root для Username , введите mysql для Server и введите значение, которое вы установили для MYSQL_ROOT_PASSWORD для Password . Оставьте Database пустой. Теперь нажмите Login .

После входа в систему вы увидите пользовательский интерфейс администратора.

Администратор подключен к базе данных MySQL

Оба сайта теперь работают, и вы можете использовать панель мониторинга на monitor. your_domain , чтобы следить за вашими приложениями.

Заключение

В этом руководстве вы настроили Traefik v2 для проксирования запросов к другим приложениям в контейнерах Docker.

Декларативная конфигурация Traefik на уровне контейнера приложения позволяет легко настраивать дополнительные службы, и нет необходимости перезапускать контейнер traefik при добавлении новых приложений в прокси-трафик, поскольку Traefik немедленно замечает изменения через файл сокета Docker, который он отслеживает.

Чтобы узнать больше о том, что вы можете делать с Traefik v2, перейдите к официальной документации Traefik.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *