Ранее мы рассмотрели, как прятать сервисы, которые слушают трафик на 80 порту, за traefik.
Однако, многие сервисы слушают другие порты (различные БД, Express.js, итд) и чтобы они были доступны через traefik, нам надо произвести некоторые изменения в файле docker-compose-nginx.yml.
В качестве примера рассмотрим наш контейнер nginx_2, а nginx_1 временно удалим (для экономии размера статьи):
Предположим, что конфигурация site_2.conf, которую мы прокидываем в контейнер nginx_2 следующая:
server {
listen 8082;
server_name site_2.example.com;
location / {
root /var/www/html;
index index.html;
}
}
А файл docker-compose-nginx.yml такой:
version: "3.7"
services:
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`)"
- "traefik.http.services.nginx_2.loadbalancer.server.port=8082"
Видим. что отличие заключается только в одной строке в секции labels:
- "traefik.http.services.nginx_2.loadbalancer.server.port=8082"
Она говорит traefik, что порт, который слушает приложение, это 8082.
Обращаю внимание, что пробрасывать порт в контейнере nginx_2 не надо. Не надо так же пробрасывать порт в контейнере traefik. У траефика в конфигурации остается только точка входа http, привязаная к 80 порту (и при необходимости https - 443).
ports:
- "80:80"
command:
- "--entrypoints.http.address=:80"
- прочие команды
Таким образом, чтобы попасть на сайт site_2.example.com, который находится в контейнере nginx_2 и слушает порт 8082, нам надо зайти на сайт по 80 порту (одна из двух точек входа - entrypoints - http), а traefik сам перенаправит запросы на нужный порт.