В статье описывается изящное и элегантное решение для того, чтобы несколько контейнеров Docker были доступны на одном и том же порте (например, 80) и достижимы через имена его виртуальных хостов.

Некоторое время назад я наткнулся на жемчужный контейнер под названием nginx-proxy. Он извлекает из движка Docker некоторую информацию о других контейнерах и генерирует для них конфигурацию обратного прокси-сервера Nginx. Простая, но гениальная идея.

В настоящее время часто бывает, что несколько приложений работают друг с другом. Это может быть бэкэнд, который предоставляет REST API, и интерфейс, который его использует. Или это может быть набор микросервисов, взаимодействующих друг с другом. По умолчанию вы должны использовать имя службы (одно из docker-compose.yml), чтобы добраться до нее. Другая проблема возникает, если вы хотите связать несколько портов контейнера 80 с хостом. Они должны быть уникальными на стороне хоста.

Это не удобно.

В качестве примера я хотел бы показать вам, как использовать его в локальной среде разработки. Допустим, у нас есть два приложения, которые открывают порт 80. Первое - это бэкэнд-приложение на основе Symfony, второе - фронтенд-приложение на Angular.

Проверить пример из реальной жизни

Что касается Symfony, мы используем formapro/nginx-php-fpm образ Docker, а для внешнего интерфейса нам нужен файл сборки:

docker-compose.yml выглядит так:

Как вы могли заметить, прокси-контейнер - единственный, который предоставляет доступ к HTTP-порту извне, другие контейнеры остаются позади него. Чтобы указать прокси, что использовать для прокси, приложения должны определить VIRTUAL_HOST переменную среды.

Остается сделать последний штрих. Вам нужно либо сопоставитьbackend.loc и frontend.loc с localhost в файле /etc/hosts хоста, либо настроить службу Dnsmasq для перенаправления всех *.loc запросов на localhost.

Теперь вы можете ввести http://frontend.loc в браузере, и он вам это покажет.

У меня есть небольшая хитрость для тех, кто пользуется RabbitMQ. Вы можете проксировать его пользовательский интерфейс менеджера, как и другие приложения:

Теперь он доступен по http://rabbitmq.loc адресу и порту 80 по умолчанию. Не нужно запоминать его порт по умолчанию (15672).

Заключение

Я нашел этот небольшой прокси-контейнер чрезвычайно полезным. Прокси-сервер также может проксировать запросы FastCGI, хотя у меня не было изменений для его тестирования.