Чи можна використовувати Docker для розділення веб-сайтів для користувачів?


12

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

З того, що я розумію, ви можете відкрити екземпляр Docker через їх порти, тож якщо ви запустите два екземпляри докера на одному сервері, вам доведеться відкрити два різні порти.

Але чи можна експортувати не порти, а ім’я сервера, наприклад:

  • www.somewebsite.com: екземпляр Docker 1
  • www.otherwebsite.com: екземпляр Docker 2
  • www.etc.com: Екземпляр Докера ...

І це, в тому ж сервері.

Я думав про встановлення лише Apache на сервер, який би перенаправляв запит до виділеного екземпляра Docker на основі імені сервера, але тоді мені доведеться встановити Apache (знову ж таки!) AndMySQL на будь-яких екземплярах Docker.

Чи можливо це і, тим більше, це цікаво з точки зору виконання (чи не зовсім)?

Дякую за твою допомогу.


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

Відповіді:


12

Так, можливо. Що вам потрібно зробити, це забезпечити кілька 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>

4
Дякую! Це дуже допомогло. Крім того, є те ProxyPreserveHost On, тому ви не закінчите багато посилань на local.hostname.ofDockerHost: 12345 наполягайте на своєму веб-сайті. Ось більше інформації, яка була мені корисною: digitalocean.com/community/tutorials/…
Себастьян Рамірес

Чи збереже Docker зміни в базі даних тощо?
EminezArtus

3

Можливо. Ви можете використовувати apache (а ще краще, haproxy, nginx або лак, який може бути більш ефективним, ніж apache для виконання саме цієї задачі на переадресацію) на головному сервері, щоб перенаправити на порти apache кожного контейнера.

Але, залежно від сайтів, які ви там запускаєте (та їх конфігурації apache), може знадобитися набагато більше пам'яті, ніж використання одного центрального апаша з віртуальними хостами, особливо якщо у вас є модулі (тобто php), які вимагають багато оперативної пам'яті.


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

1
Чи буде краще докерізована віртуальна хостинг-система краще модулюватися, розділяючи PHP у власний контейнер Docker і змушуючи контейнери Apache використовувати цей контейнер для обробки PHP? Чи буде те саме для баз даних? Наприклад, мають хост-проксі-трафік до контейнерів Apache (які містять веб-сайти користувачів), які, в свою чергу, відправляють всю обробку PHP в контейнер PHP, а база даних читає / записує в контейнер MySQL? Або PHP був би таким, що не потребує ресурсів? Чи забезпечують PHP-FPM, SuPHP або подібні подібні налаштування в не-докерському середовищі?
ojrask

PHP-FPM в контейнері, принаймні, буде трохи надмірним файловим простором: code.google.com/p/sna/wiki/NginxWithPHPFPM Установка Apache / Nginx повинна скопіювати файли PHP в контейнер PHP-FPM для того, щоб щоб ця система працювала. Чи зможе змонтований контейнер спільних даних вирішити цю проблему?
ojrask

Якщо вам потрібно обмінюватися даними (тобто файлами php) між контейнерами, томи - це спосіб перейти, ви можете встановити їх з інших контейнерів (навіть у них призначені дані) або з реальної файлової системи. Модуль apache, який був найшвидшим способом запуску php-коду, маючи один лише для php, а не для статичних файлів, і має верхній шар для доставки статичного / кешованого вмісту (тобто лаку), може бути хорошим комбо.
gmuslera

3

Я знаю, що на це вже відповіли, але я хотів зробити це на крок далі і показати вам приклад того, як це можна зробити, щоб надати більш повну відповідь.

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

Як сказав Джихун, вам доведеться переконатися, що у вас встановлена ​​конфігурація 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


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

1

У моєму випадку мені потрібно було додати SSLProxyEngine On , ProxyPreserveHost On і RequestHeader встановити Front-End-Https "On" у свій файл apache 2.4 vhost, тому що я хотів включити SSL на контейнер докера. Про local.hostname.ofDockerHost , у моєму випадку ім'я хостового сервера, на якому працює контейнер docker , було lucas , а порт, зіставлений на порт 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 мені довелося встановити проксі-заголовки проксі. У моєму випадку контейнер запускав nginx і щось, що називається омнібус для налаштування рубінових програм. Я думаю, що це може бути встановлено і в конфігураційному файлі 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 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.