Ist es möglich, mit Docker Websites für Benutzer zu trennen?

12

Ich verwalte Server, auf denen Benutzer ihre eigenen Websites haben, auf die über FTP zugegriffen werden kann (wie bei einem Hosting-Unternehmen), und anstatt LAMP-Stack-Prozesse zu isolieren, habe ich mich gefragt, ob es möglich ist, Docker zu implementieren und Bilder pro Website zu verwenden.

Soweit ich weiß, können Sie die Docker-Instanz über ihre Ports verfügbar machen. Wenn Sie also zwei Docker-Instanzen auf demselben Server ausführen, müssen Sie zwei verschiedene Ports verfügbar machen.

Ist es aber möglich, nicht Ports, sondern Servernamen zu exportieren, wie:

  • www.somewebsite.com: Docker-Instanz 1
  • www.otherwebsite.com: Docker-Instanz 2
  • www.etc.com: Docker-Instanz ...

Und das auf demselben Server.

Ich dachte darüber nach, nur Apache auf dem Server zu installieren, der die Anforderung basierend auf dem Servernamen an die dedizierte Docker-Instanz umleitet, aber dann müsste ich Apache (erneut!) Und MySQL auf allen Docker-Instanzen installieren.

Ist das möglich und darüber hinaus auch leistungsmäßig (oder gar nicht) interessant?

Danke für deine Hilfe.

Cyril N.
quelle
1
Theoretisch ist es möglich, dass Apache einen ProxyPass für den Port erstellt, den jede Docker-Instanz überwacht.
Thanasisk

Antworten:

12

Ja, es ist möglich. Sie müssen lediglich mehrere 80 Ports bereitstellen. eine für jede URL. Dies können Sie z. B. mit Virtual Host of Apache tun, das auf dem Docker-Hostserver ausgeführt wird.

  1. Stellen Sie DNS CNAME ein.
  2. Führen Sie Docker-Instanzen aus und ordnen Sie deren Port 80 dem Port 12345 ~ 12347 des Docker-Hosts zu.
  3. Führen Sie den Apache-Server auf dem Docker-Host aus und legen Sie für jede URL einen virtuellen Host fest. Setzen Sie ProxyPass und ProxyPassReverse auf localhost: 12345, eine Ihrer Docker-Instanzen.

Die Apache-Konfigurationsdatei sieht folgendermaßen aus:

<VirtualHost *:80>
ServerName www.somewebsite.com
  <Proxy *>
    Allow from localhost
  </Proxy>
  ProxyPass        / http://local.hostname.ofDockerHost:12345/
  ProxyPassReverse / http://local.hostname.ofDockerHost:12345/
</VirtualHost>
Jihun
quelle
4
Vielen Dank! Das hat sehr geholfen. Es gibt auch die ProxyPreserveHost On, so dass Sie am Ende nicht viele Links zu local.hostname.ofDockerHost: 12345 auf Ihrer Website haben. Hier sind weitere Informationen, die mir geholfen
Sebastián Ramírez
Speichert Docker Änderungen an der Datenbank usw.?
EminezArtus
3

Es ist möglich. Sie können Apache (oder besser Haproxy, Nginx oder Firnish, das für diese Umleitungsaufgabe effizienter ist als Apache) auf dem Hauptserver verwenden, um zu den Apache-Ports jedes Containers umzuleiten.

Abhängig von den Sites, die Sie dort ausführen (und deren Apache-Konfigurationen), kann es jedoch weitaus mehr Speicher erfordern als die Verwendung eines einzelnen zentralen Apache mit virtuellen Hosts, insbesondere wenn Sie Module (dh PHP) haben, die viel RAM benötigen.

gmuslera
quelle
Vielen Dank für Ihre Antwort. Tatsächlich umfasst der von mir angebotene "Hosting" -Dienst Dinge wie Prestashop, Wordpress usw., die viel auf PHP und schweren Engines basieren (ich spreche hier mehr über Prestashop).
Cyril N.
1
Wäre ein andockbares virtuelles Hosting-System besser modularisierbar, wenn PHP in eigene Docker-Container aufgeteilt würde und die Apache-Container diesen Container für die PHP-Verarbeitung verwenden würden? Gilt das auch für Datenbanken? ZB Host-Proxy-Verkehr zu Apache-Containern (die Benutzer-Websites enthalten), die ihrerseits die gesamte PHP-Verarbeitung an einen PHP-Container senden und die Datenbank liest / schreibt in einen MySQL-Container? Oder wäre das PHP auf diese Weise weniger ressourcenhungrig? Würden PHP-FPM, SuPHP oder ähnliches in einer Nicht-Docker-Umgebung die gleiche Art von Setup bereitstellen?
ojrask
PHP-FPM in einem Container wäre zumindest in Dateibereichen etwas redundant: code.google.com/p/sna/wiki/NginxWithPHPFPM Bei der Installation von Apache / Nginx müssen die PHP-Dateien in den PHP-FPM-Container kopiert werden Damit dieses System funktioniert. Würde ein gemounteter Shared Data Container dieses Problem lösen?
ojrask
Wenn Sie Daten (z. B. die PHP-Dateien) zwischen Containern austauschen müssen, sind Volumes der richtige Weg, Sie können sie aus anderen Containern (sogar mit dedizierten Daten) oder dem realen Dateisystem bereitstellen. Das Apache-Modul war früher der schnellste Weg, um PHP-Code auszuführen. Es enthält nur PHP-Code und keine statischen Dateien. Eine obere Ebene für den statischen / cachefähigen Inhalt (d. H. Lack) könnte eine gute Kombination sein.
gmuslera
3

Ich weiß, dass dies bereits beantwortet wurde, aber ich wollte noch einen Schritt weiter gehen und Ihnen ein Beispiel dafür zeigen, wie dies getan werden könnte, um eine vollständigere Antwort zu geben.

In meinem Docker-Bild finden Sie Anweisungen zur Verwendung. Hier erfahren Sie, wie Sie zwei Sites konfigurieren. Https://hub.docker.com/r/vect0r/httpd-proxy/

Wie Jihun sagte, müssen Sie sicherstellen, dass Sie Ihre vhost-Konfiguration eingestellt haben. In meinem Beispiel wird Port 80 zum Anzeigen einer Testsite example.com und 81 zum Anzeigen der Testsite example2.com verwendet. Es ist auch wichtig zu beachten, dass Sie Ihren Inhalt angeben und erforderliche Ports in Ihrer Docker-Datei verfügbar machen müssen, wie z.

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"]

Hoffe, dies hilft, den Prozess ein wenig mehr zu erklären. Für weitere Fragen stehe ich Ihnen gerne zur Verfügung.

Grüße,

V

Vect0r
quelle
Ich habe auch die Dateien hochgeladen, mit denen dieses Bild auf Github erstellt wurde. github.com/V3ckt0r/docker-httpd-proxy
Vect0r
1

In meinem Fall musste ich SSLProxyEngine On , ProxyPreserveHost On und RequestHeader hinzufügen und Front-End-Https auf "On" setzen, da ich SSL für den Docker-Container aktivieren wollte. Über den local.hostname.ofDockerHost lautete in meinem Fall der Name des Hostservers , auf dem der Docker-Container ausgeführt wird, lucas , und der Port, der Port 443 des Docker-Containers zugeordnet ist, war 1443 (da Port 443 bereits von Apache auf dem Host verwendet wurde) Server), so dass die Zeile endete auf diese Weise https: // lucas: 1443 /

Dies ist das endgültige Setup und es funktioniert einwandfrei!

<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>

Schließlich musste ich im Docker-Container Proxy-SSL-Header einrichten. In meinem Fall lief auf dem Container Nginx und so etwas wie Omnibus zum Einrichten von Ruby-Apps. Ich denke, dass dies auch in einer Nginx-Konfigurationsdatei eingerichtet werden kann. Ich werde es aufschreiben, falls jemand dies hilfreich findet

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'

Komplette Anleitung für Apache, ISP Config, Ubuntu Server 16.04 hier https://www.howtoforge.com/community/threads/subdomain-or-subfolder-route-requests-to-running-docker-image.73845/#post-347744

razor7
quelle