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.