Frage Warum verwenden wir ein OS-Basis-Image mit Docker, wenn Container kein Gastbetriebssystem haben?


Ich habe gerade begonnen, Docker zu studieren, und da ist etwas, das ziemlich verwirrend für mich ist. Wie ich auf Docker's Website gelesen habe, unterscheidet sich ein Container von einer virtuellen Maschine. Wie ich verstanden habe, ist ein Container nur eine Sandbox, in der ein ganzes isoliertes Dateisystem läuft.

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

All das ist in Ordnung. Was mich verwirrt, ist, 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 Bilder erstellen, basieren sie auf einem Bild, das nach einem Betriebssystem benannt ist.

Auch in Beispielen sah ich, wenn wir es tun docker run ubuntu echo "hello world", Es sieht so aus, als ob wir eine VM mit Ubuntu hochfahren und den Befehl ausführen echo "hello world".

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

Wie auch immer, nach was sind diese Bilder benannt nach Betriebssystemen? Wie anders ist es, einen Container mit einem dieser Images auszuführen und eine VM mit dem entsprechenden Gastbetriebssystem zu starten?

Ist die Idee, dass wir gerade teilen Sie den Kernel mit dem Host-Betriebssystem (und folglich haben wir Zugriff auf die zugrunde liegenden Maschinenhardware-Ressourcen, ohne die Hardware virtualisieren zu müssen), verwenden aber weiterhin die Dateien und Binärdateien jedes anderen Systems auf den Containern, um die von uns gewünschte Anwendung zu unterstützen zu rennen?


60
2018-02-11 16:39


Ursprung


Meiner Meinung nach sind Ihre Ziele in der Virtualisierung die Schlüssel. Wenn Sie Bibliotheken, Sprachen usw. unter OS benötigen, sind OS-Container für Ihre Anforderungen geeignet. Wenn Sie jedoch nur Anwendungen als Komponenten benötigen, ist es nicht erforderlich, das Betriebssystem als Basis-Image zu verwenden. Ich denke, dieser Artikel könnte es deutlich erklären blog.risingstack.com/... - metamorph


Antworten:


Da alle Linux-Distributionen den gleichen (yup, es ist ein bisschen vereinfacht) Linux-Kernel haben und sich nur in der Software von userland 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. Genauer gesagt bedeutet die Installation eines CentOS-Containers in Ubuntu OS, dass Sie das Benutzerland von CentOS erhalten, während Sie immer noch denselben Kernel und nicht einmal eine andere Kernel-Instanz ausführen.

So Leicht Virtualisierung ist wie isolierte Abteile innerhalb des gleichen Betriebssystems. Eine wirkliche Virtualisierung im Gegensatz dazu besteht darin, ein anderes vollwertiges Betriebssystem innerhalb des Host-Betriebssystems zu haben. Aus diesem Grund kann Docker FreeBSD oder Windows nicht in Linux ausführen.

Wenn das einfacher wäre, können Sie denken, Docker ist eine sehr anspruchsvolle und fortschrittliche Chroot-Umgebung.


53
2018-02-11 17:15



Deshalb kann ich meinen kompilierten Golang-Code im leeren Scratch-Container hosten - weil der kompilierte Code nur den Kernel benötigt? - Francis Norton
Wie also kennt das Gastbetriebssystem den Kernel des Host-Betriebssystems (und wie?)? AFAIK, die Docker-Bildbasen verwenden Standard-BS-Images. In Ihrem Beispiel ist es nicht so, dass es einen benutzerdefinierten CentOS-Build gibt, der den Kernel des Parent verwendet. Oder ist es so einfach wie ein Dateisystem-Trick, bei dem Docker Gäste (CentOS) von / boot auf den Host (Ubuntu) umleitet? In diesem Fall würde der Gast (CentOS) seine eigene Kopie von / boot installieren, aber er würde nie gelesen werden. - James S


Container werden auf einem einzelnen Kernel ausgeführt. Mit anderen Worten, alle Container haben einen einzelnen Kernel (Host OS). Dagegen haben Hypervisoren mehrere Kernale. Jede virtuelle Maschine läuft auf einem anderen Kernel.

Und "docker run ubuntu" ist wie eine Chroot-Umgebung.


1
2018-06-16 01:33