В этой заметке расскажем, как организовать Docker-архитектуру, которая сама узнает о новых контейнерах с web-приложениями и опубликует их.
Для доступа к приложениям из внешней среды используется контейнер с прокси-сервером на основе nginx. Он является единственным в Docker-окружении доступным внешней среде по портам 80 (http) и 443 (https). В зависимости от запрашиваемого доменного имени nginx проксирует запрос на соответствующий backend-сервис внутри Docker-сети.
Backend-сервис — это контейнер с web-приложением, принимающий запросы на 80-й порт от nginx. Таких контейнеров в окружении может быть много, и их количество будет расти с релизами новых web-сайтов и сервисов.
Автоматизировать деплоймент новых контейнеров с web-приложениями можно с помощью сервиса на основе образа nginx-proxy.
При добавлении нового сайта нужно обновить конфигурацию nginx и сделать reload. Чтобы не делать этого вручную, избежать ошибок и не тратить время специалистов, используем docker-gen, который уже встроен в образ nginx-proxy.
Контейнер nginx-proxy реализует функцию Service Discovery в нашей Docker-сети, реагируя на регистрацию новых или остановку существующих Docker-контейнеров. Управлением сервисами внутри контейнера с nginx и docker-gen занимается менеджер процессов forego.
Для того чтобы nginx-сервис замечал изменения в окружении, необходимо запускать контейнеры с environment-константой
VIRTUAL_HOST. Значением этой константы будет доменное имя web-приложения, для которого произойдет автоматическая настройка проксирования http(s)-запросов.