OS Docker Container: Was ist dann der Unterschied zu einer VM?

10

Was bringt es, ein Betriebssystem in einem Docker-Container zu verwenden?

Im Docker-Repository finden Sie ein Ubuntu-Docker-Image: https://registry.hub.docker.com/_/ubuntu/ Ich dachte, Docker ist mehr auf der "App" -Ebene.

Was sind dann die Unterschiede zwischen einem Ubuntu-Docker-Container und einer Ubuntu Virtual Machine? Wenn Sie ein gesamtes Betriebssystem in einem Docker-Container haben, ist es dann nicht sinnlos, Docker zu verwenden?

Vielen Dank

Michael
quelle

Antworten:

11

Ihnen fehlen grundlegende Docker-Konzepte. Es ist eine ganz andere Sache.

Das erste, was Sie wissen müssen, ist die Philosophie von Docker: Führen Sie einen Prozess isoliert in einem Container aus. Sie führen kein Betriebssystem in einem Docker-Container aus, sondern einen Prozess in einem Container mit einem Root-Dateisysteminhalt, der auf einer Linux-Distribution Ihrer Wahl basiert. Ubuntu ist unter anderem eine Wahl.

Nun sollten Sie sich fragen, wie es möglich ist, einen Prozess in einem Linux-Basisimage auszuführen, der sich von der Linux-Distribution unterscheidet, mit der Ihr Host ausgeführt wird. Damit ein Betriebssystem ausgeführt werden kann, benötigen Sie grundsätzlich:

  • Ein Boot-Dateisystem: Enthält den Bootloader und den Kernel, die sich nach dem Laden im Speicher befinden. Bei Docker-Containern ist uns das egal, da der Kernel mit dem Host geteilt wird und der gemeinsame Teil aller Linux-Distributionen ist.
  • Ein Root-Dateisystem: Enthält die Dateisystemstruktur. Es kann von einer Linux-Distribution zur anderen unterschiedlich sein. Es ist schreibgeschützt, bis die Startsequenz beendet ist.

Docker verwendet UnionFS, um Schichten von Plattenblöcken in einem Container zu verwalten, damit Sie sie stapeln können.

Hinter den Kulissen wird ein Union Mount verwendet, mit dem mehrere Dateisysteme gleichzeitig gemountet werden können und wie ein ganzes virtuelles erscheinen. Tatsächlich wird die Basis-Image-Ebene im schreibgeschützten Modus als Lese- / Schreibmodus über dem Basis-Root-Dateisystem abgelegt.

Hier haben Sie einen Stapel von Festplattenblöcken, die so geschichtet sind, dass die Linux-Distribution, von der das Basis-Image stammt, dasselbe Dateisystem enthält, sobald es auf einem echten Host installiert ist, diesmal jedoch in einem Container.

Das Letzte, was jetzt fehlt, ist: Wie lässt du dieses Ding isoliert laufen?

Die Antwort lautet: Namespaces. Ich werde hier nicht auf die Details eingehen, da dies etwas von der ursprünglichen Frage abweichen würde. Was Sie jedoch wissen müssen, ist, dass seit Kernel 2.4.19 im Laufe der Jahre Namespaces verschiedener Art aufgetaucht sind. Derzeit sind folgende Namespaces verfügbar:

  • IPC: IPC-Namespace (Interprozesskommunikation)
  • MNT: Mount-Namespace
  • NET: Netzwerk-Namespace
  • PID: PID-Namespace
  • USER: Benutzernameraum (UID)
  • UTS: UTS-Namespace (Hostnamen)

Namespaces sind isolierte Strukturen im Kernel, mit denen Prozesse in einer bestimmten Umgebung ausgeführt werden können. Zum Beispiel ist der MNT-Namespace das Hauptmerkmal, um einen Prozess in den Besonderheiten des Basis-Image-Stammdateisystems zum Laufen zu bringen. Der NET-Namespace ist eine weitere wichtige Funktion für einen Container, der über bestimmte Netzwerkschnittstellen verfügt, um mit der Docker-Brücke usw. zu kommunizieren.

Ja, der Hauptzweck all dessen ist es, eine Anwendung isoliert auszuführen und sie in einer Box namens Container problemlos aus Ihrer lokalen Umgebung an die Produktion zu senden.

Es wäre eine gute Idee, die Docker-Dokumentation zu lesen , bevor Sie sich weiter damit befassen .

Xavier Lucas
quelle
Danke, bedeutet das, dass ein "Ubuntu" -Bild wie dieses: registry.hub.docker.com/_/ubuntu für sich genommen "keinen Sinn" macht und als Basis für definierte Container wie einen "Nginx-Container" dient? Ich weiß nicht, ob ich Sinn mache?
Michael
Ja, das tust du. Genau dafür wird es verwendet. Und in der Regel werden Sie Leute nennen sie hören Basis Bilder aus diesem Grund.
Xavier Lucas
Ich habe die Dokumentation durchgesehen und eines bin ich mir nicht sicher. Angenommen, die Größe des Ubuntu-Bildes beträgt 140 MB. Dann fügt ein anderes Bild, das auf diesem Bild basiert, 10 weitere MB hinzu. Wenn ich 2 Container von diesem Image aus starte, ist jeder Container 150 MB groß und ich benötige 300 MB Festplattenspeicher ODER bleibt die Gesamtgröße 150 MB? Vielen Dank
Michael
Wow, ich habe gerade das offizielle Python-Image heruntergeladen und die virtuelle Größe beträgt 802,4 MB. Das Herunterladen dauerte eine Weile. Wenn ich 10 Container davon laufen lasse, wie viel Platz nehmen die Container ein? Vielen Dank
Michael
2
@YAmikep Einige Bilder können aufgrund von Abhängigkeiten, die nicht ordnungsgemäß bereinigt wurden, groß sein. Wenn Sie 10 Container mit demselben Image starten, bedeutet dies nicht, dass der verwendete Speicherplatz zehnmal so groß ist wie das Image. Sie laden ein Image nicht einmal herunter, sondern führen es aus mehreren Containern aus. Docker verwendet Copy-on-Write, wenn mehrere Container von demselben Image ausgeführt werden. Dies bedeutet im Grunde, dass das Image nur dann zwischen Containern geteilt und eine private Kopie einer Datei in einem Image erstellt wird, wenn der Container es hinzufügt / ändert. Die tatsächlich verwendete Größe hängt also von der Aktivität in Containern ab, nicht von der Anzahl der Läufe.
Xavier Lucas