<div><img src="https://top-fwz1.mail.ru/counter?id=3548135;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div>
Бесплатный перенос IT-инфраструктуры в облако

Использование Traefik в Docker в качестве реверс-прокси для других контейнеров Docker

Александр Бархатов
Александр Бархатов
Технический писатель
29 ноября 2024 г.
196
9 минут чтения
Средний рейтинг статьи: 4

Контейнеры 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.

Image5

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

Image7

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

Image1

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

Image4

6) Далее необходимо решить, будет ли сервер доступен из внешний сети или же только из приватной (частной) сети. Если не уверены в настройках, оставьте эти параметры без изменений.

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

Image11

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

9) Можно задать необходимое имя для сервера которое будет отображаться в панели управления, а также выбрать проект.

10) Для создания сервера необходимо нажать на кнопку «Заказать»:

Image3

Если на вашем аккаунте недостаточно средств, то будет выведено предупреждение о необходимости пополнить баланс. После оплаты и создания сервера откроется Дашборд сервера, где можно будет найти IP-адрес, логин и пароль для подключения.

cloud

Настройка и запуск Traefik

Для начала произведем настройку 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

Image13

  • 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

Image8

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

Image10

Запуск Traefik и приложений

Теперь переходим к запуску 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

Image15

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

docker-compose up -d

Проверяем статус запущенных контейнеров при помощи команды:

docker ps

Image6

У всех контейнеров должен быть статус Up.

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

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

curl -i app1.test.com

Image2

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

curl -i app2.test.com

Image12

Как можно увидеть, оба сервиса вернули ответ в виде ранее заданных ранее строк. 

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

Image5

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

Image3

Выгодные цены на облако в Timeweb Cloud

Заключение

Сегодня мы рассмотрели функционал Traefik на примере двух Nginx-сервисов. При помощи Traefik можно легко осуществлять проксирование для приложений, запускаемых в Docker-контейнерах.

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
29 ноября 2024 г.
196
9 минут чтения
Средний рейтинг статьи: 4
Пока нет комментариев