После того, как мы запустили traefik, можно запускать микросервисы и настраивать доступ к ним через reverse proxy.
К примеру, поднимем 2 контейнера с nginx, описанных в docker-compose-nginx.yml, каждый из которых слушает обращения на 80 порту:
version: "3.7"
services:
nginx_1: # Просто имя контейнера
image: nginx:alpine # Докер образ - используем alpine, как самый легковесный. Его хватит для наших задач
volumes:
- ./nginx/site_1.conf:/etc/nginx/conf.d/default.conf # Пробрасываем конфиг первого сайта
- ./nginx/index_1.html:/var/www/html/index.html # Пробрасываем сам сайт, который представлен статическим контентом
labels:
- "traefik.enable=true" # Говорим, что траефик должен обслуживать данный контейнер
- "traefik.http.routers.nginx_1.entrypoints=http" # Говорим, что наш сайт будет доступен через точку входа http (описание см. ниже)
- "traefik.http.routers.nginx_1.rule=Host(`site_1.example.com`)" # Говорим, что на этот контейнер траефику надо направлять запросы, которые приходят на адрес site_1.example.com
# Ниже аналогично для второго контейнера.
# Конфигурации ./nginx/site_1.conf и ./nginx/site_2.conf одинаковы и называются по разному просто для наглядности
# Состав файлов ./nginx/index_1.html и ./nginx/index_2.html не важен, пример будет ниже.
nginx_2:
image: nginx:alpine
volumes:
- ./nginx/site_2.conf:/etc/nginx/conf.d/default.conf
- ./nginx/index_2.html:/var/www/html/index.html
labels:
- "traefik.enable=true"
- "traefik.http.routers.nginx_2.entrypoints=http"
- "traefik.http.routers.nginx_2.rule=Host(`site_2.example.com`)"
После того, как мы запустим эти контейнеры командой:
docker-compose -f docker-compose-nginx.yml up -d
в нашем дашборде traefik появятся 2 правила:
Host(`site_1.example.com`)
Host(`site_2.example.com`)
Если нажать на любое из них, то мы попадем в описание правила:
На этом скриншоте видно, что запрос, пришедший на 80 порт сайта site_1.example.com проходит в соответствии с правилами на сервис, поднятый в контейнере nginx-1.
А ниже видно, что конечный сервис поднят в docker контейнере, видно правило, на основании которого движется трафик и куда.
В разделе с TLS пусто, так как мы его не настраивали (но там можно настраивать сертификаты, в т.ч. с Let's Encrypt).
В разделе Middlewares, который предназначен, в частности, для защиты содержимого с помощью basic authentification и это описано тут, тоже пусто по той же причине - такой задачи в статье не стояло.
С помощью traefik мы можем динамически добавлять/удалять контейнеры с содержимым, которые при прописывании правил в разделе labels будут автоматически доступны через reverse proxy.
Но что делать, если какой-то сервис слушает не 80 порт, а например 8082?
Этот случай мы рассмотрели тут.