Ich habe in letzter Zeit mehrmals Verwirrung darüber erfahren, was ein Docker-Container ist und was darin vor sich geht, in Bezug auf Befehle und Prozesse, die ich in einem Docker-Container aufrufe.
Kann jemand bitte einen allgemeinen Überblick darüber geben, was los ist?
Antworten:
Docker wird in den Virtualisierungseimer geworfen, weil die Leute annehmen, dass es sich um eine Virtualisierung der darunter liegenden Hardware handelt. Dies ist eine falsche Bezeichnung, die sich aus der Terminologie ergibt, die Docker verwendet, hauptsächlich den Begriff Container.
Docker tut jedoch nichts Magisches in Bezug auf die Virtualisierung der Hardware eines Systems. Vielmehr nutzt es die Fähigkeit des Linux-Kernels, "Zäune" um Schlüsseleinrichtungen herum zu konstruieren, wodurch ein Prozess mit Ressourcen wie dem Netzwerk, dem Dateisystem und Berechtigungen (unter anderem) interagieren kann, um die Illusion zu vermitteln, dass Sie interagieren mit einem voll funktionsfähigen System.
Hier ist ein Beispiel, das zeigt, was passiert, wenn wir einen Docker-Container starten und ihn dann über den Aufruf von eingeben
/bin/bash
.Nun aus diesem Container heraus, wenn wir laufen
ps -eaf
:Wenn Sie zu einer anderen Terminalregisterkarte wechseln, auf der wir bei dem Hostsystem angemeldet sind, auf dem sich der Docker-Container befindet, wird der Prozessbereich angezeigt, den der Container "tatsächlich" belegt:
Wenn wir nun zur Registerkarte Docker zurückkehren und mehrere Prozesse darin starten und alle im Hintergrund anzeigen, können wir sehen, dass jetzt mehrere untergeordnete Prozesse unter dem primären Bash-Prozess ausgeführt werden, den wir ursprünglich als Teil des Docker-Container-Starts gestartet haben.
HINWEIS: Die Prozesse bestehen aus 4
sleep 1000
Befehlen, die im Hintergrund ausgeführt werden.Beachten Sie, wie den Prozessen im Docker-Container die Prozess-IDs (PIDs) 48-51 zugewiesen werden. Sehen Sie sie in der
ps -eaf
Ausgabe auch in:Mit diesem nächsten Bild wird jedoch ein Großteil der "Magie" offenbart, die Docker ausführt.
Sehen Sie, wie die 4
sleep 1000
Prozesse tatsächlich nur untergeordnete Prozesse zu unserem ursprünglichen Bash-Prozess sind? Beachten Sie auch, dass unser ursprünglicher Docker-Container auch/bin/bash
für den Docker-Daemon ein untergeordneter Prozess ist.Wenn wir nun mehr als 1000 Sekunden warten, bis die ursprünglichen
sleep 1000
Befehle beendet sind, und dann vier weitere Befehle ausführen und einen weiteren Docker-Container wie folgt starten:Die Ausgabe des Hostcomputers von
ps -eaf
würde folgendermaßen aussehen:Andere Docker-Container werden nur als Prozesse im Docker-Daemon angezeigt.
Wie Sie sehen, virtualisiert Docker nicht wirklich ( im herkömmlichen Sinne ), sondern erstellt "Zäune" um die verschiedenen Kernel-Ressourcen und schränkt deren Sichtbarkeit für einen bestimmten Prozess + für Kinder ein.
quelle
Innerhalb des Containers sollten Ihre Prozesse isoliert (unter Quarantäne gestellt) sein. Tatsächlich sollten Sie keine anderen Prozesse als die von Ihnen angegebenen sehen (zumindest eine Shell). Es ist nicht zum Testen der "Geselligkeit" gedacht. Die einzige Ähnlichkeit mit chroot besteht darin, dass der Host-Kernel verwendet wird. Docker eignet sich hervorragend, wenn Sie etwas isolieren oder andere Versionen der Plattformarchitektur-Software verwenden müssen als die, die auf dem Host ausgeführt wird. (Sehr alte Versionen von Java oder eine andere Version von Python sagen). Beachten Sie unbedingt, dass die Ordner und Binärdateien, mit denen Sie arbeiten, möglicherweise nicht mit denen auf dem Host übereinstimmen. Es ist nicht derselbe Ordner / bin usw.
EDIT: Ähnlichkeit mit chroot eher als mit VMs.
quelle