Докеризация прокси-сервера, чтобы я мог подключиться к контейнеру через vhost.Является ли это возможным? - PullRequest
0 голосов
/ 28 марта 2019

На данный момент у меня есть контейнер Docker, который состоит из стека LAMP (PHP, Apache, MySQL). Он отлично работает на http://localhost:my_specified_port. Однако я хочу получить к нему доступ через http://some_domain.dev. Мое текущее решение - использовать NGINX локально в качестве прокси-сервера и выполнить:

server {
    listen   80;
    server_name  some_domain.dev
    location / {
        proxy_pass http://localhost:my_specified_port;
    }
}

Работает нормально. Тем не менее, я хочу упростить задачу для моих коллег, докернизировать сервер NGINX и получить тот же результат. Возможно ли это сделать? Я не могу найти какие-либо решения в Интернете. Большое спасибо.

РЕДАКТИРОВАТЬ: Большое редактирование. Я забыл упомянуть, что я хочу, чтобы NGINX в докере работал на другом порту, отличном от 80. Поэтому, если у некоторых людей установлен Apache на их локальном компьютере, он все равно будет работать.

1 Ответ

0 голосов
/ 28 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...