Wie sehen die Prozesse in einem Docker-Container aus?

33

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?

slm
quelle
3
Obwohl es nicht genau ist (und warum ich es nicht als Antwort schreibe), fällt es mir leichter, Docker als eine ausgefallene Chroot zu betrachten, als eine virtuelle Maschine. Das ist nicht genau, aber es hilft, wenn ich es mir in meinem Kopf vorstelle.
Coteyr
2
@coteyr - es ist lustig, dass Sie diese Analogie erwähnen. Ich habe genau diese verwendet, als ich versuchte zu beschreiben, was Docker ebenfalls tut. IMO Docker hat viel mehr mit Chroot zu tun als mit Virtualisierung.
SLM

Antworten:

53

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.

$ docker run -it ubuntu:latest /bin/bash
root@c0c5c54062df:/#

Nun aus diesem Container heraus, wenn wir laufen ps -eaf:

    ss01

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:

    ss02

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 1000Befehlen, die im Hintergrund ausgeführt werden.

    ss03

Beachten Sie, wie den Prozessen im Docker-Container die Prozess-IDs (PIDs) 48-51 zugewiesen werden. Sehen Sie sie in der ps -eafAusgabe auch in:

    ss04

Mit diesem nächsten Bild wird jedoch ein Großteil der "Magie" offenbart, die Docker ausführt.

    ss05

Sehen Sie, wie die 4 sleep 1000Prozesse tatsächlich nur untergeordnete Prozesse zu unserem ursprünglichen Bash-Prozess sind? Beachten Sie auch, dass unser ursprünglicher Docker-Container auch /bin/bashfür den Docker-Daemon ein untergeordneter Prozess ist.

Wenn wir nun mehr als 1000 Sekunden warten, bis die ursprünglichen sleep 1000Befehle beendet sind, und dann vier weitere Befehle ausführen und einen weiteren Docker-Container wie folgt starten:

$ docker run -it ubuntu:latest /bin/bash
root@450a3ce77d32:/#

Die Ausgabe des Hostcomputers von ps -eafwürde folgendermaßen aussehen:

    ss06

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.

slm
quelle
Docker erstellt außerdem einen isolierten Benutzerbereich für jeden ausgeführten Container.
Bhargav Nanekalva
3

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.

mckenzm
quelle
1
Bearbeitet, dachte ich mit einer alten Xen-Kappe. Dies ist natürlich nicht der Fall, wenn Sie Windows unter KVM / Qemu oder eine 64-Bit-VM auf einem 32-Bit-Host unter VirtualBox ausführen. (frag nicht). Es ähnelt dem Argument pv vs hvm für AWS.
McKenzm