Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

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

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

Файл конфигурации 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>

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

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

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

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

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

FROM centos:latest
Maintainer vect0r
LABEL Vendor="CentOS"

RUN yum -y update && yum clean all
RUN yum -y install httpd && yum clean all

EXPOSE 80 81

#Simple startup script to aviod some issues observed with container restart
ADD run-httpd.sh /run-httpd.sh
RUN chmod -v +x /run-httpd.sh

#Copy config file across
COPY ./httpd.conf /etc/httpd/conf/httpd.conf
COPY ./example.com /var/www/example.com
COPY ./example2.com /var/www/example2.com
COPY ./sites-available /etc/httpd/sites-available
COPY ./sites-enabled /etc/httpd/sites-enabled

CMD ["/run-httpd.sh"]

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

С Уважением,

V

В моем случае мне нужно было добавить SSLProxyEngine включен, ProxyPreserveHost On и RequestHeader устанавливает Front-End-Https на "Вкл." в мой файл vhost apache 2.4, потому что я хотел включить SSL в контейнере докеров. О local.hostname.ofDockerHost, в моем случае имя хост-сервера, на котором запущен контейнер докеров, было Лукас, а порт, сопоставленный с портом 443 контейнера докеров, был 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>

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

nginx['redirect_http_to_https'] = true
nginx['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 host
nginx['real_ip_header'] = 'X-Real-IP'
nginx['real_ip_recursive'] = 'on'

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