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:

dashboard

Таким образом мы полностью избавляемся от ручного труда при управлении работающими сервисами и избегаем возможных ошибок в конфигурации. В рамках статьи мы рассмотрели управление только Docker-контейнерами, но Traefik позволяет брать конфигурацию из множества источников:

  • Docker
  • Kubernetes
  • Consul Catalog
  • Marathon
  • Rancher
  • File
  • Consul
  • etcd
  • Redis
  • ZooKeeper

Получаем удобный балансировщик с динамической конфигурацией.