Es kann hilfreich sein, zwischen Bildern zu unterscheiden und Container (Dokumente). Ein Bild ist statisch und lebt nur auf der Festplatte. Ein Container ist eine laufende Instanz eines Bildes und es enthält einen eigenen Prozessbaum sowie RAM und andere Laufzeitressourcen.
Ein Bild ist eine logische Gruppierung von Ebenen plus Metadaten darüber, was beim Erstellen eines Containers zu tun ist und wie die Ebenen zusammengesetzt werden. Ein Teil dieser Metadaten besteht darin, dass jede Ebene die ID ihrer übergeordneten Ebene kennt.
Was kommt also in eine Schicht? Die Dateien (und Verzeichnisse), die Sie der übergeordneten Datei hinzugefügt haben. Es gibt auch spezielle Dateien ("whiteout"), die anzeigen, dass etwas von der übergeordneten Datei gelöscht wurde.
Wenn Sie docker run
ein Bild, docker
erstellt einen Container:Er entpackt alle Schichten in der richtigen Reihenfolge und erstellt ein neues "Root"-Dateisystem, das vom Host getrennt ist. docker
liest auch die Image-Metadaten und startet entweder den "Einstiegspunkt" oder den "Befehl", der beim Erstellen des Images angegeben wurde - das startet einen neuen Prozess-Unterbaum. Aus dem Container heraus erscheint dieser erste Prozess wie die Wurzel des Baums, aber vom Host aus können Sie sehen, dass es sich um einen Unterbaum von Prozessen handelt.
Das Root-Dateisystem unterscheidet eine Linux-Distribution von einer anderen (es kann auch einige Kernel-Modul-Unterschiede und Bootloader-/Boot-Dateisystem-Unterschiede geben, aber diese sind normalerweise für die laufenden Prozesse unsichtbar). Der Kernel wird mit dem Host geteilt und verwaltet tatsächlich immer noch seine üblichen Verantwortlichkeiten innerhalb des Containers. Aber das Root-Dateisystem ist anders, und wenn Sie sich im Container befinden, sieht es aus und fühlt sich an, als ob die Distribution im Docker-Image war.
Der Container verfügt nicht nur über ein eigenes Dateisystem und einen eigenen Prozessbaum, sondern auch über eine eigene logische Netzwerkschnittstelle und optional über eine eigene Zuweisung von RAM und CPU-Zeit. Sie als Betreiber haben jedoch die Kontrolle über den Container, sodass Sie entscheiden können, die Netzwerkschnittstelle des Hosts mit dem Container zu teilen, ihm unbegrenzten Zugriff auf RAM und CPU zu gewähren und sogar Geräte, Dateien und Verzeichnisse vom Host in den zu mounten Container. Standardmäßig werden die Dinge getrennt gehalten, aber Sie haben die Möglichkeit, das Isolationsmodell so weit wie nötig zu durchbrechen.
Docker ist ein Wrapper für LXC-Linux-Container, und die Dokumentation dazu informiert Sie im Detail darüber, was gemeinsam genutzt wird und was nicht.
Im Allgemeinen sieht/enthält der Hostcomputer alles in den Containern, vom Dateisystem bis zu Prozessen usw. Sie können einen ps-Befehl auf der Host-VM ausführen und Prozesse im Container anzeigen.
Denken Sie daran, dass Docker-Container keine VMs sind – daher läuft eigentlich alles nativ auf dem Host und verwendet den Host-Kernel direkt. Jeder Container hat seinen eigenen Benutzernamensraum (ähnlich wie bei alten Root-Jails). Es gibt Tools/Funktionen, die sicherstellen, dass Container nur ihre eigenen Prozesse sehen, ein eigenes Dateisystem haben, das auf das Host-Dateisystem geschichtet ist, und einen Netzwerkstapel, der zum Host-Netzwerkstapel geleitet wird.