traefik

Данная заметка является ответом на комментарий одного из моих подписчиков, который предложил тему следующего поста:

… как настроить докер чтобы LB сразу в нужные контейнеры роутил

Как я вижу поставленную задачу?

  • Разработка ведется в контейнерах;
  • Одновременно могут быть запущены несколько проектов, возможно, связанных между собой;
  • Перед проектами нам необходимо развернуть LB, который будет автоматически подхватывать запущенные сервисы и роутить на них траффик.

Я опишу довольно простой способ с помощью traefik1. Он не является единственно правильным, но довольно прост и легко воспроизводим для использования в локальном окружении. Решение о применимости в ваших проектах принимайте самостоятельно.

Давайте исходить из того, что у вас уже настроен dnsmasq2 или вы по-старинке внесли имена хостов в /etc/hosts.

Для начала запустим контейнер с traefik:

services:
  reverse-proxy:
    image: traefik:v2.10
    command: --api.insecure=true --providers.docker
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

На 80-ом порту будет наша точка входа, на 8080 — красивая админка traefik. Вольюм с сокетом прокидывается для того, чтобы traefik мог реагировать на события создания других контейнеров.

Информация об именах хостов будет храниться в лейблах контейнеров. Для наглядности создадим ещё два файла docker-compose с описанием двух сервисов, каждый файл будет имитировать локальное развертывание независимого проекта:

---
services:
  svc1:
    image: hashicorp/http-echo
    command: -text="svc1"
    labels:
      - "traefik.http.routers.svc1.rule=Host(`svc1.dmz`)"
---
services:
  svc2:
    image: hashicorp/http-echo
    command: -text="svc2"
    labels:
      - "traefik.http.routers.svc2.rule=Host(`svc2.dmz`)"

При запуске traefik автоматически подхватит созданные адреса и будет проксировать к ним траффик.

traefik

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