Wie können Sie verstehen, dass Sie einen Docker und keine VM benötigen? Lassen Sie uns versuchen, die Hauptunterschiede zwischen der Isolation von virtuellen Maschinen (VMs) und Docker-Containern zu verstehen, ob sie austauschbar sind und wie wir sie verwenden können.
Was ist der Unterschied zwischen Docker-Containern und VM?
Eine virtuelle Maschine (VM) ist ein virtueller Computer mit allen virtuellen Geräten und einer virtuellen Festplatte, auf der ein neues unabhängiges Betriebssystem (Gastbetriebssystem) zusammen mit Treibern für virtuelle Geräte, Speicherverwaltung und anderen Komponenten installiert ist. Das heißt, wir erhalten eine Abstraktion der physischen Ausrüstung, mit der Sie viele virtuelle Computer auf einem Computer ausführen können. Virtuelle Geräte werden in den Systemeigenschaften angezeigt, und installierte Anwendungen interagieren mit ihnen, als ob sie real wären. Gleichzeitig ist die virtuelle Maschine selbst vollständig vom realen Computer isoliert, obwohl sie Zugriff auf ihre Festplatte und Peripheriegeräte haben kann.
Eine installierte VM kann auf verschiedene Arten Speicherplatz auf einer Computerfestplatte belegen:
- fester Festplattenspeicher, der einen schnelleren Zugriff auf die virtuelle Festplatte ermöglicht und die Fragmentierung von Dateien vermeidet;
- dynamische Speicherzuordnung. Bei der Installation zusätzlicher Anwendungen wird der Speicher dynamisch für sie zugewiesen, bis der maximal zugewiesene Speicher erreicht ist.
Bei Verwendung von VM fallen zusätzliche Kosten für die Emulation virtueller Geräte und den Start eines Gastbetriebssystems an, die die für die Funktion Ihrer Anwendung erforderliche Umgebung unterstützen und verwalten. Wenn Sie eine große Anzahl virtueller Maschinen auf dem Server bereitstellen, nimmt der Speicherplatz auf der Festplatte nur zu, weil Jede VM benötigt Speicherplatz, zumindest für das Gastbetriebssystem und Treiber für virtuelle Geräte.
Docker ist eine Software zum Erstellen von containergestützten Anwendungen. Container und virtuelle Maschinen lösen ein Problem, aber sie machen es anders. Container nehmen da weniger Platz ein Verwenden Sie mehr gemeinsam genutzte Ressourcen des Hostsystems als VM Im Gegensatz zu VM bietet es Virtualisierung auf Betriebssystemebene und nicht auf Hardwareebene. Dieser Ansatz bietet weniger Festplattenspeicher, schnellere Bereitstellung und einfachere Skalierung.
Der Docker-Container bietet einen effizienteren Mechanismus zur Kapselung von Anwendungen und stellt die erforderlichen Hostsystemschnittstellen bereit. Mit dieser Funktion können Container den Kern des Systems aufteilen, wobei jeder Container als separater Prozess des Hauptbetriebssystems arbeitet, das über einen eigenen virtuellen Adressraum verfügt, sodass Daten, die zu verschiedenen Speicherbereichen gehören, nicht geändert werden können.
Docker ist die häufigste Technologie zur Verwendung von Containern in der Anwendung. Es ist zum Standard in diesem Bereich geworden und baut auf den vom Linux-Kernel bereitgestellten cgroups und Namespace auf. Das native Betriebssystem für Docker ist Linux, daher erfolgt der Start von Docker-Containern unter Windows in einer virtuellen Linux-Maschine.
Woraus besteht der Behälter?
Ein Bild ist das Hauptelement, aus dem Container erstellt werden. Das Bild wird aus der Docker-Datei erstellt, die dem Projekt hinzugefügt wurde, und besteht aus einer Reihe von Dateisystemen (Ebenen), die übereinander geschichtet und schreibgeschützt gruppiert sind. Die maximale Anzahl von Schichten beträgt 127.
Das Herzstück jedes Bildes ist ein Basisbild, das durch den Befehl FROM angezeigt wird - der Einstiegspunkt für die Erstellung des Dockerfile-Bildes. Jede Ebene ist eine schreibgeschützte Ebene und wird durch einen Befehl dargestellt, der das in die Docker-Datei geschriebene Dateisystem ändert. Durch diesen Ansatz können sich verschiedene Dateien und Verzeichnisse aus verschiedenen Dateischichten transparent überlappen, wodurch ein kaskadenintegriertes Dateisystem entsteht. Ebenen enthalten Metadaten, mit denen Sie verwandte Informationen zu jeder Ebene zur Laufzeit speichern und erstellen können. Jede Ebene enthält eine Verknüpfung zur nächsten Ebene. Wenn die Ebene keine Verknüpfung hat, ist dies die oberste Ebene im Bild.
Ab Docker EE Version 06.17.02-ee5 und Docker Engine - Community wird Overlay2 oder Overlay verwendet, und frühere Versionen verwenden AuFS (Advanced Multi Layered Union File System).
Container - wie geht das?
Ein Container ist eine Abstraktion auf Anwendungsebene, die Code und Abhängigkeiten kombiniert. Container werden immer aus Bildern erstellt, wobei eine beschreibbare oberste Ebene hinzugefügt und verschiedene Parameter initialisiert werden. Da der Container über eine eigene Aufzeichnungsebene verfügt und alle Änderungen in dieser Ebene gespeichert sind, können mehrere Container gemeinsam auf dasselbe Bild zugreifen. Jeder Container kann über eine Datei im Projekt docker-compose.yml konfiguriert werden, in der verschiedene Parameter festgelegt werden, z. B. der Containername, Ports, Bezeichner und Abhängigkeiten zwischen anderen Containern. Wenn Sie in den Einstellungen keinen Containernamen angeben, erstellt Docker jedes Mal einen neuen Container und weist ihm zufällig einen Namen zu.
Wenn der Container vom Image ausgeht, stellt Docker das Dateisystem zum Lesen und Schreiben auf alle darunter liegenden Ebenen bereit. Hier werden alle Prozesse ausgeführt. Wenn Sie den Container zum ersten Mal starten, ist die anfängliche Lese- / Schreibebene leer. Wenn Änderungen auftreten, gelten sie für diese Ebene. Wenn Sie beispielsweise eine Datei ändern möchten, wird diese Datei von der unteren schreibgeschützten Ebene in die Lese- und Schreibebene kopiert. Eine schreibgeschützte Version der Datei ist weiterhin vorhanden, wird jedoch jetzt unter der Kopie ausgeblendet.
Wie funktioniert ein kaskadiertes Verbunddateisystem?
Ein kaskadenintegriertes Dateisystem (FS) implementiert einen COW-Kopiermechanismus (Copy-on-Write). Die Arbeitseinheit ist eine Ebene. Jede Ebene sollte als separates vollwertiges Dateisystem mit einer Hierarchie von Verzeichnissen vom Stamm selbst betrachtet werden. Bei diesem Ansatz wird die einheitliche Bereitstellung von Dateisystemen verwendet, sodass der Benutzer Dateien und Verzeichnisse verschiedener Dateisysteme (sogenannte Zweige) transparent in einem einzigen verbundenen Dateisystem kombinieren kann. Der Inhalt von Verzeichnissen mit denselben Pfaden wird zusammen in einem kombinierten Verzeichnis (in einem einzelnen Namespace) des resultierenden Dateisystems angezeigt.
Die Ebenen werden nach folgenden Prinzipien zusammengeführt:
- eine der Schichten wird zu einer Schicht der oberen Ebene, die zweite und nachfolgende Schichten werden zu Schichten der unteren Ebene;
- Ebenenobjekte sind für den Benutzer "von oben nach unten" zugänglich, d. h. Befindet sich das angeforderte Objekt in der „oberen“ Ebene, wird es zurückgegeben, unabhängig davon, ob in der „unteren“ Ebene ein Objekt mit diesem Namen vorhanden ist. Andernfalls wird das Objekt der "unteren" Ebene zurückgegeben. Wenn das angeforderte Objekt weder dort noch dort vorhanden ist, wird der Fehler "Keine solche Datei oder kein solches Verzeichnis" zurückgegeben.
- Die Arbeitsebene ist "ober", dh alle Benutzeraktionen zum Ändern von Daten werden nur auf der Ebene der oberen Ebene angezeigt, ohne den Inhalt der Ebenen der unteren Ebene zu beeinflussen.
Fazit
Wenn Sie ein System mit garantierten dedizierten Ressourcen und virtueller Hardware virtualisieren müssen, sollten Sie eine VM auswählen. Was gibt die Verwendung von VM:
- die Fähigkeit, mehrere verschiedene Betriebssysteme auf einem Computer zu installieren;
- Verteilung der Systemressourcen zwischen virtuellen Maschinen;
- Kein Neustart erforderlich, um zwischen Betriebssystemen zu wechseln.
- die Fähigkeit, einen „Schnappschuss“ des aktuellen Status des Systems und des Inhalts der Festplatten zu erstellen, um das System in seinen ursprünglichen Zustand zurückzusetzen;
- Isolierung von Fehlern und Verstößen gegen das Sicherheitssystem auf Hardwareebene;
- die Fähigkeit, ein Computernetzwerk auf einem Computer zu simulieren.
Wenn Sie laufende Anwendungen als separate Prozesse isolieren möchten, ist Docker in Ordnung für Sie. Was gibt die Verwendung von Docker:
- bietet Virtualisierung auf Betriebssystemebene;
- Container teilen sich den Kern des Systems und arbeiten als separater Prozess des Hauptbetriebssystems.
- Der Verbrauch von Systemressourcen wie Speicherverbrauch und CPU-Auslastung kann mithilfe von cgroups für jeden Container separat begrenzt werden.
- FS für Container wird mithilfe des COW-Mechanismus erstellt, der die Anwendungsbereitstellung beschleunigt, den Speicherverbrauch reduziert und Speicherplatz spart.
- Das geänderte Dateisystem eines Containers kann als Grundlage für die Bildung neuer Grundbilder anderer Container verwendet werden.