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

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

How To Use Traefik as a Reverse Proxy for Docker Containers on Ubuntu 18.04

Убунту 18.04

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

Note: Это руководство предназначено для Traefik v1. Если вы хотите установить и настроить Traefik v2, воспользуйтесь этим новым руководством.

Содержание

Введение

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

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

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

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

Шаг 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 , используя формат TOML. TOML — это язык конфигурации, аналогичный файлам INI, но стандартизированный. Этот файл позволяет нам настроить сервер Traefik и различные интеграции или провайдеров, которые мы хотим использовать. В этом руководстве мы будем использовать три доступных провайдера Traefik: api , docker и acme , который используется для поддержки TLS с помощью Let's Encrypt.

Откройте новый файл в nano или вашем любимом текстовом редакторе:

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

Сначала добавьте две именованные точки входа, http и https , к которым все серверные части будут иметь доступ по умолчанию:

traefik.toml
 defaultEntryPoints = [ "http" , "https" ]

Точки входа http и https мы настроим позже в этом файле.

Затем настройте поставщика api , который предоставит вам доступ к интерфейсу информационной панели. Сюда вы вставите вывод команды htpasswd :

traefik.toml
 . . . [ entryPoints ] [ entryPoints.dashboard ] address = ":8080" [ entryPoints.dashboard.auth ] [ entryPoints.dashboard.auth.basic ] users = [ " admin:ваш_зашифрованный_пароль " ] [ API ] входная точка = "панель мониторинга"

Панель мониторинга — это отдельное веб-приложение, которое будет работать в контейнере Traefik. Мы настроили панель управления для работы на порту 8080 .

Раздел entrypoints.dashboard настраивает способ подключения к поставщику api , а раздел entrypoints.dashboard.auth.basic настраивает базовую аутентификацию HTTP для панели мониторинга. Используйте выходные данные команды htpasswd , которую вы только что выполнили, в качестве значения записи users . Вы можете указать дополнительные логины, разделив их запятыми.

Мы определили нашу первую entryPoint , но нам нужно будет определить другие для стандартной связи HTTP и HTTPS, которая не направлена на провайдера api . В разделе entryPoints настраиваются адреса, которые могут прослушивать Traefik и прокси-контейнеры. Добавьте эти строки в файл под заголовком entryPoints :

traefik.toml
 . . . [ entryPoints.http ] address = ":80" [ entryPoints.http.redirect ] entryPoint = "https" [ entryPoints.https ] address = ":443" [ entryPoints.https.tls ] . . .

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

Затем добавьте этот раздел, чтобы настроить поддержку сертификатов Let's Encrypt для Traefik:

traefik.toml
 . . . [ acme ] email = " ваш_адрес электронной почты@ваш_домен " Storage = "acme.json" enterPoint = "https" onHostRule = true [ acme.httpChallenge ] enterPoint = "http"

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

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

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

Наконец, давайте настроим поставщика docker , добавив в файл следующие строки:

traefik.toml
 . . . [ docker ] domain = " ваш_домен " смотреть = истинная сеть = "сеть"

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

На этом этапе traefik.toml должен иметь следующее содержимое:

traefik.toml
 defaultEntryPoints = [ "http" , "https" ] [ entryPoints ] [ entryPoints.dashboard ] address = ":8080" [ entryPoints.dashboard.auth ] [ entryPoints.dashboard.auth.basic ] users = [ " admin:ваш_зашифрованный_пароль " ] [ EnterPoints.http ] адрес = ":80" [ EnterPoints.http.redirect ] EnterPoint = "https" [ EnterPoints.https ] адрес = ":443" [ EntryPoints.https.tls ] [ API ] точка входа = "панель мониторинга " [ acme ] электронная почта = " your_email@ваш_домен " Storage = "acme.json" enterPoint = "https" onHostRule = true [ acme.httpChallenge ] enterPoint = "http" [ docker ] домен = " your_domain " смотреть = истинная сеть = "сеть"

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

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

Затем создайте сеть Docker, чтобы прокси-сервер мог делиться ею с контейнерами. Сеть Docker необходима для того, чтобы мы могли использовать ее с приложениями, запускаемыми с помощью Docker Compose. Назовем эту сеть 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 /acme.json:/acme.json
  5. -p 80 :80
  6. -p 443 :443
  7. -l traefik.frontend.rule = Хост:monitor. ваш_домен
  8. -l traefik.port = 8080
  9. --сетевая сеть
  10. --name траефик
  11. траэфик:1.7-альпийский

Команда немного длинная, поэтому давайте разберем ее.

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

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

Затем мы настраиваем две метки Docker, которые сообщают Traefik направлять трафик на monitor. your_domain на порт :8080 в контейнере Traefik, открывая панель мониторинга.

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

Наконец, для этого контейнера мы используем образ traefik:1.7-alpine , поскольку он небольшой.

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

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

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

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

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

Теперь у нас есть работающий прокси-сервер Traefik, настроенный для работы с Docker и готовый к мониторингу других контейнеров 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
 version : "3" ... services : blog : image : wordpress : 4.9.8 - apache environment : WORDPRESS_DB_PASSWORD : labels : - traefik.backend=blog - traefik.frontend.rule=Host : blog. ваш_домен - traefik.docker.network=web - traefik.port=80 сети : - внутренние - сеть зависит_он : - mysql

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

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

  • traefik.backend указывает имя серверной службы в Traefik (которое указывает на фактический контейнер blog ).
  • traefik.frontend.rule=Host:blog. your_domain сообщает Traefik проверить запрошенный хост и соответствует ли он шаблону blog. your_domain , он должен направлять трафик в контейнер blog .
  • traefik.docker.network=web указывает, в какой сети Traefik будет искать внутренний IP-адрес для этого контейнера. Поскольку наш контейнер Traefik имеет доступ ко всей информации Docker, он потенциально может использовать IP-адрес internal сети, если мы не укажем это.
  • traefik.port указывает открытый порт, который Traefik должен использовать для маршрутизации трафика в этот контейнер.

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

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

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

Затем настройте службу MySQL, добавив эту конфигурацию в свой файл:

docker-compose.yml
 services : ... mysql : image : mysql : 5.7 environment : MYSQL_ROOT_PASSWORD : networks : - internal labels : - 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 : ... adminer : image : adminer : 4.6.3 - standalone labels : - traefik.backend=adminer - traefik.frontend.rule=Host : db - admin. ваш_домен - traefik.docker.network=web - traefik.port=8080 сети : - внутренние - сеть зависит_он : - mysql

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

Однако, поскольку мы направляем весь трафик на порт 80 на нашем хосте Docker непосредственно в контейнер blog , нам необходимо настроить этот контейнер по-другому, чтобы трафик попадал в наш контейнер adminer . Строка traefik.frontend.rule=Host:db-admin. your_domain сообщает Traefik проверить запрошенный хост. Если он соответствует шаблону db-admin. your_domain , Traefik направит трафик в контейнер adminer .

На этом этапе 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.backend=blog - traefik.frontend.rule=Host : blog. ваш_домен - traefik.docker.network=web - traefik.port=80 сети : - внутренние - сеть зависит_он : - mysql mysql : изображение : mysql : 5.7 среда : MYSQL_ROOT_PASSWORD : сети : - внутренние метки : - traefik.enable=false adminer : image : adminer : 4.6.3 - автономные ярлыки : - traefik.backend=adminer - traefik.frontend.rule=Хост : db - admin. ваш_домен - traefik.docker.network=web - 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. Вы увидите, что теперь есть backend и frontend для двух открытых серверов:

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

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

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

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

На экране входа администратора используйте имя пользователя root , используйте mysql в качестве server и значение, которое вы установили для MYSQL_ROOT_PASSWORD в качестве пароля. После входа в систему вы увидите пользовательский интерфейс администратора:

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

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

Заключение

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

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

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

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

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