Ich nutze Docker seit mehreren Monaten, um den Entwicklungs- und Bereitstellungsprozess von Webprojekten zu strukturieren. Ich möchte den Lesern von „HabrHabr“ die Übersetzung des Einführungsartikels über Docker anbieten — .
Was ist Docker?
Docker ist eine offene Plattform zur Entwicklung, Bereitstellung und Ausführung von Anwendungen. Docker wurde entwickelt, um das Bereitstellen Ihrer Anwendungen zu beschleunigen. Mit Docker können Sie Ihre Anwendung von Ihrer Infrastruktur trennen und die Infrastruktur wie eine verwaltete Anwendung behandeln. Docker hilft Ihnen, Ihren Code schneller bereitzustellen, schneller zu testen und die Zeit zwischen dem Schreiben und Ausführen des Codes zu verkürzen. Docker erreicht dies durch eine leichte Plattform zur Container-Virtualisierung und nutzt Prozesse und Tools, die helfen, Ihre Anwendungen zu verwalten und bereitzustellen.
In seiner Kernfunktion ermöglicht Docker das Ausführen nahezu jeder Anwendung, die sicher in Containern isoliert ist. Diese sichere Isolation erlaubt es Ihnen, viele Container gleichzeitig auf einem einzigen Host zu betreiben. Die leichte Natur des Containers, der ohne zusätzliche Belastung durch einen Hypervisor betrieben wird, ermöglicht Ihnen, mehr aus Ihrer Hardware herauszuholen.
Die Plattform und die Werkzeuge zur Container-Virtualisierung können in den folgenden Fällen nützlich sein:
- Packen Ihrer Anwendung (und der verwendeten Komponenten) in Docker-Container;
- Verteilung und Bereitstellung dieser Container für Ihre Teams zur Entwicklung und zum Testen;
- Bereitstellung dieser Container in Ihren Produktionsumgebungen, sowohl in Rechenzentren als auch in der Cloud.
Wofür kann ich Docker verwenden?
Schnelle Bereitstellung Ihrer Anwendungen
Docker eignet sich hervorragend zur Organisation des Entwicklungszyklus. Docker ermöglicht Entwicklern die Verwendung lokaler Container mit Anwendungen und Diensten, die anschließend mit dem Prozess der kontinuierlichen Integration und Bereitstellung (Continuous Integration and Deployment Workflow) integriert werden können.
Zum Beispiel schreiben Ihre Entwickler den Code lokal und teilen ihren Entwicklungsstack (eine Reihe von Docker-Images) mit Kollegen. Wenn sie bereit sind, senden sie den Code und die Container an die Testumgebung und führen alle erforderlichen Tests durch. Von der Testumgebung aus können sie den Code und die Images in die Produktion bringen.
Einfacheres Bereitstellen und Bereitstellen
Die auf Containerisierung basierende Docker-Plattform ermöglicht es, Ihre Workloads ganz einfach zu portieren. Docker-Container können sowohl auf Ihrem lokalen Rechner als auch auf einer physischen oder virtuellen Maschine im Rechenzentrum sowie in der Cloud betrieben werden.
Die Portabilität und die Leichtigkeit von Docker ermöglichen es, Ihre Workloads dynamisch zu verwalten. Sie können Docker verwenden, um Ihre Anwendung oder Dienste schnell bereitzustellen oder zu stoppen. Die Geschwindigkeit von Docker ermöglicht dies nahezu in Echtzeit.
Hohe Lasten und mehr Workloads
Docker ist leichtgewichtig und schnell. Es bietet eine zuverlässige, kosteneffiziente Alternative zu Hypervisor-basierten virtuellen Maschinen. Besonders nützlich ist es unter hoher Last, beispielsweise beim Aufbau einer eigenen Cloud oder Plattformen als Service. Aber es ist auch vorteilhaft für kleine und mittlere Anwendungen, wenn Sie mehr aus den vorhandenen Ressourcen herausholen möchten.
Hauptkomponenten von Docker
Docker besteht aus zwei Hauptkomponenten:
- Docker: eine Open-Source-Virtualisierungsplattform;
- Docker Hub: unsere Plattform als Service zur Verteilung und Verwaltung von Docker-Containern.
Hinweis! Docker wird unter der Apache 2.0 Lizenz verbreitet.
Architektur von Docker
Docker verwendet eine Client-Server-Architektur. Der Docker-Client kommuniziert mit dem Docker-Daemon, der die Erstellung, Ausführung und Verteilung Ihrer Container übernimmt. Sowohl der Client als auch der Server können auf demselben System arbeiten; Sie können den Client auch mit einem entfernten Docker-Daemon verbinden. Der Client und der Server kommunizieren über einen Socket oder über eine RESTful API.

Docker-Daemon
Wie in der Abbildung gezeigt, wird der Docker-Daemon auf der Host-Maschine gestartet. Der Benutzer interagiert nicht direkt mit dem Server, sondern verwendet dafür den Client.
Docker-Client
Der Docker-Client, das Programm docker, ist das Hauptinterface zu Docker. Es erhält Befehle vom Benutzer und kommuniziert mit dem Docker-Daemon.
Innerhalb von Docker
Um zu verstehen, aus welchen Komponenten Docker besteht, müssen Sie über drei Elemente Bescheid wissen:
- Bilder (Images)
- Registrierungen (Registries)
- Container
Images
Ein Docker-Image ist eine schreibgeschützte Vorlage. Beispielsweise kann ein Image das Betriebssystem Ubuntu mit Apache und einer darauf laufenden Anwendung enthalten. Images werden zur Erstellung von Containern verwendet. Docker ermöglicht es, leicht neue Images zu erstellen, bestehende zu aktualisieren oder Sie können Images herunterladen, die von anderen erstellt wurden. Images sind eine Komponente des Docker-Systems.
Registrierung
Das Docker-Registry speichert Images. Es gibt öffentliche und private Registrys, aus denen Images heruntergeladen oder hochgeladen werden können. Das öffentliche Docker-Registry ist . Dort befindet sich eine riesige Sammlung von Images. Wie Sie wissen, können Images von Ihnen erstellt werden oder Sie können Images verwenden, die von anderen erstellt wurden. Registrys sind eine Komponente der Verteilung.
Container
Container sind vergleichbar mit Verzeichnissen. In Containern befindet sich alles, was für den Betrieb einer Anwendung erforderlich ist. Jeder Container wird aus einem Image erstellt. Container können erstellt, gestartet, gestoppt, verschoben oder gelöscht werden. Jeder Container ist isoliert und bietet eine sichere Plattform für die Anwendung. Container sind ein wesentlicher Bestandteil des Betriebs.
Wie funktioniert Docker?
Bisher wissen wir, dass:
- wir Images erstellen können, die unsere Anwendungen enthalten;
- wir Container aus Images erstellen können, um Anwendungen auszuführen;
- wir Images über Docker Hub oder ein anderes Image-Registry verbreiten können.
Lassen Sie uns betrachten, wie diese Komponenten zusammenwirken.
Wie funktioniert ein Image?
Wir wissen bereits, dass ein Image eine schreibgeschützte Vorlage ist, aus der ein Container erstellt wird. Jedes Image besteht aus einer Reihe von Schichten. Docker verwendet um diese Schichten zu einem einzigen Image zu kombinieren. Das Union-Dateisystem ermöglicht es Dateien und Verzeichnissen aus verschiedenen Dateisystemen (verschiedenen Zweigen), transparent übereinandergelegt zu werden und so ein konsistentes Dateisystem zu schaffen.
Ein Grund, warum Docker leichtgewichtig ist, liegt in der Verwendung von Schichten. Wenn Sie ein Image ändern, beispielsweise eine Anwendung aktualisieren, wird eine neue Schicht erstellt. So wird, anstatt das gesamte Image zu ersetzen oder neu zu erstellen, wie Sie es möglicherweise mit einer virtuellen Maschine tun müssen, nur eine Schicht hinzugefügt oder aktualisiert. Und Sie müssen das gesamte neue Image nicht verteilen, sondern nur das Update, was die Verbreitung von Images einfacher und schneller macht.
Jedes Image basiert auf einem Basisimage. Zum Beispiel ist ubuntu das Basisimage von Ubuntu, oder fedora das Basisimage der Fedora-Distribution. Sie können Images auch als Grundlage für die Erstellung neuer Images verwenden. Wenn Sie beispielsweise ein Apache-Image haben, können Sie es als Basisimage für Ihre Webanwendungen verwenden.
Hinweis! Docker bezieht in der Regel Images aus dem Docker Hub-Registry.
Docker-Images können aus diesen Basisimages erstellt werden, die Schritte zur Erstellung dieser Images nennen wir Anweisungen. Jede Anweisung erzeugt ein neues Image oder eine neue Schicht. Die Anweisungen sind folgende Aktionen:
- Befehle ausführen
- Datei oder Verzeichnis hinzufügen
- Umgebungsvariable erstellen
- Anweisungen, was bei der Ausführung dieses Container-Images zu starten ist
Diese Anweisungen werden in einer Datei gespeichert Dockerfile. Docker liest dies Dockerfile, wenn Sie das Image erstellen, führt es diese Anweisungen aus und gibt das endgültige Image zurück.
Wie funktioniert das Docker-Registry?
Das Registry ist ein Speicher für Docker-Images. Nach der Erstellung eines Images können Sie es in einem öffentlichen Registry wie Docker Hub oder in Ihrem eigenen Registry veröffentlichen.
Mit dem Docker-Client können Sie bereits veröffentlichte Images suchen und auf Ihre Maschine mit Docker herunterladen, um Container zu erstellen.
Docker Hub bietet öffentliche und private Image-Speicherorte. Die Suche und das Herunterladen von Images aus öffentlichen Speichern ist für alle zugänglich. Inhalte aus privaten Speichern erscheinen nicht in den Suchergebnissen. Nur Sie und Ihre Benutzer können auf diese Images zugreifen und Container daraus erstellen.
Wie funktioniert ein Container?
Ein Container besteht aus einem Betriebssystem, Benutzerdaten und Metadaten. Wie wir wissen, wird jeder Container aus einem Image erstellt. Dieses Image sagt Docker, was sich im Container befindet, welchen Prozess zu starten ist, wenn der Container läuft, und andere Konfigurationsdaten. Das Docker-Image ist nur lesezugänglich. Wenn Docker einen Container startet, wird eine Schreib-/Leseschicht über dem Image erstellt (unter Verwendung eines Union-Filesystems, wie bereits erwähnt), in der die Anwendung ausgeführt werden kann.
Was passiert, wenn ein Container gestartet wird?
Entweder über das Programm docker, oder über die RESTful API, sagt der Docker-Client dem Docker-Daemon, dass der Container gestartet werden soll.
$ sudo docker run -i -t ubuntu /bin/bash
Schauen wir uns diesen Befehl an. Der Client wird mit dem Befehl gestartet docker, mit der Option run, die anzeigt, dass ein neuer Container gestartet wird. Die Mindestanforderungen zum Starten eines Containers sind die folgenden Attribute:
- welches Image für die Erstellung des Containers verwendet werden soll. In unserem Fall
ubuntu - der Befehl, den Sie ausführen möchten, wenn der Container gestartet wird. In unserem Fall
/bin/bash
Was geschieht unter der Haube, wenn wir diesen Befehl ausführen?
Docker führt der Reihe nach Folgendes aus:
- lädt das Image ubuntu: Docker prüft, ob das Image
ubuntuauf der lokalen Maschine vorhanden ist, und wenn nicht, wird es von heruntergeladen. Ist das Image vorhanden, wird es verwendet, um den Container zu erstellen; - erstellt einen Container: nachdem das Image erhalten wurde, verwendet Docker es, um den Container zu erstellen;
- initialisiert das Dateisystem und bindet den schreibgeschützten Layer ein: der Container wird im Dateisystem erstellt, und der schreibgeschützte Layer wird hinzugefügt;
- initialisiert das Netzwerk/den Bridge: erstellt ein Netzwerk-Interface, das es Docker ermöglicht, mit der Host-Maschine zu kommunizieren;
- IP-Adresse einstellen: findet und setzt die Adresse;
- startet den angegebenen Prozess: startet Ihre Anwendung;
- verarbeitet und gibt die Ausgabe Ihrer Anwendung aus: verbindet sich und protokolliert den Standard-Eingang, die Ausgabe und den Fehlerstrom Ihrer Anwendung, damit Sie verfolgen können, wie Ihre Anwendung funktioniert.
Jetzt haben Sie einen funktionierenden Container. Sie können Ihren Container verwalten und mit Ihrer Anwendung interagieren. Wenn Sie entscheiden, die Anwendung zu stoppen, entfernen Sie den Container.
Verwendete Technologien
Docker ist in Go geschrieben und nutzt einige Funktionen des Linux-Kernels, um die oben genannten Funktionen zu realisieren.
Namespaces
Docker verwendet Technologie namespaces um isolierte Arbeitsumgebungen zu schaffen, die wir Container nennen. Wenn wir einen Container starten, erstellt Docker eine Gruppe von Namespaces für diesen Container.
Dies schafft eine isolierte Ebene, in der jeder Aspekt des Containers in seinem eigenen Namespace läuft und keinen Zugriff auf das externe System hat.
Eine Liste einiger Namespaces, die Docker verwendet:
- pid: zur Isolierung von Prozessen;
- net: zur Verwaltung von Netzwerk-Schnittstellen;
- ipc: zur Verwaltung von IPC-Ressourcen. (IPC: Inter-Process Communication);
- mnt: zur Verwaltung von Mount-Punkten;
- utc: zur Isolierung des Kernels und zur Steuerung der Versionierung (UTC: Unix Timesharing System).
Control Groups
Docker verwendet ebenfalls Technologie cgroups oder Kontrollgruppen. Der Schlüssel zum Betrieb der Anwendung in Isolation besteht darin, der Anwendung nur die Ressourcen zur Verfügung zu stellen, die Sie bereitstellen möchten. Dies gewährleistet, dass die Container gut Nachbarn sind. Kontrollgruppen ermöglichen es, die verfügbaren Ressourcen der Hardware zu trennen und, falls nötig, Grenzen und Einschränkungen zu setzen. Zum Beispiel kann die mögliche Menge an Speicher für einen Container begrenzt werden.
Union File System
Union File System oder UnionFS ist ein Dateisystem, das funktioniert, indem es Schichten erstellt, wodurch es sehr leichtgewichtig und schnell ist. Docker verwendet UnionFS zur Erstellung von Blöcken, aus denen der Container aufgebaut wird. Docker kann mehrere Varianten von UnionFS verwenden, einschließlich: AUFS, btrfs, vfs und DeviceMapper.
Containerformate
Docker kombiniert diese Komponenten in einer Hülle, die wir Containerformat nennen. Das standardmäßig verwendete Format heißt libcontainer. Docker unterstützt auch das traditionelle Format von Containern in Linux über . Zukünftig könnte Docker möglicherweise auch andere Containerformate unterstützen, beispielsweise durch Integration mit BSD Jails oder Solaris Zones.
Quelle: habr.com
