В статье описывается изящное и элегантное решение для того, чтобы несколько контейнеров 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, хотя у меня не было изменений для его тестирования.