VM oder Docker?

Wie erkennen Sie, ob Sie Docker oder eine VM benötigen? Zuerst müssen Sie festlegen, was genau Sie isolieren möchten. Wenn Sie ein System mit garantierten Ressourcen und virtueller Hardware isolieren möchten, sollten Sie sich für eine VM entscheiden. Möchten Sie hingegen laufende Anwendungen als separate Prozesse im System isolieren, benötigen Sie Docker.

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

Eine virtuelle Maschine (VM) ist ein virtueller Computer mit allen virtuellen Geräten und einer virtuellen Festplatte, auf die ein neues, unabhängiges Betriebssystem zusammen mit virtuellen Gerätetreibern, Speicherverwaltung und anderen Komponenten installiert wird. Das bedeutet, dass wir eine Abstraktion von physischer Hardware erhalten, die es ermöglicht, viele virtuelle Computer auf einem einzigen Gerät auszuführen.
Eine installierte VM kann unterschiedlich Platz auf der Festplatte des Computers beanspruchen:

  • festen Speicherplatz auf der Festplatte, was schnelleren Zugriff auf die virtuelle Festplatte ermöglicht und Fragmentierung der Datei vermeidet;
  • Dynamische Speicherauslastung. Bei der Installation zusätzlicher Anwendungen wird Speicher dynamisch für diese reserviert, bis das maximal zugewiesene Volumen erreicht ist.

Je mehr virtuellen Maschinen auf dem Server, desto mehr Platz benötigen sie und erfordern ständige Unterstützung der Umgebung, die für den Betrieb Ihrer Anwendung erforderlich ist.

Docker — ist Software zur Erstellung von Anwendungen auf Containerbasis. Container und virtuelle Maschinen haben ähnliche Vorteile, funktionieren jedoch anders. Container benötigen weniger Speicherplatz, da sie eine größere Menge gemeinsamer Ressourcen des Hostsystems wiederverwenden als VMs, da sie im Gegensatz zu VMs eine Virtualisierung auf Betriebssystemebene und nicht auf Hardwareebene bieten. Dieser Ansatz sorgt für einen geringeren Speicherverbrauch, eine schnelle Bereitstellung und eine einfachere Skalierung.

Container bieten einen effizienteren Mechanismus zur Kapselung von Anwendungen und stellen die notwendigen Schnittstellen des Hosts bereit. Diese Funktion ermöglicht es Containern, den Kernel des Systems zu teilen, wobei jeder Container als separater Prozess des Hauptbetriebsystems läuft und über seinen eigenen Speicherbereich (eigenen virtuellen Adressraum) verfügt. Da der virtuelle Adressraum jedes Containers eigenständig ist, können Daten aus unterschiedlichen Speicherbereichen nicht verändert werden.
Das native Betriebssystem für Docker ist Linux (Docker kann auch auf Windows und MacOS verwendet werden); es nutzt deren grundlegende Vorteile, die die Organisation der Kernel-Trennung ermöglichen. Das Ausführen von Docker-Containern unter Windows geschieht in einer virtuellen Maschine mit Linux, da Container das Betriebssystem des Hosts teilen und Linux für sie das Hauptbetriebssystem ist.

Container – wie funktioniert das?

Container — ist eine abstrahierte Anwendungsebene, die Code und Abhängigkeiten vereint. Container werden immer aus Images erstellt, wobei eine beschreibbare obere Schicht hinzugefügt und verschiedene Parameter initialisiert werden. Da jeder Container seine eigene Schreibschicht hat und alle Änderungen in dieser Schicht gespeichert werden, können mehrere Container gleichzeitig auf dasselbe zugrunde liegende Image zugreifen.

Jeder Container kann über eine Datei im Projekt docker-compose, die Bestandteil der Hauptlösung ist — docker-compose.yml — konfiguriert werden. Dort können verschiedene Parameter wie der Name des Containers, Ports, Identifikatoren, Ressourcenlimits und Abhängigkeiten zwischen anderen Containern festgelegt werden. Wenn in der Konfiguration kein Name für den Container angegeben wird, erstellt Docker bei jedem Start einen neuen Container und vergibt ihm einen zufälligen Namen.

Wenn ein Container aus einem Image gestartet wird, mountet Docker das Dateisystem zum Lesen und Schreiben über alle darunter liegenden Schichten. Hier werden alle Prozesse ausgeführt, die wir möchten, dass unser Docker-Container ausführt.

Wenn Docker einen Container zum ersten Mal startet, ist die anfängliche schreibbare Schicht leer. Wenn Änderungen vorgenommen werden, werden diese auf dieser Schicht angewendet; beispielsweise wird, wenn Sie eine Datei ändern möchten, diese Datei aus der darunterliegenden Nur-Lese-Schicht in die schreibbare Schicht kopiert.
Die Nur-Lese-Version der Datei bleibt weiterhin bestehen, ist jedoch jetzt unter der Kopie verborgen. Volumes werden verwendet, um Daten unabhängig vom Lebenszyklus des Containers zu speichern. Diese Volumes werden bei der Erstellung des Containers initialisiert.

Wie ist ein Image mit einem Container verbunden?

Image — das zentrale Element für jeden Container. Ein Image wird aus einer Dockerfile erstellt, die dem Projekt hinzugefügt wurde, und stellt eine Ansammlung von Dateisystemen (Schichten) dar, die übereinander gestapelt und zusammen gruppiert sind, und nur für Lesezugriff zur Verfügung stehen; die maximale Anzahl an Schichten beträgt 127.

Jedes Image basiert auf einem Basis-Image, das mit dem Befehl FROM angegeben wird — dem Einstiegspunkt beim Erstellen des Images in der Dockerfile. Jede Schicht ist eine schreibgeschützte Schicht und wird durch einen Befehl dargestellt, der das Dateisystem, das in der Dockerfile aufgezeichnet ist, modifiziert.
Um diese Schichten zu einem Bild zu kombinieren, verwendet Docker ein fortschrittliches, mehrschichtiges Union-Dateisystem (AuFS basiert auf UnionFS), das es ermöglicht, verschiedene Dateien und Verzeichnisse aus verschiedenen Dateischichten transparent übereinanderzulegen und ein verknüpftes Dateisystem zu erstellen.

Die Schichten enthalten Metadaten, die es ermöglichen, begleitende Informationen über jede Schicht während der Laufzeit und des Aufbaus zu speichern. Jede Schicht enthält einen Verweis auf die nächste Schicht. Wenn eine Schicht keinen Verweis hat, ist das die oberste Schicht im Bild.

Eine Dockerfile kann folgende Befehle enthalten:

  • FROM — Einstiegspunkt beim Erstellen des Bildes;
  • MAINTAINER — Name des Besitzers des Bildes;
  • RUN — führt einen Befehl während des Aufbaus des Bildes aus;
  • ADD — kopiert eine Datei vom Host in das neue Bild. Wenn eine URL-Datei angegeben wird, lädt Docker diese in das angegebene Verzeichnis;
  • ENV — Umgebungsvariablen;
  • CMD — startet die Erstellung eines neuen Containers basierend auf dem Bild;
  • ENTRYPOINT — der Befehl wird beim Starten des Containers ausgeführt.
  • WORKDIR — das Arbeitsverzeichnis zum Ausführen des CMD-Befehls.
  • USER — setzt die UID für den basierend auf dem Bild erstellten Container.
  • VOLUME — bindet ein Verzeichnis vom Host an den Container.
  • EXPOSE — eine Liste von Ports, die im Container überwacht werden.

Wie funktioniert UnionFS?

UnionFS — eine dienstliche stapelbare Dateisystem (FS) für Linux und FreeBSD. Dieses FS implementiert den Copy-On-Write-Mechanismus (COW). Die Grundeinheit von UnionFS ist die Schicht, wobei jede Schicht als ein eigenständiges, vollständiges Dateisystem mit einer Verzeichnisstruktur vom Root aus betrachtet werden sollte. UnionFS erstellt ein kombiniertes Mount für andere Dateisysteme und ermöglicht es dem Benutzer, Dateien und Verzeichnisse verschiedener Dateisysteme (die als Zweige bezeichnet werden) nahtlos zu einem einzigen, verbundenen Dateisystem zusammenzuführen.

Inhalte von Verzeichnissen mit identischen Pfaden werden zusammen in einem kombinierten Verzeichnis (in einem einheitlichen Namensraum) des resultierenden Dateisystems angezeigt.

UnionFS vereint die Schichten unter Berücksichtigung der folgenden Prinzipien:

  • eine der Schichten wird zur obersten Schicht, die zweite und nachfolgende werden zu unteren Schichten;
  • Benutzern stehen die Schichtelemente "von oben nach unten" zur Verfügung, d.h. wenn das angeforderte Element im "oberen" Layer vorhanden ist, wird dieses zurückgegeben, unabhängig davon, ob ein Element mit demselben Namen im "unteren" Layer vorhanden ist; andernfalls wird das Element des "unteren" Layers zurückgegeben; falls das angeforderte Element in beiden Schichten nicht vorhanden ist, wird der Fehler "Datei oder Verzeichnis nicht gefunden" zurückgegeben;
  • Die aktive Schicht ist der "obere", was bedeutet, dass alle Aktionen des Benutzers zur Datenänderung nur im obersten Layer reflektiert werden, ohne den Inhalt der unteren Schichten zu beeinflussen.

Docker ist die am weitesten verbreitete Technologie zur Verwendung von Containern in der Anwendungsentwicklung. Er wurde zum Standard in diesem Bereich, basierend auf cgroups und Namespaces, die vom Linux-Kernel bereitgestellt werden.

Docker ermöglicht es uns, Anwendungen schnell bereitzustellen und das Dateisystem optimal zu nutzen, indem es den Betriebssystemkern zwischen allen Containern teilt und wie separate Prozesse des Betriebssystems funktioniert.

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster