Для начала что такое traefik? Это обратный прокси (reverse-proxy) написанный на go. Более подробно про него написано в официально документации здесь
В качестве примера возьму практический сценарий, когда в качестве прокси используем nginx. И по каким-либо причинам нам нужно заменить его.
Неважно где у вас стоял nginx (на хосте или это был контейнер на портах хоста (форвардинг портов) ports:80,443 и т.д.). Убираем/выключаем nginx.
Подключаем traefik:
version: 3
services:
traefik:
image: traefik:2.6
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ${PWD}/traefik.yml:/etc/traefik/traefik.yml
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.rule=Host(`my-traefik-dashboard.example.ru`)"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.middlewares.auth.basicauth.users=mylogin:encodedpassword"
- "traefik.http.routers.traefik.middlewares=auth"
networks:
- mynetwork
Теперь все контейнеры внутри сети mynetwork будут доступны для нашего прокси и он сможет ими управлять и отображать их в своей панели
Первый важный момент: ваши образы контейнеров, которые будут внутри traefik сети (в данном случае mynetwork) должны иметь корректную директиву/инструкцию при сборке image -> HEALTHCHECK
Пример:
HEALTHCHECK --interval=5s --timeout=10s --retries=3 CMD curl -sS 127.0.0.1 || exit 1
Если ваш HEALTHCHECK кривой, то traefik не увидит контейнер как сервис. И чтобы вы не делали, этот контейнер не сможет проксироваться через traefik
Второй важный момент: ваш образ/контейнер должен слушать какие либо порты (не путать с форвардингом! ports тут не причём!), и если этот порт отличается от порта по-умолчанию для traefika (это 80), то надо очевидно прописать этот порт в директивах routers для вашего контейнера
Пример, когда порт отличается внутри контейнера + в этом же примере показаны другие опции:
version: 3
services:
traefik: ....
myservice:
image: myimage:1.0
labels:
- "traefik.enable=true"
# необазятельная опция service, помогает задать название сервиса внутри traefik
# это нужно если на 1 контейнер вам понадобится сказать traefikу что этот контейнер обслуживает несколько сервисов
- "traefik.http.routers.myservice.service=my-service-name"
# эта опция включает шифрование или отключает (например https без этой опции может не заработать)
- 'traefik.http.routers.myservice.tls=true'
# эта опция задаёт правило по которому traefik поймёт что нужно направить запрос к этому сервису
# можно написать Host(`myservicehost.localhost`) || Host(`myservicehost2.localhost`) и т.д. Правила смотри в документации к routers
- "traefik.http.routers.myservice.rule=Host(`myservicehost.localhost`)"
# эта опция позволяет задать порт. Обрати внимание на `my-service-name`. Т.к выше
# этот ключ определяется, то далее по нему настраиваются опции сервиса.
- "traefik.http.services.my-service-name.loadbalancer.server.port=3000"
networks:
- mynetwork
Пример выше показывает как настроить/подключить конетйнер/сервис к traefik-у.
Необязательно 1 контенйер должен обслуживать только 1 порт (1 сервис). Можно на 1 контейнере запустить много портов, тогда важно будет прописать labels так:
labels:
- "traefik.enable=true"
- "traefik.http.routers.myservice.service=my-service-name1"
- "traefik.http.services.my-service-name.loadbalancer.server.port=3001"
- "traefik.http.routers.myservice_1.rule=Host(`myservicehost.localhost`)"
# второй сервис
- "traefik.http.routers.myservice.service=my-service-name2"
- "traefik.http.services.my-service-name.loadbalancer.server.port=3002"
- "traefik.http.routers.myservice_2.rule=Host(`myservicehost2.localhost`)"
Важно чтобы внутри котнейнера прослушивались заданные для балансера порты. Далее открываем админку траефика и проверяем подтянулись ли сервисы.
Также у траефика есть интреграция с LE Оф. дока. Там же написано про Cloudflare API, что он может работать с CF api.