Was sind die Vorteile des Andockens von Nginx und PHP in verschiedenen Containern?

18

Ich habe gerade angefangen, mit Docker und Kubernetes zu arbeiten, und ich habe mir viele Stapel angesehen, in denen einige Leute nginx + php in einem einzigen Bild und einige ein Bild mit nginx und ein anderes mit php erstellen (den gleichen Pfad mounten und einschließen) beide Container im selben Deployment in Kubernetes).

Was wären die Vorteile, wenn Sie zwei Docker-Images erstellen, anstatt beide nginx + php in einem zu installieren?

CarlosAS
quelle

Antworten:

19

PHP mit nginx wird normalerweise mit php-fpm ausgeführt, was ein separater Prozess ist.

Unter Beibehaltung der Kernidee des Andockens eines Prozesses (siehe Ende der Antwort für weitere Einzelheiten zu diesem Punkt) pro Container ist es sinnvoll, den Nginx-Prozess und den PHP-FPM-Prozess in getrennten Containern zu haben.

Da die Kommunikation zwischen nginx und php-fpm über fastcgi zustande kommt, kann sich der php-fpm-Container auch auf einem separaten Host befinden. Dies ermöglicht die Verwendung eines Clusters von php-fpm-Containern hinter nginx.

Nachdem der Kommentar hier ein wenig mehr Hintergrundinformationen enthält, enthält die Docker-Dokumentation einen Absatz über die Idee, dass ein Container nur ein Anliegen haben sollte .

Die Hauptidee eines Linux-Containers ( lxc ) besteht darin, einen Prozess in einem isolierten Namespace auf CPU- und Speicherebene auszuführen. Docker fügt zusätzlich eine Isolation auf Dateisystemebene hinzu.
Der Vorteil ist, dass die Komprimierung eines Prozesses in diesem Namespace das Lesen des Speichers anderer Prozesse nicht zulässt und daher eine weitere Komprimierung auf dem Host verhindern sollte.

Wenn von nginx und php-fpm die Rede ist, funktionieren sie paarweise, aber jede hat ihre eigenen Probleme, nginx erledigt den HTTP-Teil, das Routing, die Header-Validierung usw. und php-fpm erledigt die Code-Interpretation und gibt den HTML-Teil an nginx zurück . Es ist zwar üblich, dass beide zusammen eine einzige Anwendung bedienen, die jedoch nicht obligatorisch ist.

Je nach Kontext kann es einfacher sein, einen Container mit dem gesamten Stapel für eine Anwendung auf einer Entwickler-Workstation zu haben, zum Beispiel. Aber ideal für den produktiven Einsatz, versuchen , die weniger Interaktion innerhalb des Behälters zu halten, mit supervisord getrennten Prozesse im selben Behälter mit bringt seinen Anteil an der Problem in der Bezeichnung des Zombie - Prozess und Protokollhandling (exemple Geschichte hier dienen nur zur Illustration).

Zum Schluss zitiere ich die Docker-Seite mit einigen Schwerpunkten:

Während "ein Prozess pro Container" häufig eine gute Faustregel ist, ist es keine harte und schnelle Regel. Verwenden Sie nach bestem Wissen und Gewissen, um die Behälter so sauber und modular wie möglich zu halten .

Es gibt keine "Silver Bullet-Regel", die auf alles zutrifft, es ist immer ein Gleichgewicht zwischen der Komplexität innerhalb des Containers und der Komplexität, die die Container selbst orchestriert.

Tensibai
quelle
3
Die Kernidee ist eigentlich "Jeder Container sollte nur ein Problem haben" und "es muss nicht unbedingt so sein, dass es nur einen Betriebssystemprozess pro Container gibt". docs.docker.com/engine/userguide/eng-image/…
user2640621 20.09.17
Ich gebe es eine Abkürzung ist die Idee zu schlagen, nginx ist kein einziger monolithischer Prozess noch ist php-fpm, aber Prozess von der Sorge in meiner Antwort ersetzen und es ist immer noch OK nginx funktioniert das Routing, php-fpm die Interpretation tut
Tensibai
3
Die Antwort ist normalerweise ein Dienst, ein Port pro Container, nicht wirklich ein Prozess. Auf der anderen Seite, wenn Sie mehrere laufende Prozesse in einem Container haben, müssen Sie einige Init-Prozesse, Service-Management, Neustarts, unabhängige Protokollierung und unabhängige Paketabhängigkeiten berücksichtigen. Dies wird etwas komplizierter. Und manchmal wird 1: 1-Mapping beim Skalieren zu 1: n-Mapping.
Jiri Klouda
@Jiri spielt Devil's Advocate: Also sollte sich ein Apache vor einer Rails-App mit einer Postgres-DB in demselben Container befinden? Das ist doch nur eine Dienstleistung aus externer Sicht.
Tensibai
1
@JiriKlouda Antwort geändert, ich hoffe, es ist detailliert genug, um alle in Kommentaren angesprochenen Punkte zu vermitteln.
Tensibai
4

Ein fehlender Punkt ist hier die horizontale Skalierbarkeit. Es gibt einen Artikel von Jamie Alquiza, der sich vor langer Zeit mit Folgendem befasst:

http://archive.is/pDzz0

Kurz gesagt, Sie skalieren Ihre PHP-Fpm horizontal, um eine höhere Leistung zu erzielen. Die gemeinsame Skalierung von Nginx + php-fpm bringt Ihnen keine Vorteile. Ich empfehle Ihnen, einige Stresstests durchzuführen (z. B. Tsung, Gatling usw.; bitte tun Sie nicht Apache ab, das ist ein sehr altes Spielzeug), um zu überprüfen, was in dem Artikel angegeben ist. Ich persönlich habe mehrere reale Erfahrungen gemacht, die bewiesen haben, dass der Artikel im Allgemeinen wahr ist.

Es gibt jedoch zwei Nachteile (möglicherweise nicht für Kubernetes) für Bare-Metal-Maschinen / VMs:

  1. Wie konfiguriere ich Nginx, um dynamisch Änderungen im PHP-FPM-Container zu erkennen? Dies ist der einfache Teil.
  2. Wie können wir nach der Skalierung dieselben Volume- / Dateisysteme gemeinsam nutzen? Nginx- und php-fpm-Container sollten exakt denselben Inhalt lesen, um Konsistenz zu erreichen. Damit haben Sie den wenigsten Puzzleteil (und den spaßigsten Teil), an dem Sie arbeiten müssen.

BEARBEITET: Jetzt ist es fast die Hälfte des Jahres 2019. Das alte Modell, php-fpm + nginx im selben Pod, wird anders verwendet. Wenn Sie mit Service Mesh vertraut sind, dient Nginx (oder was so heißt Nginmesh) als Beiwagen für den Verkehr in Ost-West-Richtung. Ost-West-Verkehr wird hauptsächlich zur Authentifizierung zwischen Diensten oder anderen ausgefallenen Funktionen verwendet, während dies mit reinem PHP-FPM nicht möglich ist.

Ming Hsieh
quelle
3

Es gibt keinen bedeutenden Vorteil, der die Verwaltung von zwei Containern überwiegt. Wenn Sie eine 1: 1-Beziehung zwischen den Prozessen haben und diese einem einzigen Zweck dienen, legen Sie sie in denselben Container.

user2640621
quelle
Meinen Sie verschiedene Bilder auf demselben Container?
CarlosAS
Wie starten Sie nginx und php-fpm im selben Container? Bitte fügen Sie ein Beispiel hinzu.
030
1
@ 030 hier ein Beispiel
CarlosAS
2
@ Carlos Sehr gültiges Beispiel für Entwicklungszwecke, ich würde diese Art von Dingen für den Produktionsgebrauch blockieren (Supervisor in einem Container zu betreiben, kann eine Fußwaffe ziemlich leicht
einschalten
Ich bin mit dieser Antwort nicht einverstanden, da ein Apache-Server mit Mod-Sicherheit mit einem Kater spricht, der mit einem Postgresql-Server spricht, der nur eine App hostet, die in einen einzelnen Container passen sollte.
Tensibai,
-1

Der Vorteil ist: Sie können mehrere PHP-FPM-Container im Back-End (wir nennen es PHP-Cluster) über die Anzahl der Ports ausführen. Beispiel Port 9000, 9001, 9002 usw.

Dylan B
quelle