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


12

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

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

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

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

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

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

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

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


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

Ответы:


12

Да, это возможно. Что вам нужно сделать, это предоставить несколько 80 портов. один для каждого URL. Вы можете сделать это с помощью, например, Virtual Host of 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>

4
Благодарность! Это очень помогло. Кроме того, есть ProxyPreserveHost On, так что вы не получите много ссылок на local.hostname.ofDockerHost: 12345 insite вашего веб-сайта. Вот дополнительная информация, которая была мне полезна: digitalocean.com/community/tutorials/…
Себастьян Рамирес,

Сохранит ли докер изменения в базе данных и т. Д.?
EminezArtus

3

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

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


Спасибо за ваш ответ. Действительно, «хостинговый» сервис, который я буду предоставлять, включает в себя такие вещи, как Prestashop, Wordpress и т. Д., Поэтому он базируется на PHP и тяжелых движках (я говорю больше о Prestashop здесь).
Кирилл Н.

1
Будет ли система виртуального хостинга Dockerized лучше модульной, если разделить PHP на свои собственные контейнеры Docker и заставить контейнеры Apache использовать этот контейнер для обработки PHP? Подойдет ли то же самое для баз данных? Например, есть ли трафик прокси-сервера к контейнерам Apache (которые содержат пользовательские веб-сайты), которые, в свою очередь, отправляют всю обработку PHP в контейнер PHP, а база данных читает / записывает в контейнер MySQL? Или PHP будет менее ресурсоемким в этом смысле? Будут ли PHP-FPM, SuPHP или аналогичные установки обеспечивать такую ​​же настройку в среде, отличной от Docker?
ojrask

PHP-FPM в контейнере будет, по крайней мере, немного избыточным в отношении файлового пространства : code.google.com/p/sna/wiki/NginxWithPHPFPM При установке Apache / Nginx необходимо скопировать файлы PHP в контейнер PHP-FPM, чтобы чтобы эта система работала. Решит ли эту проблему смонтированный контейнер с общими данными?
ojrask

Если вам нужно обмениваться данными (т. Е. Файлами php) между контейнерами, то вам подойдут тома, вы можете смонтировать их из других контейнеров (даже с выделенными данными) или из реальной файловой системы. Раньше модуль apache был самым быстрым способом запуска php-кода, он был хорош только для php, а не для статических файлов, и имел верхний уровень для доставки статического / кешируемого контента (т. Е. Лака), который мог бы стать хорошей комбинацией.
Гмуслера

3

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

Пожалуйста, посмотрите мой образ докера здесь с инструкциями о том, как его использовать, это покажет вам, как настроить два сайта 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"]

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

С Уважением,

В


Я также загрузил файлы, используемые для создания этого изображения на github; github.com/V3ckt0r/docker-httpd-proxy
Vect0r

1

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

Наконец, в контейнере Docker мне пришлось настроить заголовки прокси SSL. В моем случае контейнер работал под управлением nginx и что-то под названием omnibus для настройки приложений 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.