traefik
Данная заметка является ответом на комментарий одного из моих подписчиков, который предложил тему следующего поста:
… как настроить докер чтобы LB сразу в нужные контейнеры роутил
Как я вижу поставленную задачу?
- Разработка ведется в контейнерах;
- Одновременно могут быть запущены несколько проектов, возможно, связанных между собой;
- Перед проектами нам необходимо развернуть
LB
, который будет автоматически подхватывать запущенные сервисы и роутить на них траффик.
Я опишу довольно простой способ с помощью traefik
1. Он не является единственно правильным, но довольно прост
и легко воспроизводим для использования в локальном окружении. Решение о применимости в ваших проектах принимайте
самостоятельно.
Давайте исходить из того, что у вас уже настроен dnsmasq
2 или вы по-старинке внесли имена хостов
в /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
автоматически подхватит созданные адреса и будет проксировать к ним траффик.
Давайте отметим огромное преимущество такого подхода — отсутствие необходимости публиковать порты, по которым можно достучаться до сервисов с хост-машины. Таким образом мы снимаем головную боль с подбором и запоминанием свободных портов для новых проектов.