Задача: Исправить сетевую маршрутизацию дочерних проектов через 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 запуска и маршрутизации проектов.