2014-12-08 9 views
11

Angesichts der Tatsache, dass Docker Bilder/Container in verschiedenen Geschmacksrichtungen kommen - Ubuntu, CentOS, CoreOS etc .... Ich bin gespannt, was eigentlich ein Bild/Container ausmacht, und was ist mit dem Host-Betriebssystem geteilt? Wo ist die Trennlinie?Was ist in einem Docker-Bild/Container?

Zum Beispiel kann ich das Basis-Ubuntu-Image herunterladen und es auf einem CentOS-Host starten. Wenn ich dann innerhalb des Ubuntu-Containers stöbere, kann ich sehen, dass es wie ein Ubuntu-Server aussieht und sich anfühlt (Dateisystem-Layout usw.). Aber wenn ich einen uname Befehl ausführe, sehe ich den Kernel und dergleichen des CentOS-Hosts ....

Offensichtlich verstehe ich, dass der zugrunde liegende Kernel von allen Containern auf dem gleichen Host geteilt wird. Aber was sonst wird mit dem Host-Betriebssystem geteilt, und was ist Teil des Bildes/Container?

z. Der Kernel ist Teil des Hosts, das Dateisystemlayout ist Teil des Image/Containers ... Gibt es eine Spezifikation, die dies definiert?

Antwort

0

Docker ist ein Wrapper über LXC Linux-Container und die Dokumentation dafür wird Sie im Detail darüber informieren, was geteilt wird und was nicht.

Im Allgemeinen sieht/enthält die Host-Maschine alles, was sich in den Containern befindet, vom Dateisystem bis zu Prozessen usw. Sie können einen Befehl ps auf der Host-VM ausgeben und Prozesse innerhalb des Containers 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 Benutzernamen-Namensraum (ähnlich den alten Root-Bunkern). Es gibt Werkzeuge/Funktionen, die sicherstellen, dass Container nur ihre eigenen Prozesse sehen, wenn sie ein Dateisystem besitzen, das auf das Host-Dateisystem geschichtet ist, und einen Netzwerk-Stack, der an den Host-Netzwerk-Stack leitet.

+0

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? –

+0

Genau, es gibt einige Möglichkeiten, den Container zu tweeken, wo Sie den Host-Stack direkt verwenden können, aber ansonsten alle Namespaces. –

+5

Docker verlässt sich seit März nicht standardmäßig auf LXC. – icecrime

14

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.

+0

Danke, das ist super hilfreich. Ich war wirklich verwirrt, was ein Bild ist und wie es sich auf das Host-Betriebssystem bezieht. Die Dokumente auf der Website scheinen dies nicht sehr gut zu erklären, aber Ihre Antwort hier tut es. –

Verwandte Themen