Можно ли использовать Docker для разделения веб-сайтов для пользователей?

Я управляю серверами, на которых у пользователей есть свои собственные веб-сайты, к которым можно получить доступ по FTP (например, от хостинговой компании), и вместо того, чтобы работать над изоляцией процессов стека LAMP, мне было интересно, возможно ли реализовать Docker и использовать изображения для каждого веб-сайта.

Насколько я понимаю, вы можете предоставить доступ к экземпляру Docker через их порты, поэтому, если вы запустите два экземпляра docker на одном сервере, вам придется предоставить два разных порта.

Но можно ли экспортировать не порты, а имя сервера, например :

  • www.somewebsite.com : Экземпляр Docker 1
  • www.otherwebsite.com : Экземпляр Docker 2
  • www.etc.com : Экземпляр Docker ...

И это на том же сервере.

Я думал об установке только Apache на сервере, что перенаправило бы запрос на выделенный экземпляр Docker на основе имени сервера, но тогда мне пришлось бы устанавливать Apache (снова!) И MySQL на любые экземпляры Docker.

Возможно ли это и, более того, интересно ли это с точки зрения производительности (или вообще нет)?

Спасибо вам за вашу помощь.

Да, это возможно. Что вам нужно сделать, так это предоставить несколько портов 80. по одному для каждого URL-адреса. Вы можете сделать это, используя, например, виртуальный хост Apache, работающий на сервере Docker host.

  1. Установите CNAME DNS.
  2. Запустите экземпляры docker и сопоставьте их порт 80 с портом, скажем, 12345~12347 хоста docker.
  3. Запустите сервер Apache на хосте docker и установите виртуальный хост для каждого URL-адреса и установите ProxyPass и ProxyPassReverse на localhost: 12345, который является одним из ваших экземпляров docker.

Конфигурационный файл Apache будет выглядеть следующим образом:

<VirtualHost *:80>ServerName www.somewebsite.com  <Proxy *>    Allow from localhost  </Proxy>  ProxyPass        / http://local.hostname.ofDockerHost:12345/  ProxyPassReverse / http://local.hostname.ofDockerHost:12345/</VirtualHost>

Я знаю, что на этот вопрос уже был дан ответ, однако я хотел сделать еще один шаг вперед и показать вам пример того, как это можно сделать, чтобы дать более полный ответ.

Пожалуйста, посмотрите мое изображение docker здесь с инструкциями о том, как его использовать, это покажет вам, как настроить два сайтаhttps://hub.docker.com/r/vect0r/httpd-proxy/

Как сказал джихун, вам нужно будет убедиться, что у вас установлена конфигурация vhost. В моем примере порт 80 используется для отображения тестового сайта example.com и 81 для отображения испытательного полигона example2.com . Также важно отметить, что вам нужно будет указать свой контент и предоставить необходимые порты в вашем Dockerfile, например;

FROM centos:latestMaintainer vect0rLABEL Vendor="CentOS"RUN yum -y update && yum clean allRUN yum -y install httpd && yum clean allEXPOSE 80 81#Simple startup script to aviod some issues observed with container restartADD run-httpd.sh /run-httpd.shRUN chmod -v +x /run-httpd.sh#Copy config file acrossCOPY ./httpd.conf /etc/httpd/conf/httpd.confCOPY ./example.com /var/www/example.comCOPY ./example2.com /var/www/example2.comCOPY ./sites-available /etc/httpd/sites-availableCOPY ./sites-enabled /etc/httpd/sites-enabledCMD ["/run-httpd.sh"]

Надеюсь, это поможет объяснить процесс немного подробнее. Пожалуйста, не стесняйтесь задавать мне любые дополнительные вопросы по этому поводу, буду рад помочь.

С уважением,

V

Это возможно. Вы можете использовать apache (или, что еще лучше, haproxy, nginx или varnish, которые могут быть более эффективными, чем apache, только для этой задачи перенаправления) на главном сервере для перенаправления на порты apache каждого контейнера.

Но, в зависимости от сайтов, которые вы там запускаете (и их конфигураций apache), это может потребовать гораздо больше памяти, чем использование одного центрального apache с virtualhosts, особенно если у вас есть модули (например, php), которые требуют много оперативной памяти.

В моем случае мне нужно было добавить SSLProxyEngine На, ProxyPreserveHost На и RequestHeader установил интерфейс-Https "Вкл." к моему файлу apache 2.4 vhost, потому что я хотел включить SSL в контейнере docker. О том, что local.hostname.ofDockerHost, в моем случае имя хост-сервера, на котором запущен контейнер docker , было лукас, и порт , сопоставленный с портом 443 контейнера docker , был 1443 (поскольку порт 443 уже использовался apache на хост-сервере), так что эта строка закончилась таким образом https://lucas:1443/

Это окончательная настройка, и она работает просто отлично!

<VirtualHost *:443> # Change to *:80 if no https required    ServerName www.somewebsite.com    <Proxy *>        Allow from localhost    </Proxy>    SSLProxyEngine On # Comment this out if no https required    RequestHeader set Front-End-Https "On" # Comment this out if no https required    ProxyPreserveHost    On    ProxyPass        / http://local.hostname.ofDockerHost:12345/    ProxyPassReverse / http://local.hostname.ofDockerHost:12345/</VirtualHost>

Наконец, в контейнере docker мне пришлось настроить заголовки прокси-сервера SSL. В моем случае в контейнере был запущен nginx, и что-то называлось все для настройки приложений ruby. Я думаю, что это также можно настроить в конфигурационном файле nginx. Запишу это как есть на всякий случай, если кто-то сочтет это полезным

nginx['redirect_http_to_https'] = truenginx['proxy_set_headers'] = {    "Host" => "$http_host",    "X-Real-IP" => "$remote_addr",    "X-Forwarded-For" => "$proxy_add_x_forwarded_for",    "X-Forwarded-Proto" => "https",    "X-Forwarded-Ssl" => "on"}nginx['real_ip_trusted_addresses'] = ['10.0.0.77'] # IP for lucas hostnginx['real_ip_header'] = 'X-Real-IP'nginx['real_ip_recursive'] = 'on'

Полное руководство по apache, конфигурации ISP, Ubuntu server 16.04 здесь https://www.howtoforge.com/community/threads/subdomain-or-subfolder-route-requests-to-running-docker-image.73845/#post-347744

Теоретически это возможно, Apache выполнит прокси-переход к порту, который прослушивает каждый экземпляр Docker.