Возможно, вам когда-то приходилось запускать два или более Docker проектов на локальной машине. Это распространённая задача для разработчиков если у вас несколько проектов или вы используете микросервисную архитектуру.
Однако, работая с несколькими docker проектами, вы могли столкнуться с проблемами:
- Контейнеры (nginx/apache) разных проектов могут конфликтовать из-за того, что все они пытаются использовать стандартный HTTP порт (80 или 443 для HTTPS). Порт может слушать только один контейнер.
- Могут возникать сложности с внешними интеграциями или с самим проектом, если он находится не на 80/443 порту.
И к нему нужно обращаться к примеру поhttp://wp-yoda.local:8080/
. В этих случаях может потребоваться вносить изменения в код проекта для его корректной работы или связывать с командой саппорта. - WordPress Multisite set up не запустится на любом порту отличном от 80/443, т.е. больше 2 WordPress Multisite вы не запустите локально на докере.
Решением этих проблем служит использование локального Reverse Proxy, который позволяет принимать запросы на 80 порту и перенаправлять их на соответствующие контейнеры Docker, работающие на разных портах. Это не только решает проблему конфликта портов, но и позволяет использовать кастомные локальные URL для доступа к проектам без лишних проблем, добавляя удоства в работе.
В этой статье я рассмотрю, как работает локальный Reverse Proxy на Go, который я написал для работы с двумя и более Docker проектами на 80 порту. Вы узнаете, как легко и эффективно управлять доступом к множеству контейнеров, используя один стандартный порт, и как избавиться от необходимости дополнительной настройки каждого проекта для его работы в такой среде.
Как это работает
- Client — это вы.
- Host — это файлик хостов, в него нужно добавить все желаемые локальные домены и будут они вести на порт
127.0.0.1
. Ваш локальный DNS. - Reverse Proxy слушает
80
порт и проксирует запросы на Docker контейнеры по определенным правилам, они описаны вservices.json
(но об этом ниже). - Target Server (Docker App) — это наш Docker проект. Их может быть несколько, столько — сколько вам необходимо запустить одновременно.
Главная задача указать у apache или nginx указать разные порты для разных docker проектов.
Про порты:
В контексте компьютерных сетей, если один процесс (контейнер) «слушает» или принимает данные на определённом порту, другой процесс не сможет использовать тот же порт на том же интерфейсе для прослушивания или приёма данных. Это предотвращает конфликты и гарантирует, что данные, предназначенные для конкретного приложения или службы, корректно маршрутизируются к нему.
0.1.1 версия Local Reverse Proxy работает только на 80 порту, 443 порт на этой версии не поддерживается.
От request до response
- Когда вы вводите запрос в браузере
http://example.local
, вначале маршрутизация ОС находит по домену — IP в/etc/hosts
. - Затем выполняется запрос по этому IP —
127.0.0.1
и80
порту с доменомexample.local
в header загловоке. - 80 порт уже слушает наш Reverse Proxy, и он получает этот запрос.
- Далее Local Reverse Proxy достает из запроса домен по которому идет запрос и ищет его в
services.json
файле, который содержит в себе объект со списком доменов и куда нужно проксировать:"Домен": "Адрес до docker контейнера"
"example.local": "http://localhost:8080"
{
"pbnwp.loc": "http://localhost:8080",
"*.local": "http://localhost:8090"
}
Можно так-же использовать маски как например*.local
. Что будет означать — проксировать все запросы на*.local
домены наhttp://localhost:8090
контейнер.
- Ну и наше Docker приложение у которого например Nginx выставлен 8080 портом наружу, получает этот запрос от нашего Local Reverse Proxy по адресу
http://localhost:8080
. Внутри контейнер думает что он на 80 работает. - После этого Docker приложение обрабатывает request и отдает response в Local Reverse Proxy.
- Local Reverse Proxy в свою очередь отдает response клиенту.
Ваша главная задача будет настроить для nginx/apache в вашем докер проекте внешний порт, отличный от 80 и чтобы он не совпадал с портом другого докер проекта. Можете использовать 8080, 8090 ну итд.
Пошаговое руководство как запустить и настроить локальный Reverse Proxy
С полными шагами запуска, и настройки Local Reverse Proxy, Docker проектов вы можете ознакомиться в Github репозитории проекта.
Реальное применение
На своих проектах мы используем это решение в команде, чтобы работать сразу с двумя докер проектами из-под 80 порта, без дополнительных настроек и переписываний скриптов.
Из удобств: нам не требуется больше останавливать один докер проект и запускать другой, чтобы что-то проверить на другом проекте. Это в свою очередь снизило количество ошибок при разработке и повысило комфорт при работе с проектами, не нужно запоминать на каких портах находятся проекты, теперь они всегда доступны напрямую по домену. Так-же мы подключаем и 3й docker проект, когда нам необходимо запустить микросервис.
Из огромных плюсов стоит отметить, для того, чтобы добавить новый домен, не нужно перекомпилировать приложение. Достаточно просто добавить новый домен вservices.json
, ну и вhosts
и можно сразу выполнять запросы.
Происходит это потому что файлservices.json
читается в рантайме.
Так-же можно использовать Nginx как локальный Reverse Proxy. Но его нужно будет конфигурировать и перезапускать, что в нашем случае оказалось неудобным.