Как запустить несколько Docker проектов под 80 портом с помощью готового локального Reverse Proxy

Как запустить несколько Docker проектов под 80 портом с помощью локального Reverse Proxy

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

Как это работает

Как запустить несколько Docker проектов под 80 портом с помощью готового локального Reverse Proxy - диаграмма.
Как работает Local Reverse Proxy
  • 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

  1. Когда вы вводите запрос в браузере http://example.local , вначале маршрутизация ОС находит по домену — IP в /etc/hosts.
  2. Затем выполняется запрос по этому IP — 127.0.0.1 и 80 порту с доменом example.local в header загловоке.
  3. 80 порт уже слушает наш Reverse Proxy, и он получает этот запрос.
  4. Далее 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 контейнер.
  1. Ну и наше Docker приложение у которого например Nginx выставлен 8080 портом наружу, получает этот запрос от нашего Local Reverse Proxy по адресу http://localhost:8080. Внутри контейнер думает что он на 80 работает.
  2. После этого Docker приложение обрабатывает request и отдает response в Local Reverse Proxy.
  3. 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. Но его нужно будет конфигурировать и перезапускать, что в нашем случае оказалось неудобным.

Полезные ссылки


Андрей Писаревский

Автор: Андрей Писаревский 

PHP | WordPress Team Lead. Имею коммерческий опыт в программировании с 2010 года и экспертизу в полном цикле веб разработки: Frontend, Backend, QA, Server administration, управление крупными командами и Enterprise проектами.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *