Ich benutze Docker seit mehreren Monaten zur Strukturierung des Entwicklungs- und Bereitstellungsprozesses für Webprojekte. Ich biete den Lesern von „Habr“ eine Übersetzung des einführenden Artikels über Docker an — .
Was ist Docker?
Docker ist eine offene Plattform für die Entwicklung, Bereitstellung und Verwaltung von Anwendungen. Docker wurde entwickelt, um das Bereitstellen Ihrer Anwendungen zu beschleunigen. Mit Docker können Sie Ihre Anwendung von Ihrer Infrastruktur isolieren und die Infrastruktur wie eine verwaltete Anwendung behandeln. Docker hilft, Ihren Code schneller bereitzustellen, schneller zu testen und die Zeit zwischen dem Schreiben und dem Ausführen von Code zu verkürzen. Docker tut dies mit einer leichtgewichtigem Container-Virtualisierungsplattform, die Prozesse und Tools verwendet, die dabei helfen, Ihre Anwendungen zu verwalten und bereitzustellen.
Im Kern ermöglicht Docker das Ausführen nahezu jeder Anwendung, die sicher in einem Container isoliert ist. Diese sichere Isolation ermöglicht es Ihnen, auf einem Host mehrere Container gleichzeitig auszuführen. Die Leichtgewichtigkeit des Containers, der ohne zusätzliche Last eines Hypervisors ausgeführt wird, ermöglicht es Ihnen, mehr aus Ihrer Hardware herauszuholen.
Die Plattform und die Mittel zur Container-Virtualisierung können in folgenden Fällen nützlich sein:
- Verpacken Ihrer Anwendung (und der verwendeten Komponenten) in Docker-Container;
- Vorbereitung und Bereitstellung dieser Container für Ihre Teams zur Entwicklung und zum Testen;
- Bereitstellung dieser Container in Ihrer Produktionsumgebung, sowohl in Rechenzentren als auch in der Cloud.
Wofür kann ich Docker nutzen?
Schnelle Bereitstellung Ihrer Anwendungen
Docker eignet sich hervorragend zur Organisation des Entwicklungszyklus. Docker ermöglicht Entwicklern die Verwendung lokaler Container mit Anwendungen und Diensten. Dies erleichtert die Integration in den kontinuierlichen Integrations- und Bereitstellungsprozess.
Zum Beispiel schreiben Ihre Entwickler Code lokal und teilen ihren Entwicklungstack (eine Sammlung von Docker-Images) mit Kollegen. Wenn sie bereit sind, senden sie den Code und die Container auf die Testumgebung und führen alle notwendigen Tests durch. Von der Testumgebung aus können sie den Code und die Images in die Produktion senden.
Einfachere Bereitstellung und Bereitstellung
Die auf Docker-Containern basierende Plattform ermöglicht es, Ihre Workloads einfach zu portieren. Docker-Container können sowohl auf Ihrer lokalen Maschine, sowohl auf realer als auch auf virtueller Maschine im Rechenzentrum als auch in der Cloud betrieben werden.
Die Portabilität und die Leichtgewichtigkeit von Docker ermöglichen es, Ihre Workloads einfach dynamisch zu verwalten. Sie können Docker verwenden, um Ihre Anwendung oder Dienste bereitzustellen oder zu stoppen. Die Geschwindigkeit von Docker ermöglicht dies nahezu in Echtzeit.
Hohe Lasten und mehr Workloads
Docker ist leicht und schnell. Es bietet eine robuste, kostengünstige Alternative zu hypervisor-basierten virtuellen Maschinen. Besonders nützlich ist es unter hohen Lasten, zum Beispiel beim Aufbau einer eigenen Cloud oder einer Platform-as-a-Service (PaaS). Es ist jedoch auch für kleine und mittlere Anwendungen hilfreich, wenn Sie mehr aus Ihren verfügbaren Ressourcen herausholen möchten.
Die Hauptkomponenten von Docker
Docker besteht aus zwei Hauptkomponenten:
- Docker: eine Open-Source-Virtualisierungsplattform;
- Docker Hub: unsere Platform-as-a-Service für die Verbreitung und Verwaltung von Docker-Containern.
Hinweis! Docker wird unter der Apache 2.0-Lizenz verbreitet.
Die Architektur von Docker
Docker verwendet eine Client-Server-Architektur. Der Docker-Client kommuniziert mit dem Docker-Daemon, der sich um das Erstellen, Ausführen und Verteilen Ihrer Container kümmert. Sowohl der Client als auch der Server können auf demselben System laufen; Sie können den Client auch mit einem entfernten Docker-Daemon verbinden. Client und Server kommunizieren über ein Socket oder über eine RESTful API.

Docker-Daemon
Wie in der Abbildung dargestellt, wird der Daemon auf der Hostmaschine ausgeführt. Der Benutzer interagiert nicht direkt mit dem Server, sondern verwendet dafür den Client.
Docker-Client
Der Docker-Client, das Programm Docker, ist die Hauptschnittstelle zu Docker. Er erhält Befehle vom Benutzer und kommuniziert mit dem Docker-Daemon.
Innerhalb von Docker
Um zu verstehen, woraus Docker besteht, müssen Sie über drei Komponenten Bescheid wissen:
- Images (Abbilder)
- Registries (Registry)
- . Ein Container ist eine Möglichkeit, die Anwendung zu verpacken, um sie von der Umgebung zu isolieren.
Images
Ein Docker-Image ist eine read-only Vorlage. Zum Beispiel kann das Image ein Ubuntu-Betriebssystem mit Apache und einer darauf laufenden Anwendung enthalten. Images werden verwendet, um Container zu erstellen. 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 ein Baustein des Docker-Systems.
Registry
Das Docker-Registry speichert Images. Es gibt öffentliche und private Registries, aus denen Sie Images herunterladen oder hochladen können. Die ö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. Registries sind ein Baustein der Verbreitung.
Container
Container ähneln 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, angehalten, verschoben oder gelöscht werden. Jeder Container ist isoliert und stellt eine sichere Plattform für die Anwendung dar. Container sind ein Baustein des Betriebs.
Wie funktioniert Docker?
Bis jetzt 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.
Schauen wir uns an, wie diese Bausteine zusammenpassen.
Wie funktioniert ein Image?
Wir wissen bereits, dass ein Image eine read-only 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 Verzweigungen), transparent übereinandergelegt zu werden und ein kohärentes Dateisystem zu schaffen.
Ein Grund, warum Docker leichtgewichtig ist, liegt in der Verwendung dieser Schichten. Wenn Sie ein Image ändern, beispielsweise eine Anwendung aktualisieren, wird eine neue Schicht erstellt. So wird, ohne das gesamte Image zu ersetzen oder neu zu erstellen, wie Sie es möglicherweise mit einer virtuellen Maschine tun müssen, nur die Schicht hinzugefügt oder aktualisiert. Und Sie müssen nicht das gesamte neue Image verteilen, sondern nur das Update, was die Verbreitung von Images einfacher und schneller macht.
Jedes Image basiert auf einem Basis-Image. Zum Beispiel ubuntu, das Basis-Image von Ubuntu, oder fedora, das Basis-Image des Fedora-Distributions. Ebenso können Sie Images als Grundlage zur Erstellung neuer Images verwenden. Wenn Sie beispielsweise ein Image namens apache haben, können Sie es als Basis-Image für Ihre Webanwendungen verwenden.
Hinweis! Docker bezieht normalerweise Images aus dem Docker Hub-Registry.
Docker-Images können aus diesen Basis-Images erstellt werden, die Schritte zur Erstellung dieser Images nennen wir Anweisungen. Jede Anweisung erstellt ein neues Image oder eine neue Schicht. Die Anweisungen umfassen folgende Aktionen:
- Befehlsausführung
- Hinzufügen einer Datei oder eines Verzeichnisses
- Erstellen einer Umgebungsvariable
- Angeben, was ausgeführt werden soll, wenn der Container dieses Images gestartet wird
Diese Anweisungen werden in einer Datei gespeichert Dockerfile. Docker liest dies Dockerfile, wenn Sie das Image bauen, führt diese Anweisungen aus und gibt das endgültige Image zurück.
Wie funktioniert das Docker-Registry?
Ein Registry ist ein Speicher für Docker-Images. Nach der Erstellung eines Images können Sie es in einem öffentlichen Registry auf Docker Hub oder in Ihrem persönlichen Registry veröffentlichen.
Mit dem Docker-Client können Sie nach bereits veröffentlichten Images suchen und sie auf Ihr Docker-System herunterladen, um Container zu erstellen.
Docker Hub bietet öffentliche und private Speichern für Images. Das Suchen und Herunterladen von Images aus öffentlichen Speichern ist für alle verfügbar. Der Inhalt privater Speicher erscheint nicht in den Suchergebnissen. Nur Sie und Ihre Benutzer können diese Images abrufen 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 gestartet wird, und weitere Konfigurationsdaten. Das Docker-Image ist nur schreibgeschützt. Wenn Docker einen Container startet, wird eine schreibbare Schicht über dem Image (unter Verwendung eines Union-Dateisystems, wie zuvor erwähnt) erstellt, 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 er den Container starten soll.
$ sudo docker run -i -t ubuntu /bin/bash
Lassen Sie uns diesen Befehl einmal genauer betrachten. Der Client wird mit dem Befehl docker, mit der Option run, die sagt, dass ein neuer Container gestartet wird. Die Mindestanforderungen für den Start des Containers sind die folgenden Attribute:
- welches Image für die Erstellung des Containers verwendet werden soll. In unserem Fall
ubuntu - den Befehl, den Sie ausführen möchten, wenn der Container gestartet wird. In unserem Fall
/bin/bash
Was passiert unter der Haube, wenn wir diesen Befehl ausführen?
Docker führt der Reihe nach Folgendes aus:
- lädt das Image ubuntu herunter: 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 zur Erstellung des Containers verwendet; - erstellt den Container: sobald das Image vorhanden ist, verwendet Docker es zur Erstellung des Containers;
- initialisiert das Dateisystem und montiert die schreibgeschützte Ebene: der Container wird im Dateisystem erstellt und die schreibgeschützte Ebene wird hinzugefügt; das Image
- initiiert das Netzwerk/Brücke: erstellt ein Netzwerk-Interface, das es Docker ermöglicht, mit der Hostmaschine zu kommunizieren;
- Vergibt die IP-Adresse: 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, -Ausgang 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 die Anwendung stoppen möchten, löschen Sie den Container.
Verwendete Technologien
Docker ist in Go geschrieben und nutzt einige Funktionen des Linux-Kernels, um die oben genannte Funktionalität zu realisieren.
Namensräume (Namespaces)
Docker verwendet die Technologie namespaces zur Organisation isolierter Arbeitsbereiche, die wir Container nennen. Wenn wir einen Container starten, erstellt Docker ein Set von Namensräumen für diesen Container.
Dies erzeugt eine isolierte Ebene; jeder Aspekt des Containers läuft in seinem eigenen Namensraum und hat keinen Zugriff auf das externe System.
Eine Liste einiger Namensräume, die Docker verwendet:
- pid: zur Isolierung von Prozessen;
- net: zur Verwaltung von Netzwerkschnittstellen;
- ipc: zur Verwaltung von IPC-Ressourcen. (IPC: Interprozesskommunikation);
- mnt: zur Verwaltung von Einhängepunkten;
- utc: zur Isolierung des Kernels und zur Kontrolle der Versionserzeugung (UTC: Unix-Zeitverteilungssystem).
Kontrollgruppen (Cgroups)
Docker verwendet ebenfalls die Technologie cgroups oder Kontrollgruppen. Der Schlüssel zur Isolierung der Anwendung besteht darin, der Anwendung nur die Ressourcen bereitzustellen, die Sie bereitstellen möchten. Dies gewährleistet, dass die Container gute Nachbarn sind. Kontrollgruppen ermöglichen es, die verfügbaren Ressourcen der Hardware zu teilen und, falls erforderlich, Limits und Einschränkungen festzulegen. Beispielsweise kann die mögliche Speichermenge eines Containers begrenzt werden.
Union File System
Das Union File System oder UnionFS ist ein Dateisystem, das durch das Erstellen von Schichten arbeitet, wodurch es sehr leicht und schnell wird. Docker verwendet UnionFS, um die Blöcke zu erstellen, aus denen der Container besteht. Docker kann mehrere Varianten von UnionFS verwenden, darunter: AUFS, btrfs, vfs und DeviceMapper.
Containerformate
Docker kombiniert diese Komponenten in einer Hülle, die wir Containerformat nennen. Das standardmäßig verwendete Format wird genannt libcontainer. Außerdem unterstützt Docker das traditionelle Containerformat in Linux mithilfe von . In Zukunft könnte Docker möglicherweise andere Containerformate unterstützen, beispielsweise durch die Integration mit BSD Jails oder Solaris Zones.
Quelle: habr.com
