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

Erwerben Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server đŸ”„ Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster