VM oder Docker?

Wie verstehen Sie, dass Sie Docker und keine VM benötigen? Sie müssen bestimmen, was genau Sie isolieren möchten. Wenn Sie ein System mit garantierten Ressourcen und virtueller Hardware isolieren möchten, sollte die Wahl auf die VM fallen. Wenn Sie laufende Anwendungen als separate Systemprozesse isolieren müssen, benötigen Sie Docker.

Was ist also der Unterschied zwischen Docker-Containern und VMs?

Virtuelle Maschine (VM) ist ein virtueller Computer mit allen virtuellen Geräten und einer virtuellen Festplatte, auf der ein neues unabhängiges Betriebssystem zusammen mit virtuellen Gerätetreibern, Speicherverwaltung und anderen Komponenten installiert ist. Das heißt, wir erhalten eine Abstraktion der physischen Hardware, die es ermöglicht, viele virtuelle Computer auf einem Computer auszuführen.
Eine installierte VM kann auf unterschiedliche Weise Speicherplatz belegen:

  • fester Festplattenspeicher, der einen schnelleren Zugriff auf die virtuelle Festplatte ermöglicht und Dateifragmentierung vermeidet;
  • dynamische Speicherzuweisung. Bei der Installation zusätzlicher Anwendungen wird ihnen dynamisch Speicher zugewiesen, bis die maximal zugewiesene Menge erreicht ist.

Je mehr virtuelle Maschinen auf dem Server vorhanden sind, desto mehr Platz beanspruchen sie und erfordern außerdem die ständige Unterstützung der Umgebung, die für den Betrieb Ihrer Anwendung erforderlich ist.

Docker ist eine Software zum Erstellen von Anwendungen auf Basis von Containern. Container und virtuelle Maschinen haben ähnliche Vorteile, funktionieren jedoch unterschiedlich. Container nehmen weniger Platz ein, weil Überbeanspruchen Sie mehr gemeinsam genutzte Ressourcen des Hostsystems als der VM, weil Im Gegensatz zu VM bietet es Virtualisierung auf Betriebssystemebene und nicht auf Hardwareebene. Dieser Ansatz sorgt für weniger Speicherbedarf, schnellere Bereitstellung und einfachere Skalierung.

Der Container bietet einen effizienteren Mechanismus zum Kapseln von Anwendungen, indem er die erforderlichen Schnittstellen zum Hostsystem bereitstellt. Mit dieser Funktion können Container den Kern des Systems gemeinsam nutzen, wobei jeder Container als separater Prozess des Hauptbetriebssystems ausgeführt wird, das über einen eigenen Satz von Speicherbereichen (seinen eigenen virtuellen Adressraum) verfügt. Da der virtuelle Adressraum jedes Containers ein eigener ist, können Daten, die zu unterschiedlichen Speicherbereichen gehören, nicht geändert werden.
Das native Betriebssystem für Docker ist Linux (Docker kann auch unter Windows und MacOS verwendet werden), es nutzt seine Hauptvorteile, die es ihm ermöglichen, einen geteilten Kernel zu organisieren. Der Start von Docker-Containern unter Windows erfolgt in einer virtuellen Linux-Maschine, weil Container teilen sich das Betriebssystem des Hostsystems und das Hauptbetriebssystem für sie ist Linux.

Container – wie funktioniert das?

Behälter 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 ein Container über eine eigene Schreibebene verfügt und alle Änderungen in dieser Ebene gespeichert werden, können mehrere Container gemeinsam auf dasselbe Master-Image zugreifen.

Jeder Container kann über eine Datei im Docker-Compose-Projekt konfiguriert werden, das in der Hauptlösung docker-compose.yml enthalten ist. Dort können Sie verschiedene Parameter wie Containernamen, Ports, Identifikatoren, Ressourcenlimits, Abhängigkeiten zwischen anderen Containern einstellen. Wenn Sie in den Einstellungen keinen Containernamen angeben, erstellt Docker jedes Mal einen neuen Container und weist ihm zufällig einen Namen zu.

Wenn ein Container von einem Image aus gestartet wird, mountet Docker das Dateisystem mit Lese-/Schreibzugriff über allen darunter liegenden Ebenen. Hier werden alle Prozesse ausgeführt, die unser Docker-Container ausführen soll.

Wenn Docker zum ersten Mal einen Container startet, ist die anfängliche Lese-/Schreibebene leer. Wenn Änderungen auftreten, werden sie auf diese Ebene angewendet. Wenn Sie beispielsweise eine Datei ändern möchten, wird diese Datei von der schreibgeschützten Ebene darunter in die Lese-/Schreibebene kopiert.
Die schreibgeschützte Version der Datei ist weiterhin vorhanden, wird jedoch jetzt unter der Kopie ausgeblendet. Volumes werden zum Speichern von Daten verwendet, unabhängig vom Lebenszyklus des Containers. Volumes werden initialisiert, wenn ein Container erstellt wird.

Wie ist das Bild mit dem Container verknüpft?

Bild - das Hauptelement für jeden Container. Das Image wird aus einer dem Projekt hinzugefügten Docker-Datei erstellt und besteht aus einer Reihe von Dateisystemen (Ebenen), die übereinander geschichtet und gruppiert sind und nur zum Lesen verfügbar sind. die maximale Anzahl der Schichten beträgt 127.

Das Herzstück jedes Images ist ein Basis-Image, das durch den FROM-Befehl angegeben wird – der Einstiegspunkt beim Generieren eines Dockerfile-Images. Jede Ebene ist eine schreibgeschützte Ebene und wird durch einen einzelnen Befehl dargestellt, der das Dateisystem ändert und in eine Docker-Datei geschrieben wird.
Um diese Ebenen in einem einzigen Bild zu kombinieren, verwendet Docker das erweiterte mehrschichtige Union-Dateisystem (AuFS basiert auf UnionFS), wodurch verschiedene Dateien und Verzeichnisse aus verschiedenen Dateiebenen transparent überlappen und ein zugehöriges Dateisystem erstellt werden können.

Ebenen enthalten Metadaten, die es Ihnen ermöglichen, verwandte Informationen zu jeder Ebene zur Laufzeit und zur Erstellungszeit zu speichern. Jede Ebene enthält einen Link zur nächsten Ebene. Wenn die Ebene keinen Link hat, ist dies die oberste Ebene im Bild.

Dockerfile kann Befehle enthalten wie:

  • VON – Einstiegspunkt bei der Bildbildung;
  • MAINTAINER – der Name des Eigentümers des Bildes;
  • RUN – Befehlsausführung während der Image-Assemblierung;
  • HINZUFÜGEN – Kopieren der Hostdatei in ein neues Image. Wenn Sie eine URL-Datei angeben, lädt Docker diese in das angegebene Verzeichnis herunter;
  • ENV – Umgebungsvariablen;
  • CMD – startet die Erstellung eines neuen Containers basierend auf dem Bild;
  • ENTRYPOINT – Der Befehl wird ausgeführt, wenn der Container gestartet wird.
  • WORKDIR ist das Arbeitsverzeichnis zum Ausführen des CMD-Befehls.
  • USER – Legt die UID für den aus dem Image erstellten Container fest.
  • VOLUME – Mountet das Hostverzeichnis im Container.
  • EXPOSE ist eine Reihe von Ports, die im Container abgehört werden.

Wie funktioniert UnionFS?

UnionFS – Service-Stack-Dateisystem (FS) für Linux und FreeBSD. Dieses FS implementiert den Copy-on-Write-Mechanismus (Copy-On-Write, COW). Die Arbeitseinheit von UnionFS ist eine Schicht. Jede Schicht sollte als separates, vollwertiges Dateisystem mit einer Verzeichnishierarchie vom Stammverzeichnis selbst aus betrachtet werden. UnionFS erstellt einen Union-Mount für andere Dateisysteme und ermöglicht es Ihnen, Dateien und Verzeichnisse aus verschiedenen Dateisystemen (Zweige genannt) transparent und für den Benutzer transparent in einem einzigen verknüpften Dateisystem zusammenzuführen.

Der Inhalt von Verzeichnissen mit denselben Pfaden wird zusammen in einem kombinierten Verzeichnis (im selben Namensraum) des resultierenden Dateisystems angezeigt.

UnionFS kombiniert Schichten basierend auf den folgenden Prinzipien:

  • Eine der Ebenen wird zur obersten Ebene, die zweite und die folgenden Ebenen werden zu untergeordneten Ebenen.
  • Layer-Objekte sind für den Benutzer „von oben nach unten“ zugänglich, d. h. Wenn sich das angeforderte Objekt in der „oberen“ Ebene befindet, wird es zurückgegeben, unabhängig davon, ob in der „unteren“ Ebene ein Objekt mit demselben Namen vorhanden ist. andernfalls wird das Objekt der „untersten“ Ebene zurückgegeben; Wenn das angeforderte Objekt weder vorhanden noch vorhanden ist, wird der Fehler „Keine solche Datei oder kein solches Verzeichnis“ zurückgegeben.
  • Die Arbeitsschicht ist die „oberste“, d. h. alle Benutzeraktionen zum Ändern von Daten werden nur auf der obersten Ebene widergespiegelt, ohne dass sich dies auf den Inhalt der untergeordneten Ebenen auswirkt.

Docker ist die am weitesten verbreitete Technologie zur Verwendung von Containern bei der Anwendungsarbeit. Es ist zum Standard in diesem Bereich geworden und baut auf den vom Linux-Kernel bereitgestellten Cgroups und Namespaces auf.

Mit Docker können wir Anwendungen schnell bereitstellen und das Dateisystem optimal nutzen, indem wir den Betriebssystemkernel zwischen allen Containern teilen und als separate Betriebssystemprozesse ausführen.

Source: habr.com

Kommentar hinzufügen