Warum verwenden wir ein Betriebssystem-Basisimage mit Docker, wenn Container kein Gastbetriebssystem haben?

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. Soweit ich verstanden habe, ist ein Container nur eine Sandbox, in der ein ganzes isoliertes Dateisystem ausgeführt wird.

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 unterscheidet es sich, 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, basieren wir sie auf einem Image, das nach einem Betriebssystem benannt ist.

Auch in Beispielen habe ich gesehen, wann wir es tun docker run ubuntu echo "hello world", es scheint, dass wir eine VM mit Ubuntu hochfahren und sie den Befehl ausführen lassen echo "hello world".

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

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

Ist die Idee, dass wir nur teilen Sie den Kernel mit dem Host-Betriebssystem (und folglich haben wir Zugriff auf die zugrunde liegenden Hardwareressourcen der Maschine, ohne dass Hardware virtualisiert werden muss), verwenden Sie jedoch weiterhin die Dateien und Binärdateien jedes anderen Systems auf den Containern, um die Anwendung zu unterstützen, die wir ausführen möchten?

Da alle Linux-Distributionen den gleichen (ja, es ist ein bisschen vereinfacht) Linux-Kernel ausführen 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. Konkret bedeutet die Installation des CentOS-Containers in Ubuntu OS, dass Sie das Benutzerland von CentOS erhalten, während immer noch derselbe Kernel ausgeführt wird, nicht einmal eine andere Kernelinstanz.

So leicht virtualisierung ist wie isolierte Fächer innerhalb desselben Betriebssystems. Im Gegensatz dazu hat echte Virtualisierung ein weiteres vollwertiges Betriebssystem im Host-Betriebssystem. Aus diesem Grund kann Docker FreeBSD oder Windows unter Linux nicht ausführen.

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

Ich hatte mit der gleichen Frage zu kämpfen, die Sie stellen, und das habe ich verstanden.

Container haben kein Gastbetriebssystem, da haben Sie Recht.

Warum basieren wir dann den Container auf einem Betriebssystemabbild?

Weil Sie einige Befehle wie (apt, ls, cd, pwd) verwenden möchten.Diese Befehle sind Aufrufe von Binärdateien, die Ihnen möglicherweise in Ihrem Host-Betriebssystem zur Verfügung stehen, ohne dass Sie sie installieren anything.In damit Sie diese Befehle in Ihrem Docker-Image ausführen können, müssen Sie die Binärdateien für sie in Ihrem Image haben, da Sie aus Isolationsgründen nicht nur Binärdateien vom Host-Betriebssystem ausführen.

Sehen Sie sich diese Antwort an, um besser zu verstehen, warum wir überhaupt ein Basisbild benötigen: https://stackoverflow.com/a/62384611

Container werden auf einem einzelnen Kernel ausgeführt. Mit anderen Worten, alle Container haben einen einzigen Kernel (Host-Betriebssystem). Auf der anderen Seite haben Hypervisoren mehrere Kernel. Jede virtuelle Maschine läuft auf einem anderen Kernel.

Und "Docker run ubuntu" ist genau wie das Erstellen einer Chroot-Umgebung.

Meiner Meinung nach sind Ihre Ziele bei der Virtualisierung der Schlüssel. Wenn Sie Bibliotheken, Sprachen usw. benötigen. auf OS, so dass OS-Container für Ihre Bedürfnisse geeignet sind. Wenn Sie jedoch nur Anwendungen als Komponenten benötigen, ist es nicht erforderlich, das Betriebssystem als Basisimage zu verwenden. Ich denke, dieser Artikel könnte es klar erklären Operating System Containers vs. Application Containers - RisingStack Engineering