Задача: Исправить сетевую маршрутизацию дочерних проектов через Traefik
Исправить сетевую маршрутизацию дочерних проектов через Traefik
Исправить сетевую маршрутизацию дочерних проектов через Traefik.
Цель
Сделать автоматическую и воспроизводимую маршрутизацию внешнего Traefik к дочерним проектам без ручного docker network connect/disconnect и без публикации отдельных host ports для каждого проекта.
Что нужно проработать
- Автоматическое подключение запускаемого контейнера проекта к сети Traefik.
- Исключить ситуацию, когда при наличии нескольких сетей (
bridge+docker_default) Traefik выбирает неправильный IP контейнера. - Определить минимальный routing contract проекта: domain/host, внутренний порт, имена router/service, entrypoint, TLS.
- Не использовать отдельные host ports как основной механизм маршрутизации проектов.
- Проверить работу нескольких дочерних проектов одновременно.
- Сохранить одинаковую модель маршрутизации локально и на сервере.
Критерий результата
После запуска проекта внешний Traefik должен автоматически получать корректный endpoint и маршрутизировать запросы к проекту без ручного подключения/отключения Docker-сетей.
Ворклоги
2026-09-27 — Проксирование трафика в DinD через Traefik
Проверена и доведена до рабочего состояния маршрутизация к дочернему проекту, запущенному через Docker Compose внутри DinD.
Результат
Рабочая цепочка: внешний Traefik → DinD:2015 → socat → внутренний Traefik:80 → app:3000. Проект nextjs-test успешно доступен по http://nextjs-test.localhost:2015/.
В Dockerfile дочернего проекта добавлены socat и bash, а внешний Traefik настроен на порт 2015 DinD-контейнера. socat после запуска Compose пробрасывает этот порт на внутренний Traefik.
Управление Docker-сетями
Первоначально подключение DinD к docker_default было добавлено непосредственно в buildAndRunProject, но принято решение не оставлять этот хардкод. Сеть должна управляться явно через API.
Добавлены:
- тип
DockerContainerNetwork(name,networkID,ipAddress,gateway,macAddress); - ленивое поле
DockerContainer.networks; - helper
mapContainerNetworks; - query
containerNetworks; - mutation
connectContainerToNetwork; - mutation
disconnectContainerFromNetwork.
Теперь контейнер можно программно подключать к сети внешнего Traefik и отключать от неё без Docker CLI.
Выявленный нюанс
Если контейнер подключить к сети уже после появления маршрута, внешний Traefik может продолжить использовать старый endpoint. В проведённом тесте понадобился restart Traefik. Это следует учесть при дальнейшем lifecycle запуска и маршрутизации проектов.