Контейнеры 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-адрес, логин и пароль для подключения.
cloud
Для начала произведем настройку Traefik.
1) Создаем директорию для хранения конфигурационных файлов и переходим в нее:
mkdir ~/test-traefik && cd ~/test-traefik
2) Внутри корневой директории проекта создадим три директории: одну для хранения конфигурационного файла Traefik, а две другие для хранения конфигурационных файлов приложений, которые будут использовать Traefik:
mkdir traefik app1 app2
3) Создаем основной конфигурационный файл для Traefik с именем traefik.yml
в ранее созданной директории traefik
:
nano traefik/traefik.yml
И вставляем следующий код:
entryPoints:
web:
address: ":80"
providers:
docker:
exposedByDefault: false
api:
dashboard: true
insecure: true
entryPoints
— точки входа (порт и протокол), через которые Traefik будет принимать запросы. Они определяют, на каком порту и IP-адресе сервис будет слушать трафик.web
— уникальное имя для точки входа, которое можно использовать для ее указания в маршрутах. В данном примере в качестве имени используется имя web
.address: ":80"
— указывает, что точка входа будет принимать трафик на порту 80 (HTTP) на всех доступных сетевых интерфейсах в системе.providers
— источники информации о том, какие маршруты и сервисы нужно использовать (например, Docker, Kubernetes, файлы и т.д.).
docker
— включение и использование провайдера Docker. При использовании провайдера docker
Traefik автоматически обнаруживает запущенные контейнеры и маршруты к ним.exposedByDefault: false
— отключает автоматическое добавление всех Docker-контейнеров как сервисов. Это делает конфигурацию намного безопаснее: только контейнеры с явным включением через labels
(traefik.enable=true
) будут маршрутизироваться (принимать и обрабатывать трафик).api
— содержит настройки административного API и встроенного веб-интерфейса мониторинга Traefik.
dashboard: true
— включает веб-панель мониторинга Traefik, при помощи которой можно отслеживать активные маршруты, точки входа и сервисы. Веб-панель не является обязательным компонентом и может быть выключена при помощи значения false
.insecure: true
— позволяет получить доступ до веб-панели мониторинга по протоколу HTTP. Это удобно для тестирования и ознакомления с системой, однако небезопасно использовать в production-окружении. Чтобы использовать веб-панель только про защищенному протоколу HTTPS, необходимо указать значение false
.Теперь подготовим конфигурационные файлы для приложений, которые будут использовать Traefik в качестве обратного прокси-сервера. Для этого будут подняты два контейнера с Nginx. При переходе по адресу каждого контейнера будет отображаться соответствующее сообщение.
1) Создаем конфигурационный Nginx файл для первого приложения:
nano app1/default.conf
Содержимое:
server {
listen 80;
server_name app1.test.com;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
В качестве имени сервера укажем локальное доменное имя app1.test.com
. Можно указать как IP-адрес, так и доменное имя. Если у вас еще нет глобального доменного имени, можно вписать любое имя, которое будет доступно только на локальном уровне. Также необходимо прописать выбранный домен в файле /etc/hosts
(будет рассмотрено далее).
Создаем директорию html
, в которой будет храниться файл index.html
для нашего первого приложения:
mkdir app1/html
Запишем фразу «Welcome to App 1» в файл index.html
при помощи перенаправления ввода:
echo "<h1>Welcome to App 1</h1>" > app1/html/index.html
2) Для второго приложения воспроизводим те же шаги, что и для первого, заменив значения для второго приложения:
nano app2/default.conf
Содержимое:
server {
listen 80;
server_name app2.test.com;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
Для второго приложения также зададим локальное доменное имя.
Создаем директорию html
, в которой будет храниться файл index.html
для нашего второго приложения:
mkdir app2/html
Запишем фразу «Welcome to App 2» в файл index.html
при помощи перенаправления ввода:
echo "<h1>Welcome to App 2</h1>" > app2/html/index.html
Так как мы использовали локальные доменные имена, их необходимо заранее прописать в системе. Для этого открываем на редактирование файл hosts
при помощи любого текстового редактора:
nano /etc/hosts
И прописываем ранее заданные локальные доменные имена:
127.0.0.1 app1.test.com
127.0.0.1 app2.test.com
Итоговая структура проекта выглядит следующим образом:
Теперь переходим к запуску Traefik и приложений. Для этого в корневой директории проекта (test-traefik
) создаем файл docker-compose.yml
:
nano docker-compose.yml
Вставляем следующую конфигурацию:
version: "3.9"
services:
traefik:
image: traefik:v2.10
container_name: traefik
restart: always
command:
- "--configFile=/etc/traefik/traefik.yml"
ports:
- "80:80"
- "8080:8080"
volumes:
- "./traefik/traefik.yml:/etc/traefik/traefik.yml"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
app1:
image: nginx:1.26-alpine
container_name: nginx-app1
restart: always
volumes:
- "./app1/default.conf:/etc/nginx/conf.d/default.conf"
- "./app1/html:/usr/share/nginx/html"
labels:
- "traefik.enable=true"
- "traefik.http.routers.app1.rule=Host(`app1.test.com`)"
- "traefik.http.services.app1.loadbalancer.server.port=80"
app2:
image: nginx:1.26-alpine
container_name: nginx-app2
restart: always
volumes:
- "./app2/default.conf:/etc/nginx/conf.d/default.conf"
- "./app2/html:/usr/share/nginx/html"
labels:
- "traefik.enable=true"
- "traefik.http.routers.app2.rule=Host(`app2.test.com`)"
- "traefik.http.services.app2.loadbalancer.server.port=80"
Для запуска контейнеров используем команду:
docker compose up -d
Если Docker Compose был установлен при помощи пакета docker-compose-plugin
, то команда для запуска контейнеров будет следующей:
docker-compose up -d
Проверяем статус запущенных контейнеров при помощи команды:
docker ps
У всех контейнеров должен быть статус Up.
Проверим, смогут ли запущенные контейнеры с Nginx-сервисами принимать трафик. Для этого отправим запрос к доменным именам, используя утилиту curl
.
Для первого приложения:
curl -i app1.test.com
Для второго приложения:
curl -i app2.test.com
Как можно увидеть, оба сервиса вернули ответ в виде ранее заданных ранее строк.
Также проверим веб-панель мониторинга Traefik. Для этого в браузере переходим по IP-адресу сервера и порту 8080:
В разделе «Routers» будут отображаться ранее заданные маршруты app1.test.com
и app2.test.com
:
Выгодные цены на облако в Timeweb Cloud
Сегодня мы рассмотрели функционал Traefik на примере двух Nginx-сервисов. При помощи Traefik можно легко осуществлять проксирование для приложений, запускаемых в Docker-контейнерах.