Es kann hilfreich sein, zwischen Bilder zu unterscheiden und Behälter (docs). Ein Bild ist statisch und lebt nur auf der Festplatte. Ein Container ist eine laufende Instanz eines Image und es enthält einen eigenen Prozessbaum sowie RAM und andere Laufzeitressourcen.
Ein image ist eine logische Gruppierung von Layern plus Metadaten darüber, was beim Erstellen eines Containers und beim Assemblieren der Layer zu tun ist. Ein Teil dieser Metadaten besteht darin, dass jede Ebene die ID ihrer Eltern kennt.
Also, was geht in eine Schicht? Die Dateien (und Verzeichnisse), die Sie dem übergeordneten Objekt hinzugefügt haben. Es gibt auch spezielle Dateien ("whiteout"), die anzeigen, dass etwas vom Elternteil gelöscht wurde.
Wenn Sie docker run
ein Bild, docker
erstellt einen Container: Es entpackt alle Schichten in der richtigen Reihenfolge, ein neues "root" -Dateisystem getrennt vom Host erstellen. docker
liest auch die Bild-Metadaten und startet entweder den "entrepoint" oder den "command", der bei der Erstellung des Bildes angegeben wurde - und startet einen neuen Prozess-Unterbaum. Dieser erste Prozess erscheint innerhalb des Containers wie die Wurzel des Baums, aber vom Host aus können Sie sehen, dass es sich um einen Teilbaum von Prozessen handelt.
Das Root-Dateisystem unterscheidet eine Linux-Distribution von einer anderen (es kann auch Unterschiede im Kernel-Modul und Unterschiede zwischen Bootloader und Boot-Dateisystem geben, die für die laufenden Prozesse normalerweise nicht sichtbar sind). Der Kernel wird mit dem Host geteilt und verwaltet tatsächlich seine üblichen Verantwortlichkeiten innerhalb des Containers.Das Root-Dateisystem ist jedoch anders, und wenn Sie sich innerhalb des Containers befinden, sieht es so aus und fühlt sich an, wie auch immer die Distribution im Docker-Image war.
Der Container hat nicht nur ein eigenes Dateisystem und einen eigenen Prozessbaum, sondern auch eine eigene logische Netzwerkschnittstelle und optional eine eigene Zuweisung von RAM und CPU-Zeit. Sie haben jedoch die Kontrolle über den Container als Betreiber, so dass Sie entscheiden können, die Netzwerkschnittstelle des Hosts mit dem Container zu teilen, ihm uneingeschränkten Zugriff auf RAM und CPU zu geben und sogar Geräte, Dateien und Verzeichnisse vom Host in die Container. Die Standardeinstellung ist, die Dinge getrennt zu halten, aber Sie haben die Möglichkeit, das Isolationsmodell so weit wie nötig zu durchbrechen.
Also ist das Container-spezifische Zeug Zeug, das über Kernel-Namespaces implementiert ist? So wie jeder Container seinen eigenen PID-Namespace hat, seinen eigenen MNT-Namespace, seinen eigenen Namespace .....? Alles andere ist mit dem Gastgeber geteilt? –
Genau, es gibt einige Möglichkeiten, den Container zu tweeken, wo Sie den Host-Stack direkt verwenden können, aber ansonsten alle Namespaces. –
Docker verlässt sich seit März nicht standardmäßig auf LXC. – icecrime