Примеры использования обратного прокси Traefik
В этой заметке описываются практические примеры развертывания и использования обратного прокси Traefik и некоторых сервисов, которые он должен обслуживать, например, nginx.
Предварительные условия
Подразумевается, что Docker установлен и используется rootless.
Пример 1: traefik и nginx при помощи CLI
Здесь описывается способ, удобный для проверки работоспособности развертывания сервисов. Для постоянного использования и автоматизированного развертывания более удобным будет способ с применением docker-compose, описанный ниже.
Создайте отдельную сеть для внутреннего интерфейса Traefik и подключения веб-сервисов, находящихся за обратным прокси:
Запустите контейнер Traefik с одним провайдером (Docker) и доступностью веб-интерфейса по HTTP:
docker run -d --network=inner_net -p 80:80 -p 8080:8080 -v /run/user/1000/docker.sock:/var/run/docker.sock traefik --providers.docker --api.insecure=true
Запустите контейнер nginx, принимающий соединения через Traefik с указанием доменного имени веб-сервера в этом контейнере:
Обратите внимание, в значении
traefik.http.routers.nginx.rule=Host('FQDN')указывается имя сервиса по-умолчанию.nginx.(если вы запускаете сервис при помощи compose это имя может быть другим) и должно быть указано полное доменное имя, по которому Traefik будет маршрутизировать запросы из внешней сети. Таким образом вам будет нужно настроить либо ваш локальный/etc/hosts, либо сервер DNS для корректного разрешения имени.
Пример 2: запуск с помощью compose
Создайте сценарий сборки и запуска контейнера Traefik:
services:
traefik:
image: traefik
container_name: "traefik"
command:
- --api.insecure=true
- --providers.docker=true
ports:
- "80:80"
- "8080:8080"
volumes:
- /run/user/1000/docker.sock:/var/run/docker.sock:ro
networks:
- inner_net
networks:
inner_net:
name: inner_net
Обратите внимание на значения command: - они аналогичны используемым в примере 1. Также в этом примере создается сеть inner_net.
Теперь создайте сценарий для сборки и запуска контейнера nginx:
services:
nginx-rev:
image: nginx
container_name: nginx-rev
labels:
traefik.http.routers.nginx-rev.rule: "Host(`FQDN`)"
networks:
- inner_net
networks:
inner_net:
external: true
name: inner_net
В этом сценарии важно обратить внимание на имя сервиса (nginx-rev), которое используется и в качестве имени контейнера, и в метке подключения к обратному прокси (labels:). Также важно отметить наличие FQDN (о нем было сказано в примере 1) и подключение к уже созданной сценарием Traefik сети (external: true) с именем name: inner_net.