Traefik
В статье Wireguard and Pi-Hole показывал, как через docker-compose организовать взаимосвязь между двумя docker-сервисами и показывал один из способов работы веб-сервиса с жесткой привязкой к IP-адресу.
Но что если нам необходимо поднять несколько веб-сервисов на одном сервере, и организовать доступ к ним по различным доменам? Рассмотрим варианты.
Nginx
Сначала рассмотрим вариант, который кажется самым простым. При организации docker-контейнеров пробрасываем порты во вне, при этом нужно будет самостоятельно учитывать, какие порты уже были заняты и какие порты можно использовать в дальнейшем. Так же необходимо настраивать фаервол на сервере таким образом, чтобы доступными были только строго определенные порты.
Поднимаем отдельно Nginx, которые будет выступать балансировщиком и затем в зависимости от используемого домена отправляем запросы на требуемый порт.
В результате получаем массу ручной работы, и плюс увеличиваем шансы поймать ошибку при внесении новых изменений.
Traefik
В случае с Traefik весь ручной труд сводиться к нулю. Рассмотрим чуть более подробнее.
Сначала установим, используя docker, создаем docker-compose.yaml
файл:
version: '3'
services:
app:
image: traefik
restart: always
ports:
- "80:80"
command:
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /etc/localtime:/etc/localtime
networks:
- web
networks:
web:
external: true
В приведенном примере мы запускаем traefik на сервере, настраиваем его на использование docker-провайдера, и будем использовать только 80 порт для работы. После запуска демона через команду docker-compose up -d
мы получаем работающий Traefik, который отслеживает все запущенные на сервере докер-контейнеры.
Осталось только привязать контейнеры к их доменам, для чего их запуске указываем определенные метки. Пример для whoami
контейнера:
version: '3'
services:
whoami:
# A container that exposes an API to show its IP address
image: containous/whoami
labels:
- "traefik.enable=true"
- "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"
После запуска контейнера он будет доступен на сервере по домену whoami.docker.localhost
:
$ curl -H Host:whoami.docker.localhost http://127.0.0.1
Hostname: a656c8ddca6c
IP: 172.27.0.3
#...
Dashboard
При использовании опции dashboard получаем возможность доступа к служебной странице Traefik:
Таким образом мы полностью избавляемся от ручного труда при управлении работающими сервисами и избегаем возможных ошибок в конфигурации. В рамках статьи мы рассмотрели управление только Docker-контейнерами, но Traefik позволяет брать конфигурацию из множества источников:
- Docker
- Kubernetes
- Consul Catalog
- Marathon
- Rancher
- File
- Consul
- etcd
- Redis
- ZooKeeper
Получаем удобный балансировщик с динамической конфигурацией.