Контейнеры Docker позволяют легко и быстро развернуть необходимые сервисы и приложения. Однако с ростом используемых приложений, а также при необходимости запуска нескольких копий одного сервиса (особенно актуально при использовании микросервисной архитектуры) возникает потребность в распределении сетевого трафика. Для этих целей можно использовать Traefik — обратный прокси-сервер с открытым исходным кодом, разработанный специально для работы с Docker-контейнерами. Сегодня мы произведем настройку Traefik в качестве обратного прокси-сервера (reverse proxy) для нескольких приложений, запущенных в Docker-контейнере.
Предварительные требования
Для использования Traefik нам понадобится следующее:
-
Один сервер или одна виртуальная машина с любым предустановленным дистрибутивом Linux. Желательно выбрать Ubuntu, Debian, RHEL или SLES в связи с тем что заявлены в качестве поддерживаемых для системы контейнеризации Docker. Для них всегда выпускаются стабильные и актуальные версии Docker. Мы будем использовать Ubuntu 22.04.
-
Установленный Docker и Docker Compose. Процесс установки Docker и Docker Compose на Ubuntu описан в нашей инструкции. Также можно воспользоваться готовым образом с предустановленным Docker при создании облачного сервера. Для этого в разделе «Образ» необходимо перейти во вкладку «Маркетплейс» и найти образ с Docker.
В качестве используемых приложений будут запущены два контейнера с веб-сервером Nginx. При переходе по доменному имени каждого контейнера будет отображаться соответствующая строка. Создание контейнеров будет описано в отдельном разделе текущей статьи.
Создание облачного сервера
В первую очередь нам нужно арендовать облачный сервер.
1) Переходим на страницу авторизации и входим в аккаунт при помощи логина или адреса электронной почты и пароля или при помощи Passkey, ВКонтакте, GitHub, Google.
2) После успешной авторизации отобразится панель управления текущего проекта. Переходим в раздел «Облачные серверы» и нажимаем «Создать» или «Добавить».
3) Выбираем операционную систему, которая будет установлена на сервер. В нашем случае нам необходима Ubuntu версии 22.04.

Также в этом же разделе можно выбрать уже готовый образ с Docker, перейдя во вкладку «Маркетплейс»:

4) Выбираем регион, в котором будет находиться наш сервер. Выбирать рекомендуется тот регион, который ближе всего находится к вам физически. У каждого доступного региона справа вверху отображается ping, т.е. время, необходимое для передачи данных с вашего компьютера на сервер. Чем меньше указанное время, тем быстрее будет осуществляться передача данных.

5) Далее выбираем необходимую конфигурацию для сервера. Так как в данной статье будут рассмотрены Traefik и приложения без реальной нагрузки, то для конфигурации сервера можно выбрать минимальную конфигурацию, включающую в себя одноядерный процессор, 1 ГБ оперативной памяти и 15 ГБ места на NVMe-диске. В реальности вам необходимо выбирать ту конфигурацию, которая будет удовлетворять вашим потребностям при работе с контейнерными приложениями и их образами. Стоит отметить, что сам Docker потребляет минимум ресурсов. Расчет необходимой конфигурации происходит из той нагрузки, которую будет использовать контейнер. Выбираем соответствующий тариф:

6) Далее необходимо решить, будет ли сервер доступен из внешний сети или же только из приватной (частной) сети. Если не уверены в настройках, оставьте эти параметры без изменений.
7) По желанию можно оформить дополнительные услуги, включая резервные копии и защиту от DDoS-атак (последняя доступна только в Санкт-Петербурге и Москве):

8) Также заранее можно загрузить SSH-ключ, чтобы не входить на север при помощи пароля.
9) Можно задать необходимое имя для сервера которое будет отображаться в панели управления, а также выбрать проект.
10) Для создания сервера необходимо нажать на кнопку «Заказать»:

Если на вашем аккаунте недостаточно средств, то будет выведено предупреждение о необходимости пополнить баланс. После оплаты и создания сервера откроется Дашборд сервера, где можно будет найти IP-адрес, логин и пароль для подключения.
Облачные серверы
по всему миру с почасовой оплатой.
Настройка и запуск Traefik
Для начала произведем настройку Traefik.
1) Создаем директорию для хранения конфигурационных файлов и переходим в нее:
2) Внутри корневой директории проекта создадим три директории: одну для хранения конфигурационного файла Traefik, а две другие для хранения конфигурационных файлов приложений, которые будут использовать Traefik:
3) Создаем основной конфигурационный файл для Traefik с именем traefik.yml в ранее созданной директории traefik:
И вставляем следующий код:

entryPoints— точки входа (порт и протокол), через которые Traefik будет принимать запросы. Они определяют, на каком порту и IP-адресе сервис будет слушать трафик.
web— уникальное имя для точки входа, которое можно использовать для ее указания в маршрутах. В данном примере в качестве имени используется имяweb.address: ":80"— указывает, что точка входа будет принимать трафик на порту 80 (HTTP) на всех доступных сетевых интерфейсах в системе.
providers— источники информации о том, какие маршруты и сервисы нужно использовать (например, Docker, Kubernetes, файлы и т.д.).docker— включение и использование провайдера Docker. При использовании провайдераdockerTraefik автоматически обнаруживает запущенные контейнеры и маршруты к ним.exposedByDefault: false— отключает автоматическое добавление всех Docker-контейнеров как сервисов. Это делает конфигурацию намного безопаснее: только контейнеры с явным включением черезlabels(traefik.enable=true) будут маршрутизироваться (принимать и обрабатывать трафик).
api— содержит настройки административного API и встроенного веб-интерфейса мониторинга Traefik.dashboard: true— включает веб-панель мониторинга Traefik, при помощи которой можно отслеживать активные маршруты, точки входа и сервисы. Веб-панель не является обязательным компонентом и может быть выключена при помощи значенияfalse.insecure: true— позволяет получить доступ до веб-панели мониторинга по протоколу HTTP. Это удобно для тестирования и ознакомления с системой, однако небезопасно использовать в production-окружении. Чтобы использовать веб-панель только про защищенному протоколу HTTPS, необходимо указать значениеfalse.
Подготовка конфигурационных файлов для приложений
Теперь подготовим конфигурационные файлы для приложений, которые будут использовать Traefik в качестве обратного прокси-сервера. Для этого будут подняты два контейнера с Nginx. При переходе по адресу каждого контейнера будет отображаться соответствующее сообщение.
1) Создаем конфигурационный Nginx файл для первого приложения:
Содержимое:
В качестве имени сервера укажем локальное доменное имя app1.test.com. Можно указать как IP-адрес, так и доменное имя. Если у вас еще нет глобального доменного имени, можно вписать любое имя, которое будет доступно только на локальном уровне. Также необходимо прописать выбранный домен в файле /etc/hosts (будет рассмотрено далее).
Создаем директорию html, в которой будет храниться файл index.html для нашего первого приложения:
Запишем фразу «Welcome to App 1» в файл index.html при помощи перенаправления ввода:
2) Для второго приложения воспроизводим те же шаги, что и для первого, заменив значения для второго приложения:
Содержимое:
Для второго приложения также зададим локальное доменное имя.
Создаем директорию html, в которой будет храниться файл index.html для нашего второго приложения:
Запишем фразу «Welcome to App 2» в файл index.html при помощи перенаправления ввода:
Так как мы использовали локальные доменные имена, их необходимо заранее прописать в системе. Для этого открываем на редактирование файл hosts при помощи любого текстового редактора:
И прописываем ранее заданные локальные доменные имена:

Итоговая структура проекта выглядит следующим образом:

Запуск Traefik и приложений
Теперь переходим к запуску Traefik и приложений. Для этого в корневой директории проекта (test-traefik) создаем файл docker-compose.yml:
Вставляем следующую конфигурацию:
Для запуска контейнеров используем команду:

Если Docker Compose был установлен при помощи пакета docker-compose-plugin, то команда для запуска контейнеров будет следующей:
Проверяем статус запущенных контейнеров при помощи команды:

У всех контейнеров должен быть статус Up.
Проверим, смогут ли запущенные контейнеры с Nginx-сервисами принимать трафик. Для этого отправим запрос к доменным именам, используя утилиту curl.
Для первого приложения:

Для второго приложения:

Как можно увидеть, оба сервиса вернули ответ в виде ранее заданных ранее строк.
Также проверим веб-панель мониторинга Traefik. Для этого в браузере переходим по IP-адресу сервера и порту 8080:

В разделе «Routers» будут отображаться ранее заданные маршруты app1.test.com и app2.test.com:

Выгодные цены на облако в Timeweb Cloud
477 ₽/мес
657 ₽/мес
Заключение
Сегодня мы рассмотрели функционал Traefik на примере двух Nginx-сервисов. При помощи Traefik можно легко осуществлять проксирование для приложений, запускаемых в Docker-контейнерах.
