конфигурация vhost для образа докера

Я пытаюсь создать образ докера для локальной разработки PHP на основе openSUSE, PHP7 и Apache 2.4. Apache должен разрешить …

http://localhost -> /srv/www/htdocs (openSUSE standard)
http://myapp -> /srv/www/myapp/public
...

(Http: //myapp.localhost, http://myapp.dev и т. д. также будет хорошо, если это будет легче достичь.)

Чтобы настроить vhosts, я добавил /etc/apache2/vhosts.d/myapp.conf со следующим содержимым:

<VirtualHost *:80>
ServerName localhost
DocumentRoot /srv/www/htdocs
</VirtualHost>

<VirtualHost *:80>
ServerName myapp
DocumentRoot "/srv/www/myapp/public"<Directory "/srv/www/myapp/public">
AllowOverride None
</Directory>
</VirtualHost>

Этот файл, кажется, используется Apache. apachectl -S приводит к такому выводу:

VirtualHost configuration:
*:80                   is a NameVirtualHost
default server localhost (/etc/apache2/vhosts.d/myapp.conf:2)
port 80 namevhost localhost (/etc/apache2/vhosts.d/myapp.conf:2)
port 80 namevhost myapp (/etc/apache2/vhosts.d/myapp.conf:10)
ServerRoot: "/srv/www"Main DocumentRoot: "/srv/www/htdocs"Main ErrorLog: "/var/log/apache2/error_log"Mutex ssl-stapling-refresh: using_defaults
Mutex rewrite-map: using_defaults
Mutex ssl-stapling: using_defaults
Mutex ssl-cache: using_defaults
Mutex default: dir="/run/" mechanism=default
Mutex mpm-accept: using_defaults
PidFile: "/var/run/httpd.pid"Define: SYSCONFIG
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="wwwrun" id=30
Group: name="www" id=8

Теперь локальный хост разрешен правильно, а myapp — нет. Chrome говорит «ERR_NAME_NOT_RESOLVED».

Я думаю, это потому, что в myapp нет записи в / etc / hosts. Однако, насколько я понимаю, docker не позволяет изменять / etc / hosts. Я попытался сделать это с помощью sed в моем Dockerfile:

RUN sed -i 's/^127.0.0.1.*$/127.0.0.1    localhost    myapp/g' /etc/hosts

чтобы добавить отображение myapp -> 127.0.0.1 в / etc / hosts. Тем не менее, сборка докера говорит

sed: cannot rename /etc/sedLXNJtt: Device or resource busy

Мой вопрос таков: как мне сказать, чтобы мой контейнер правильно разрешил myapp?

2

Решение

Это неудивительно, вы просите DNS-преобразователь вашего веб-браузера, произвольную программу на локальном хосте, которая, вероятно, использует системный преобразователь и не знает о контейнерах Docker, чтобы каким-то образом выяснить, какой IP-адрес контейнера Docker разрешает это имя в ,

Хороший подход, который я видел в прошлом, заключается в подключении контейнера, запускающего демон SSH, к сети моста Docker ваших целевых сервисов. Затем вы можете использовать динамическую функцию переадресации портов на уровне приложения SSH и настроить свой браузер на использование прокси-сервера SOCKS, настроенного клиентом SSH, на выбранный вами порт и туннелирование внутри сети Docker. Если вы настроите свой браузер так, чтобы он также разрешал DNS-запросы через прокси-сервер, вы сможете подключаться к встроенному DNS-серверу Docker, который по умолчанию будет отвечать на запросы доменных имен, соответствующих именам контейнеров.

Что хорошо в этом то, что:

  • Вы можете попросить механизм Docker настроить псевдонимы, чтобы вы могли использовать совершенно произвольные доменные имена (даже в TLD, контролируемых ICANN, например, ваши рабочие домены), что иногда бывает полезно для отладки проблем с сертификатами X.509 и тому подобного.
  • Если вы запускаете прокси-сервер SSH автоматически при загрузке компьютера и, например, используете расширение для браузера, чтобы легко включать / отключать / переключать прокси-серверы, все это работает «из коробки» для всех новых контейнеров без дополнительной настройки. Конечно, это предполагает, что все контейнеры подключены к одной мостовой сети Docker, вам нужно будет переконфигурировать вещи, если вы играете с несколькими сетевыми мостами Docker (что на самом деле вероятно, если вы используете такие инструменты, как Docker Compose). Такое ощущение, что это может быть полностью автоматизировано (с взаимодействующими расширениями браузера), поэтому некоторые инструменты могут уже существовать (или вы можете написать их). Хороший UX, о котором я могу подумать, будет иметь расширение для браузера, позволяющее быстро выбирать сеть Docker для «подключения» (помните, что несвязанные контейнеры в разных сетях Docker могут ожидать использования одного и того же имени).

Конечно, для такого подхода вам не нужен SSH, просто то, что говорит о SOCKS и может взаимодействовать с произвольным интерфейсом виртуальной сети. Просто комбинация клиента и сервера SSH упрощает настройку и экспериментирование с сегодняшним днем ​​без написания какого-либо кода. Отказ от ответственности: я никогда не пробовал подход лично, но я не вижу причин, по которым он не будет работать.

Вы можете добавить запись в свой локальный файл hosts для каждого контейнера, как вы уже нашли. Это, очевидно, более просто, но инструменты для автоматизации этого подхода могут быть более сложными. По сути, вам нужно написать DNS-распознаватель или сервер, который интегрируется с Docker, возможно, с пользовательским интерфейсом для устранения неоднозначности между именами, заявленными разными контейнерами в разных сетях Docker. Опять же, некоторые инструменты могут уже существовать, но я лично о них не слышал.

В качестве альтернативы вы можете представить не однозначную схему, такую ​​как $container_name.$network_name.localhostхотя сейчас вам требуются некоторые контейнеры (например, HTTP-серверы, которые выполняют виртуальный хостинг, как в вашей настройке), чтобы знать о проблемах системного уровня (в какой сети они находятся), где вы бы хотели, чтобы он был прозрачным (разные разработчики в вашей команде могут использоваться разные сетевые имена, возможно, они даже тестируют несколько веток одной и той же кодовой базы одновременно в разных сетях). Вы можете использовать такие вещи, как подстановка среды в docker-compose, чтобы она по-прежнему выполнялась без какой-либо конфигурации (при условии, что вы всегда можете передать эти параметры процессам контейнера через переменные среды / шаблон файла конфигурации), но на практике это может быть сложнее.

Если вы сделаете это, вы можете настроить системный распознаватель по умолчанию на этот DNS-сервер (и откатить на обычные серверы), что может быть как хорошим, так и плохим, в зависимости от того, что вы хотите сделать. Обратите внимание, что по своему опыту я не знаю многих программ, позволяющих выбрать произвольный преобразователь имен или даже произвольные DNS-серверы (так как большинство полагается на системный преобразователь). Так что, если вы хотите настроить на уровне приложения, это, вероятно, не лучший подход (поддержка SOCKS более распространена).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]