Перейти к содержанию

Примеры использования обратного прокси Traefik

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

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

Подразумевается, что Docker установлен и используется rootless.

Пример 1: traefik и nginx при помощи CLI

Здесь описывается способ, удобный для проверки работоспособности развертывания сервисов. Для постоянного использования и автоматизированного развертывания более удобным будет способ с применением docker-compose, описанный ниже.

Создайте отдельную сеть для внутреннего интерфейса Traefik и подключения веб-сервисов, находящихся за обратным прокси:

docker network create inner_net

Запустите контейнер 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 с указанием доменного имени веб-сервера в этом контейнере:

docker run -d --network=inner_net --label 'traefik.http.routers.nginx.rule=Host(`FQDN`)' nginx

Обратите внимание, в значении 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.