90% раствор
Отправной точкой для решения этой проблемы будет использование jwilder / nginx-proxy - докеризованного обратного прокси-сервера Nginx. Он автоматизирует процедуру, описанную в вопросе, путем генерации конфигурации Nginx в зависимости от переменных env других контейнеров.
И вам нужен способ указать свой домен для разрешения через обратный прокси-сервер Nginx. Наиболее распространенным способом является использование /etc/hosts
. Маршрут будет выглядеть так:
- Браузер ищет домен
/etc/hosts
говорит, что домен разрешается в ip обратного прокси
- Обратный прокси-сервер проверяет, существует ли в нем домен настроек
- Обратный прокси-сервер перенаправляет запрос в соответствующий контейнер
Но поскольку вы хотите, чтобы обратный прокси-сервер Nginx работал на порте, отличном от 80, вам все равно потребуется доступ к нужному домену с портом. Так что это решение не на 100% то, что вам нужно, но оно все же является хорошей отправной точкой для понимания того, как имитировать доменные имена с использованием обратного прокси-сервера:
- пробег
docker run -d -p 8080:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
- добавить env var
VIRTUAL_HOST=some_domain.dev
в контейнер LAMP (вы также можете использовать VIRTUAL_PORT={{any port number}}
, если ваше приложение внутри контейнера работает не на 80-м порту)
- добавить
127.0.0.1 some_domain.dev
к /etc/hosts
- доступ
http://some_domain.dev:8080
Если позже вы захотите добавить другое контейнерное приложение с другим доменом, вам следует:
- добавить env var
VIRTUAL_HOST=another_domain.dev
в контейнер вашего нового приложения
- добавить
127.0.0.1 another_domain.dev
к /etc/hosts
- доступ
http://another_domain.dev:8080
100% раствор
Если вы хотите смоделировать доменные имена в удобном для обслуживания виде, который может масштабироваться в рамках команды разработчиков - вы можете использовать jwilder/nginx-proxy
вместе с mitm-nginx-proxy-companion и расширением прокси браузера. mitm-nginx-proxy-companion
включает mitmproxy
и сервер DNS, который позволяет отправлять «запросы локальных доменов» на резервный прокси-сервер, а остальные запросы - в «реальный» интернет.
После настройки весь маршрут будет выглядеть так:
- Вы пытаетесь получить доступ к домену в браузере.
- Расширение прокси направляет этот запрос в mitmproxy вместо «реального» Интернета.
- mitmproxy пытается разрешить доменное имя через DNS-сервер в том же контейнере.
- Если домен не является "локальным", он перенаправит запрос в "настоящий" интернет.
- Но если домен является "локальным", он перенаправит запрос обратному прокси.
- Обратный прокси-сервер, в свою очередь, перенаправляет запрос в соответствующий контейнер, который включает в себя сервис, к которому мы хотим получить доступ.
С mitm-nginx-proxy-companion
вам не нужно использовать /etc/hosts
, поэтому, если вы попробовали первое решение, вы должны удалить записи, которые вы добавили ранее. Я добавляю решение в форме docker-compose для удобства написания / чтения
version: '3.3'
services:
lamp:
environment:
VIRTUAL_HOST: some_domain.dev
VIRTUAL_PORT: 9999
image: my_lamp_image
another_app:
environment:
VIRTUAL_HOST: another_domain.dev
image: my_app_image
nginx-proxy:
image: jwilder/nginx-proxy
labels:
- "mitmproxy.proxyVirtualHosts=true"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
nginx-proxy-mitm:
dns:
- 127.0.0.1
image: artemkloko/mitm-nginx-proxy-companion
ports:
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
Тогда вам нужно будет
- Пробег
docker-compose up
- Добавьте расширение прокси в ваш браузер, указав адрес прокси
127.0.0.1:8080
- Доступ
http://some_domain.dev
- Доступ
http://another_domain.dev
Примечание : я являюсь автором mitm-nginx-proxy-companion