Главная страница » Как использовать Traefik в качестве обратного прокси для контейнеров Docker в Ubuntu 18.04
Как использовать Traefik в качестве обратного прокси для контейнеров Docker в Ubuntu 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.
Чтобы следовать этому руководству, вам понадобится следующее:
db-admin
, blog
и monitor
, каждая из которых указывает на IP-адрес вашего сервера. Вы можете узнать, как указать домены на капли DigitalOcean, прочитав документацию DigitalOcean по доменам и DNS. В этом руководстве заменяйте your_domain
своим доменом в файлах конфигурации и примерах.У проекта Traefik есть официальный образ Docker, поэтому мы будем использовать его для запуска Traefik в контейнере Docker.
Но прежде чем мы запустим и запустим наш контейнер Traefik, нам необходимо создать файл конфигурации и установить зашифрованный пароль, чтобы мы могли получить доступ к панели мониторинга.
Мы воспользуемся утилитой htpasswd
для создания этого зашифрованного пароля. Сначала установите утилиту, которая входит в пакет apache2-utils
:
- sudo apt-get установить apache2-utils
Затем сгенерируйте пароль с помощью htpasswd
. Замените secure_password
паролем, который вы хотите использовать для администратора Traefik:
- 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
или вашем любимом текстовом редакторе:
- нано траэфик.томл
Сначала добавьте две именованные точки входа, http
и https
, к которым все серверные части будут иметь доступ по умолчанию:
defaultEntryPoints = [ "http" , "https" ]
Точки входа http
и https
мы настроим позже в этом файле.
Затем настройте поставщика api
, который предоставит вам доступ к интерфейсу информационной панели. Сюда вы вставите вывод команды htpasswd
:
. . . [ 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
:
. . . [ 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:
. . . [ 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
, добавив в файл следующие строки:
. . . [ docker ] domain = "
ваш_домен " смотреть = истинная сеть = "сеть"
Поставщик docker
позволяет Traefik выступать в качестве прокси-сервера перед контейнерами Docker. Мы настроили провайдера для watch
новых контейнеров в web
сети (которые мы скоро создадим) и предоставления их как поддоменов your_domain
.
На этом этапе 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.
Затем создайте сеть Docker, чтобы прокси-сервер мог делиться ею с контейнерами. Сеть Docker необходима для того, чтобы мы могли использовать ее с приложениями, запускаемыми с помощью Docker Compose. Назовем эту сеть web
.
- создать сеть докеров сеть
Когда контейнер Traefik запустится, мы добавим его в эту сеть. Затем мы можем позже добавить дополнительные контейнеры в эту сеть, чтобы Traefik мог использовать их прокси.
Затем создайте пустой файл, в котором будет храниться информация Let’s Encrypt. Мы поместим это в контейнер, чтобы Traefik мог его использовать:
- трогать acme.json
Traefik сможет использовать этот файл только в том случае, если пользователь root внутри контейнера имеет уникальный доступ к нему на чтение и запись. Для этого заблокируйте разрешения для acme.json
, чтобы только владелец файла имел разрешения на чтение и запись.
- chmod 600 acme.json
Как только файл будет передан в Docker, владелец автоматически изменится на пользователя root внутри контейнера.
Наконец, создайте контейнер Traefik с помощью этой команды:
- докер запустить -d
- -v /var/run/docker.sock:/var/run/docker.sock
- -v $PWD /traefik.toml:/traefik.toml
- -v $PWD /acme.json:/acme.json
- -p 80 :80
- -p 443 :443
- -l traefik.frontend.rule = Хост:monitor. ваш_домен
- -l traefik.port = 8080
- --сетевая сеть
- --name траефик
- траэфик: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, настроенный для работы с Docker и готовый к мониторингу других контейнеров Docker. Давайте запустим несколько контейнеров, для которых Traefik будет выступать в качестве прокси.
Когда контейнер Traefik запущен, вы готовы запускать за ним приложения. Запустим за Traefik следующие контейнеры:
Мы будем управлять обоими этими приложениями с помощью Docker Compose, используя файл docker-compose.yml
. Откройте файл 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. Добавьте эту конфигурацию в файл:
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, добавив эту конфигурацию в свой файл:
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 не должен предоставлять этот контейнер.
Наконец, добавьте эту конфигурацию, чтобы определить контейнер администратора:
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
должен иметь следующее содержимое:
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
перед запуском контейнеров:
- экспорт WORDPRESS_DB_PASSWORD = secure_database_password
- экспортировать MYSQL_ROOT_PASSWORD = secure_database_password
Замените secure_database_password
желаемым паролем базы данных. Не забудьте использовать один и тот же пароль для WORDPRESS_DB_PASSWORD
и MYSQL_ROOT_PASSWORD
.
Установив эти переменные, запустите контейнеры с помощью docker-compose
:
- докер-составить -d
Теперь взгляните еще раз на панель администратора Traefik. Вы увидите, что теперь есть backend
и frontend
для двух открытых серверов:
Перейдите в blog. your_domain
, заменяя your_domain
своим доменом. Вы будете перенаправлены на соединение TLS и теперь сможете завершить настройку WordPress:
Теперь получите доступ к администратору, посетив db-admin. your_domain
в браузере, снова заменив your_domain
своим доменом. Контейнер mysql
не доступен внешнему миру, но контейнер adminer
имеет к нему доступ через internal
сеть Docker, которую они используют совместно, используя имя контейнера mysql
в качестве имени хоста.
На экране входа администратора используйте имя пользователя root , используйте mysql
в качестве server и значение, которое вы установили для MYSQL_ROOT_PASSWORD
в качестве пароля. После входа в систему вы увидите пользовательский интерфейс администратора:
Оба сайта теперь работают, и вы можете использовать панель мониторинга на monitor. your_domain
, чтобы следить за вашими приложениями.
В этом руководстве вы настроили Traefik для проксирования запросов к другим приложениям в контейнерах Docker.
Декларативная конфигурация Traefik на уровне контейнера приложения позволяет легко настраивать дополнительные службы, и нет необходимости перезапускать контейнер traefik
при добавлении новых приложений в прокси-трафик, поскольку Traefik немедленно замечает изменения через файл сокета Docker, который он отслеживает.
Чтобы узнать больше о том, что вы можете делать с Traefik, перейдите к официальной документации Traefik.