In vielen Blogeinträgen und allgemeiner Meinung gibt es ein Sprichwort, das lautet "ein Prozess pro Container".
Warum gibt es diese Regel? Warum nicht ntp, nginx, uwsgi und mehr Prozesse in einem einzigen Container ausführen, in dem alle Prozesse funktionieren müssen?
Blog-Posts, die diese Regel erwähnen:
- "Einzelprozess pro Container ist ein empfohlenes Entwurfsmuster für Docker-Anwendungen."
- "Docker dient nur zum Erstellen von Einzelprozess- oder Einzelservice-Containern."
- "Besser ein Prozess pro Container"
- "Einen einzelnen Dienst als Container ausführen"
- "Ein Prozess pro Container"
- "Ein Prozess pro Container"
docker
containers
Evgeny
quelle
quelle
Antworten:
Vergessen wir für einen Moment die hochrangigen architektonischen und philosophischen Argumente. Während es einige Randfälle gibt, in denen mehrere Funktionen in einem einzelnen Container sinnvoll sein können, gibt es sehr praktische Gründe, warum Sie als Faustregel in Betracht ziehen sollten, "eine Funktion pro Container" zu befolgen:
Beachten Sie, dass ich Funktion sage, nicht verarbeiten. Diese Sprache ist veraltet. In der offiziellen Docker-Dokumentation wird nicht mehr "ein Prozess", sondern "ein Anliegen" pro Container empfohlen.
quelle
Nachdem ich vor ein paar Tagen einen Container mit "zwei Prozessen" erschlagen hatte, gab es einige Probleme, die mich veranlassten, zwei Container anstelle eines Python-Skripts zu verwenden, das zwei Prozesse startete:
quelle
Die Empfehlung ergibt sich aus dem Ziel und dem Design der Virtualisierung auf Betriebssystemebene
Container wurden so konzipiert, dass sie einen Prozess für andere isolieren, indem sie ihm einen eigenen Benutzerbereich und ein eigenes Dateisystem geben.
Dies ist die logische Weiterentwicklung, bei
chroot
der ein isoliertes Dateisystem bereitgestellt wurde. Der nächste Schritt bestand darin, Prozesse von den anderen zu isolieren, um ein Überschreiben des Speichers zu vermeiden und die Verwendung derselben Ressource (z. B. TCP-Port 8080) aus mehreren Prozessen ohne Konflikte zu ermöglichen.Das Hauptinteresse an einem Container ist es, die benötigte Bibliothek für den Prozess zu packen, ohne sich über Versionskonflikte Gedanken zu machen. Wenn Sie mehrere Prozesse ausführen, für die zwei Versionen derselben Bibliothek im selben Benutzerbereich und Dateisystem erforderlich sind, mussten Sie mindestens LDPATH für jeden Prozess anpassen, damit die richtige Bibliothek zuerst gefunden wird und einige Bibliotheken nicht auf diese Weise angepasst werden können. Da ihr Pfad in der ausführbaren Datei zum Zeitpunkt der Kompilierung fest codiert ist, finden Sie in dieser SO-Frage weitere Informationen.
Auf Netzwerkebene müssen Sie jeden Prozess konfigurieren, um die Verwendung derselben Ports zu vermeiden.
Das Ausführen mehrerer Prozesse im selben Container erfordert einige Feinabstimmungen und kann letztendlich den Zweck der Isolation zunichte machen. Wenn Sie mehrere Prozesse im selben Benutzerbereich ausführen und dasselbe Dateisystem und dieselben Netzwerkressourcen gemeinsam nutzen können, warum sollten Sie sie dann nicht ausführen? auf dem Host selbst?
Hier ist die nicht erschöpfende Liste der starken Optimierungen / Fallstricke, die mir einfallen:
Umgang mit den Protokollen
Entweder mit einem gemounteten Volume oder interleaved on stdout bringt dies etwas Management. Wenn Sie ein bereitgestelltes Volume verwenden, sollte Ihr Container einen eigenen "Platz" auf dem Host haben, oder zwei gleiche Container kämpfen um dieselbe Ressource. Wenn Sie die Vorteile von stdout nutzen
docker logs
, kann dies zu einem Albtraum für die Analyse werden, wenn die Quellen nicht einfach identifiziert werden können.Vorsicht vor Zombieprozessen
Wenn einer Ihrer Prozesse in einem Container abstürzt, kann Supervisord die untergeordneten Elemente in einem Zombie-Status möglicherweise nicht bereinigen, und der Host-Init erbt sie niemals. Sobald Sie die Anzahl der verfügbaren Pids erschöpft haben (2 ^ 22, also ungefähr 4 Millionen), werden einige Dinge scheitern.
Trennung von Bedenken
Wenn Sie zwei getrennte Dinge ausführen, z. B. einen Apache-Server und einen Logstash im selben Container, vereinfacht dies möglicherweise die Protokollverarbeitung, Sie müssen jedoch Apache herunterfahren, um den Logstash zu aktualisieren. (In Wirklichkeit sollten Sie den Protokollierungstreiber von Docker verwenden.) Warten Sie nicht länger, bis die aktuellen Sitzungen beendet sind, oder nicht? Wenn es ein würdevoller Stopp ist, kann es einige Zeit dauern und lang werden, um die neue Version zu rollen. Wenn Sie einen Kill ausführen, haben Sie Auswirkungen auf die Benutzer eines Protokollversenders. Dies sollte meiner Meinung nach vermieden werden.
Wenn Sie über mehrere Prozesse verfügen, reproduzieren Sie ein Betriebssystem. In diesem Fall entspricht die Verwendung einer Hardwarevirtualisierung eher dieser Anforderung.
quelle
Wie in den meisten Fällen ist es nicht alles oder nichts. Die Richtlinie "Ein Prozess pro Container" basiert auf der Idee, dass Container einem bestimmten Zweck dienen sollen. Beispielsweise sollte ein Container nicht gleichzeitig eine Webanwendung und ein Redis-Server sein.
In einigen Fällen ist es sinnvoll, mehrere Prozesse in einem einzigen Container auszuführen, sofern beide Prozesse eine einzige, modulare Funktion unterstützen.
quelle
Der Prozess, den ich hier als Service bezeichne, 1 Container ~ 1 Service . Wenn einer meiner Services fehlschlägt, drehe ich nur den entsprechenden Container hoch und innerhalb von Sekunden ist alles wieder aktiv. Es gibt also keine Abhängigkeiten zwischen den Diensten. Es wird empfohlen, die Containergröße auf weniger als 200 MB und maximal 500 MB zu beschränken (Ausnahme: Windows-native Container haben eine Größe von mehr als 2 GB). Andernfalls entspricht dies der Leistung einer virtuellen Maschine, was jedoch nicht unbedingt ausreicht. Berücksichtigen Sie außerdem einige Parameter als Skalierung, wie kann ich die Ausfallsicherheit meiner Dienste erhöhen, eine automatische Bereitstellung durchführen usw.
Und es ist nur Ihre Aufgabe, wie Sie Ihre Architekturmuster wie Micro-Service in Polygot-Umgebungen mit der Containertechnologie gestalten können, die am besten zu Ihrer Umgebung passt und die Dinge für Sie automatisiert.
quelle