Warum verwenden wir ein OS Base Image mit Docker, wenn Container kein Gastbetriebssystem haben?

83

Ich habe gerade angefangen, Docker zu studieren und es gibt etwas, das für mich ziemlich verwirrend ist. Wie ich auf der Docker-Website gelesen habe, unterscheidet sich ein Container von einer virtuellen Maschine. Wie ich verstanden habe, ist ein Container nur eine Sandbox, in der ein gesamtes isoliertes Dateisystem ausgeführt wird.

Ich habe auch gelesen, dass auf einem Container kein Gastbetriebssystem installiert ist. Stattdessen stützt es sich auf den zugrunde liegenden Betriebssystemkern.

All das ist in Ordnung. Ich bin verwirrt, dass es Docker-Images gibt, die nach Betriebssystemen benannt sind. Wir sehen Bilder wie Ubuntu, Debian, Fedora, CentOS und so weiter.

Mein Punkt ist: Was sind diese Bilder wirklich? Wie ist es anders, einen Container basierend auf dem Debian-Image zu erstellen als eine virtuelle Maschine zu erstellen und Debian zu installieren?

Ich dachte, Container hätten kein Gastbetriebssystem installiert, aber wenn wir Images erstellen, stützen wir sie auf ein Image, das nach einem Betriebssystem benannt ist.

In den Beispielen, die wir gesehen haben docker run ubuntu echo "hello world", scheint es, als würden wir eine VM mit Ubuntu hochfahren und den Befehl ausführen lassen echo "hello world".

Genauso docker run -it ubuntu /bin/bashscheint es , als würden wir eine VM mit Ubuntu hochfahren und über die Befehlszeile darauf zugreifen.

Worum geht es bei diesen Images, die nach Betriebssystemen benannt sind? Wie unterschiedlich ist es, einen Container mit einem dieser Images auszuführen und eine VM mit dem entsprechenden Gastbetriebssystem hochzufahren?

Ist die Idee, dass wir nur den Kernel mit dem Host-Betriebssystem teilen (und folglich Zugriff auf die zugrunde liegenden Maschinenhardwareressourcen haben, ohne dass Hardware virtualisiert werden muss), aber trotzdem die Dateien und Binärdateien jedes unterschiedlichen Systems auf den Containern in der richtigen Reihenfolge verwenden zur Unterstützung aller Anwendungen, die wir ausführen möchten?

user1620696
quelle
2
Meiner Meinung nach sind Ihre Ziele bei der Virtualisierung die Schlüssel. Wenn Sie Bibliotheken, Sprachen usw. für das Betriebssystem benötigen, sind die Betriebssystemcontainer für Ihre Anforderungen geeignet. Wenn Sie jedoch nur Anwendungen als Komponenten benötigen, müssen Sie das Betriebssystem nicht als Basisimage verwenden. Ich denke , dieser Artikel erklären könnte es deutlich blog.risingstack.com/...
Metamorph

Antworten:

68

Da alle Linux-Distributionen den gleichen Linux-Kernel ausführen (yup, es ist ein bisschen vereinfacht) und sich nur in der Userland-Software unterscheiden, ist es ziemlich einfach, eine andere Distributionsumgebung zu simulieren - indem Sie einfach diese Userland-Software installieren und so tun, als wäre es eine andere Distribution. Wenn Sie CentOS-Container in Ubuntu OS installieren, erhalten Sie das Userland von CentOS, während derselbe Kernel ausgeführt wird, nicht einmal eine andere Kernelinstanz.

So leichtgewichtige Virtualisierung ist wie im gleichen O isoliert Abteile. Au contraire echte Virtualisierung hat ein anderes vollwertiges Betriebssystem im Host-Betriebssystem. Deshalb kann docker unter Linux weder FreeBSD noch Windows ausführen.

Wenn das einfacher wäre, können Sie sich vorstellen, dass Docker eine sehr ausgefeilte und fortschrittliche Chroot-Umgebung ist.

Drookie
quelle
3
Deshalb kann ich meinen kompilierten Golang-Code im leeren Scratch-Container hosten - weil der kompilierte Code nur den Kernel benötigt?
Francis Norton
Woher weiß das Gastbetriebssystem, dass es den Kernel des Hostbetriebssystems verwendet (und wie?)? AFAIK, die Docker-Image-Datenbanken verwenden Standard-OS-Images. In Ihrem Beispiel ist es nicht so, als gäbe es einen benutzerdefinierten CentOS-Build, der den übergeordneten Kernel verwendet? Oder ist es so einfach wie ein Dateisystem-Trick (aufs), bei dem Docker die Lesevorgänge der Gäste (CentOS) von / boot zum Host (Ubuntu) umleitet? In diesem Fall würde der Gast (CentOS) eine eigene Kopie von / boot installieren, diese würde jedoch nie gelesen werden.
James S
Ich mag Ihre Erklärung, aber wie erklären Sie dann das Ausführen von Linux-Containern unter Windows? Enthalten Server 2016 und Windows 10 einen Linux-Kernel, um die Verwendung von Docker zu ermöglichen? Sind diese Versionen deshalb notwendig?
duct_tape_coder
Dies ist ganz einfach: Sie werden nur unter einem vollwertigen Virtualisierungsstapel von Hyper-V in einer nativen Linux-VM ausgeführt: docs.microsoft.com/en-us/virtualization/windowscontainers/… .
Drookie
1

Container laufen auf einem Kernel. Mit anderen Worten, alle Container haben einen einzelnen Kernel (Host-Betriebssystem). Andererseits haben Hypervisoren mehrere Kernel. Jede virtuelle Maschine läuft auf einem anderen Kernel.

Und "Docker Run Ubuntu" ist wie das Erstellen einer Chroot-Umgebung.

Shiv Sandhu
quelle