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
:
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:
$ docker run -it ubuntu:latest /bin/bash
root@450a3ce77d32:/#
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.