VM oder Docker?

Wie erkennt man, dass man Docker und nicht eine VM benötigt? Man muss feststellen, was genau isoliert werden soll. Wenn eine Isolation mit garantiert zugewiesenen Ressourcen und virtueller Hardware erforderlich ist, sollte die Wahl auf eine VM fallen. Wenn laufende Anwendungen als separate Prozesse im System isoliert werden mĂŒssen, benötigen Sie Docker.

Was ist 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 der ein neues, unabhĂ€ngiges Betriebssystem zusammen mit virtuellen GerĂ€tetreibern, Speicherverwaltung und anderen Komponenten installiert wird. Das heißt, wir erhalten eine Abstraktion der physischen Hardware, die es ermöglicht, viele virtuelle Computer auf einem einzigen physischen Computer auszufĂŒhren.
Eine installierte VM kann unterschiedlich viel Platz auf der Festplatte des Computers einnehmen:

  • fester Platz auf der Festplatte, der einen schnelleren Zugriff auf die virtuelle Festplatte ermöglicht und Fragmentierung der Datei vermeidet;
  • dynamische Speicherzuweisung. Bei der Installation zusĂ€tzlicher Anwendungen wird der Speicher dynamisch fĂŒr diese zugewiesen, bis das maximal dafĂŒr vorgesehene Volumen erreicht ist.

Je mehr virtuelle Maschinen auf dem Server, desto mehr Platz benötigen sie und erfordern auch stĂ€ndige UnterstĂŒtzung der Umgebung, die fĂŒr den Betrieb Ihrer Anwendung erforderlich ist.

Docker — ist Software zur Erstellung von Anwendungen auf Basis von Containern. Container und virtuelle Maschinen haben vergleichbare Vorteile, funktionieren jedoch unterschiedlich. Container benötigen weniger Platz, da sie mehr gemeinsame Ressourcen des Host-Systems wiederverwendet, als VMs, da sie im Gegensatz zu VMs Virtualisierung auf Betriebssystemebene und nicht auf Hardwareebene bieten. Dieser Ansatz sorgt fĂŒr einen geringeren Speicherbedarf, eine schnelle Bereitstellung und eine einfachere Skalierung.

Ein Container bietet einen effizienteren Mechanismus zur Kapselung von Anwendungen und stellt die erforderlichen Schnittstellen des Host-Systems bereit. Diese Möglichkeit erlaubt es den Containern, den Kernel des Systems zu teilen, wobei jeder Container als separater Prozess des Hauptbetriebsystems arbeitet, der ĂŒber einen eigenen Satz von Speicherbereichen (ein eigenes virtuelles Adressraum) verfĂŒgt. Da der virtuelle Adressraum jedes Containers eigenstĂ€ndig ist, können Daten, die verschiedenen Speicherbereichen angehören, nicht verĂ€ndert werden.
Das native Betriebssystem fĂŒr Docker ist Linux (Docker kann auch unter Windows und MacOS verwendet werden). Er nutzt die wesentlichen Vorteile, die ihm die Organisation der Kernel-Trennung ermöglichen. Das Starten von Docker-Containern unter Windows erfolgt innerhalb einer virtuellen Maschine mit dem Betriebssystem Linux, da die Container das Betriebssystem des Host-Systems und das Hauptbetriebssystem fĂŒr sie ist Linux.

Wie funktioniert ein Container?

Container sind eine Abstraktion auf Anwendungsebene, die Code und AbhĂ€ngigkeiten vereint. Container werden immer aus Images erstellt, indem eine beschreibbare obere Schicht hinzugefĂŒgt wird und verschiedene Parameter initialisiert werden. Da jeder Container seine eigene Schicht zum Schreiben hat und alle Änderungen in dieser Schicht gespeichert werden, können mehrere Container gemeinsam auf dasselbe Basis-Image zugreifen.

Jeder Container kann ĂŒber eine Datei im Projekt docker-compose, die in die Hauptlösung - docker-compose.yml - integriert ist, konfiguriert werden. Dort können verschiedene Parameter wie den Containernamen, Ports, IDs, RessourcenbeschrĂ€nkungen und AbhĂ€ngigkeiten zwischen anderen Containern festgelegt werden. Wenn im Setup kein Containername angegeben wird, erstellt Docker jedes Mal einen neuen Container und weist ihm zufĂ€llig einen Namen zu.

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 Lese-Schreib-Schicht leer. Wenn Änderungen vorgenommen werden, werden sie auf diese Schicht angewendet; wenn Sie beispielsweise eine Datei Ă€ndern möchten, wird diese Datei aus der darunter liegenden Nur-Lese-Schicht in die Lese-Schreib-Schicht kopiert.
Die nur lesbare Datei-Version wird weiterhin existieren, ist jedoch jetzt hinter einer Kopie verborgen. FĂŒr die Datenspeicherung, unabhĂ€ngig vom Lebenszyklus des Containers, werden Volumes verwendet. Volumes werden bei der Erstellung des Containers initialisiert.

Wie ist ein Image mit einem Container verbunden?

Image — das grundlegende Element fĂŒr jeden Container. Ein Image wird aus einer Dockerfile erstellt, die dem Projekt hinzugefĂŒgt wurde, und besteht aus einem Stapel ĂŒbereinander geschichteter Dateisysteme (Schichten), die zusammengefasst und nur lesbar sind; die maximale Anzahl der Schichten betrĂ€gt 127.

Jedes Image basiert auf einem Basisimage, das durch den Befehl FROM angegeben wird — der Einstiegspunkt beim Erstellen des Dockerfile-Images. Jede Schicht ist eine schreibgeschĂŒtzte Schicht und wird durch einen Befehl dargestellt, der das Dateisystem modifiziert, das im Dockerfile festgelegt ist.
Um diese Schichten zu einem einzigen Image zu kombinieren, verwendet Docker das Advanced multi layered Union file system (AuFS basiert auf UnionFS), das es ermöglicht, dass verschiedene Dateien und Verzeichnisse aus unterschiedlichen Dateischichten transparent ĂŒbereinander gelegt werden und ein zusammenhĂ€ngendes Dateisystem erstellt wird.

Die Schichten enthalten Metadaten, die es ermöglichen, begleitende Informationen ĂŒber jede Schicht wĂ€hrend der Laufzeit und des Builds zu speichern. Jede Schicht enthĂ€lt einen Verweis auf die nĂ€chste Schicht. Wenn eine Schicht keinen Verweis hat, handelt es sich um die oberste Schicht im Image.

Die Dockerfile kann solche Befehle enthalten wie:

  • FROM — der Einstiegspunkt beim Erstellen des Images;
  • MAINTAINER — der Name des Besitzers des Images;
  • RUN — DurchfĂŒhrung eines Befehls wĂ€hrend des Bildbaus;
  • ADD — Kopieren einer Datei vom Host in das neue Image. Wenn eine URL-Datei angegeben wird, lĂ€dt Docker sie in das angegebene Verzeichnis hoch;
  • ENV — Umgebungsvariablen;
  • CMD — startet die Erstellung eines neuen Containers auf Basis des Images;
  • ENTRYPOINT — der Befehl wird beim Start des Containers ausgefĂŒhrt.
  • WORKDIR — das Arbeitsverzeichnis fĂŒr die AusfĂŒhrung des CMD-Befehls.
  • USER — legt die UID fĂŒr den auf Basis des Images erstellten Container fest.
  • VOLUME — bindet das Verzeichnis des Hosts in den Container ein.
  • EXPOSE — Satz von Ports, die im Container ĂŒberwacht werden.

Wie funktioniert UnionFS?

UnionFS — ein dienstliches Stackspeichersystem (FS) fĂŒr Linux und FreeBSD. Dieses FS implementiert den Mechanismus des Copy-On-Write (COW). Die Arbeitseinheit von UnionFS ist die Schicht, wobei jede Schicht als vollwertiges Dateisystem mit Verzeichnisstruktur vom Root betrachtet wird. UnionFS erstellt eine kombinierte Einbindung fĂŒr andere Dateisysteme und ermöglicht es dem Benutzer, Dateien und Verzeichnisse verschiedener Dateisysteme (die als Äste bezeichnet werden) in ein einziges verbundenes Dateisystem transparent zusammenzufĂŒhren.

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

UnionFS kombiniert Schichten nach folgenden Prinzipien:

  • eine der Schichten wird zur obersten Schicht, wĂ€hrend die zweite und die folgenden Schichten untere Schichten werden;
  • Benutzern sind die Objekte der Schichten "von oben nach unten" zugĂ€nglich, d.h. wenn das angeforderte Objekt in der "oberen" Schicht vorhanden ist, wird es zurĂŒckgegeben, unabhĂ€ngig davon, ob ein Objekt mit demselben Namen in der "unteren" Schicht vorhanden ist; andernfalls wird das Objekt der "unteren" Schicht zurĂŒckgegeben; wenn das angeforderte Objekt weder dort noch dort vorhanden ist, wird der Fehler "Datei oder Verzeichnis nicht gefunden" zurĂŒckgegeben;
  • die aktive Schicht ist die "obere", das heißt, alle Benutzeraktionen zur DatenĂ€nderung wirken sich nur auf die oberste Schicht aus, ohne den Inhalt der unteren Schichten zu beeinflussen.

Docker ist die am weitesten verbreitete Technologie zur Nutzung von Containern in der Anwendungsarbeit. Es ist zum Standard in diesem Bereich geworden, 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 der Kernel des Betriebssystems zwischen allen Containern geteilt wird und wie separate OS-Prozesse gearbeitet wird.

Quelle: habr.com

60GB SSD 8Gb DDR4