Docker verstehen

Ich verwende Docker nun seit mehreren Monaten, um den Entwicklungs-/Bereitstellungsprozess von Webprojekten zu strukturieren. Ich biete Habrakhabr-Lesern eine Übersetzung des Einführungsartikels über Docker an - „Docker verstehen“.

Was ist Docker?

Docker ist eine offene Plattform zum Entwickeln, Bereitstellen und Betreiben von Anwendungen. Docker ist darauf ausgelegt, Ihre Anwendungen schneller bereitzustellen. Mit Docker können Sie Ihre Anwendung von Ihrer Infrastruktur entkoppeln und die Infrastruktur als verwaltete Anwendung behandeln. Docker hilft Ihnen, Ihren Code schneller auszuliefern, schneller zu testen, Anwendungen schneller auszuliefern und die Zeit zwischen dem Schreiben von Code und der Ausführung von Code zu verkürzen. Docker erreicht dies über eine leichtgewichtige Container-Virtualisierungsplattform und nutzt Prozesse und Dienstprogramme, die Sie bei der Verwaltung und dem Hosten Ihrer Anwendungen unterstützen.

Im Kern ermöglicht Ihnen Docker die Ausführung nahezu jeder Anwendung, sicher isoliert in einem Container. Durch die sichere Isolation können Sie viele Container gleichzeitig auf demselben Host ausführen. Die leichte Beschaffenheit des Containers, der ohne die zusätzliche Belastung durch einen Hypervisor läuft, ermöglicht es Ihnen, mehr aus Ihrer Hardware herauszuholen.

Die Containervirtualisierungsplattform und -tools können in den folgenden Fällen nützlich sein:

  • Verpacken Ihrer Anwendung (und der von Ihnen verwendeten Komponenten) in Docker-Container;
  • Verteilung und Lieferung dieser Container an Ihre Teams zur Entwicklung und zum Testen;
  • Legen Sie diese Container an Ihren Produktionsstandorten an, sowohl in Rechenzentren als auch in den Clouds.

Wofür kann ich Docker verwenden?

Veröffentlichen Sie Ihre Bewerbungen schnell

Docker eignet sich hervorragend zur Organisation des Entwicklungszyklus. Mit Docker können Entwickler lokale Container mit Anwendungen und Diensten ausführen. Dies ermöglicht Ihnen anschließend die Integration in den Prozess der kontinuierlichen Integration und des Bereitstellungsworkflows.

Ihre Entwickler schreiben beispielsweise lokal Code und teilen ihren Entwicklungsstack (eine Reihe von Docker-Images) mit Kollegen. Wenn sie fertig sind, übertragen sie den Code und die Container auf die Testseite und führen alle erforderlichen Tests durch. Von der Testseite aus können sie Code und Bilder an die Produktion senden.

Einfacheres Auslegen und Entfalten

Die auf Docker-Containern basierende Plattform erleichtert die Portierung Ihrer Nutzlast. Docker-Container können auf Ihrer lokalen Maschine ausgeführt werden, entweder real oder auf einer virtuellen Maschine in einem Rechenzentrum oder in der Cloud.

Die Portabilität und das geringe Gewicht von Docker erleichtern die dynamische Verwaltung Ihrer Arbeitslast. Sie können Docker verwenden, um Ihre Anwendung oder Dienste bereitzustellen oder herunterzufahren. Die Geschwindigkeit von Docker ermöglicht dies nahezu in Echtzeit.

Höhere Lasten und mehr Nutzlasten

Docker ist leicht und schnell. Es bietet eine belastbare, kostengünstige Alternative zu Hypervisor-basierten virtuellen Maschinen. Dies ist besonders in Umgebungen mit hoher Auslastung nützlich, beispielsweise beim Erstellen einer eigenen Cloud oder eines Platform-as-Service. Es ist aber auch für kleine und mittlere Anwendungen nützlich, 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 Platform-as-a-Service zur Verteilung und Verwaltung von Docker-Containern.

Notiz! Docker wird unter der Apache 2.0-Lizenz vertrieben.

Docker-Architektur

Docker verwendet eine Client-Server-Architektur. Der Docker-Client kommuniziert mit dem Docker-Daemon, der die Last der Erstellung, Ausführung und Verteilung Ihrer Container übernimmt. Sowohl Client als auch Server können auf demselben System ausgeführt werden. Sie können den Client mit einem Remote-Docker-Daemon verbinden. Client und Server kommunizieren über einen Socket oder eine RESTful-API.

Docker verstehen

Docker-Daemon

Wie im Diagramm dargestellt, läuft der Daemon auf dem Host-Rechner. Der Benutzer interagiert nicht direkt mit dem Server, sondern nutzt hierfür den Client.

Docker-Client

Der Docker-Client, das Docker-Programm, ist die Hauptschnittstelle zu Docker. Es empfängt Befehle vom Benutzer und interagiert mit dem Docker-Daemon.

Im Docker

Um zu verstehen, woraus Docker besteht, müssen Sie drei Komponenten kennen:

  • Bilder
  • Registrierung
  • Behälter

Bilder

Das Docker-Image ist eine schreibgeschützte Vorlage. Das Image kann beispielsweise das Ubuntu-Betriebssystem mit Apache und einer darauf befindlichen Anwendung enthalten. Bilder werden zum Erstellen von Containern verwendet. Mit Docker können Sie ganz einfach neue Images erstellen, vorhandene aktualisieren oder von anderen Personen erstellte Images herunterladen. Bilder sind Komponenten eines Docker-Builds.

Registrieren

Die Docker-Registrierung speichert Bilder. Es gibt öffentliche und private Register, aus denen Sie Bilder herunterladen oder hochladen können. Eine öffentliche Docker-Registrierung ist Docker-Hub. Dort ist eine riesige Sammlung von Bildern gespeichert. Wie Sie wissen, können Bilder von Ihnen selbst erstellt werden oder Sie können Bilder verwenden, die von anderen erstellt wurden. Register sind eine Vertriebskomponente.

Container

Container ähneln Verzeichnissen. Container enthalten alles, was die Anwendung zum Ausführen benötigt. Jeder Container wird aus einem Bild erstellt. Container können erstellt, gestartet, gestoppt, migriert oder gelöscht werden. Jeder Container ist isoliert und bietet eine sichere Plattform für die Anwendung. Container sind Bestandteile der Arbeit.

Wie funktioniert Docker?

Bisher wissen wir Folgendes:

  • wir können Bilder erstellen, in denen sich unsere Anwendungen befinden;
  • Wir können Container aus Bildern erstellen, um Anwendungen auszuführen.
  • Wir können Bilder über Docker Hub oder eine andere Bildregistrierung verteilen.

Mal sehen, wie diese Komponenten zusammenpassen.

Wie funktioniert das Bild?

Wir wissen bereits, dass ein Bild eine schreibgeschützte Vorlage ist, aus der ein Container erstellt wird. Jedes Bild besteht aus einer Reihe von Ebenen. Docker verwendet Union-Dateisystem um diese Ebenen in einem Bild zu kombinieren. Das Union-Dateisystem ermöglicht die transparente Überlappung von Dateien und Verzeichnissen aus verschiedenen Dateisystemen (verschiedenen Zweigen) und schafft so ein kohärentes Dateisystem.

Einer der Gründe, warum Docker leichtgewichtig ist, liegt darin, dass es Ebenen wie diese verwendet. Wenn Sie das Bild ändern, beispielsweise durch das Aktualisieren einer Anwendung, wird eine neue Ebene erstellt. Ohne also das gesamte Image zu ersetzen oder neu zu erstellen, wie es bei einer virtuellen Maschine der Fall sein könnte, wird nur die Ebene hinzugefügt oder aktualisiert. Und Sie müssen nicht das gesamte neue Image verteilen, es wird nur das Update verteilt, was die Verteilung von Bildern einfacher und schneller macht.

Das Herzstück jedes Bildes ist ein Grundbild. Zum Beispiel Ubuntu, das Basis-Image von Ubuntu, oder Fedora, das Basis-Image der Fedora-Distribution. Sie können Bilder auch als Grundlage für die Erstellung neuer Bilder verwenden. Wenn Sie beispielsweise über ein Apache-Image verfügen, können Sie es als Basis-Image für Ihre Webanwendungen verwenden.

Notiz! Docker ruft normalerweise Bilder aus der Docker Hub-Registrierung ab.

Aus diesen Basis-Images können Docker-Images erstellt werden; wir nennen die Schritte zum Erstellen dieser Images Anweisungen. Jede Anweisung erstellt ein neues Bild oder Level. Die Anweisungen lauten wie folgt:

  • Führen Sie den Befehl aus
  • Hinzufügen einer Datei oder eines Verzeichnisses
  • Erstellen einer Umgebungsvariablen
  • Anweisungen dazu, was ausgeführt werden soll, wenn der Container dieses Bildes gestartet wird

Diese Anweisungen werden in einer Datei gespeichert Dockerfile. Docker liest dies Dockerfile, wenn Sie das Image erstellen, führt diese Anweisungen aus und gibt das endgültige Image zurück.

Wie funktioniert die Docker-Registrierung?

Die Registry ist ein Repository für Docker-Images. Sobald das Image erstellt wurde, können Sie es in der öffentlichen Docker Hub-Registrierung oder in Ihrer persönlichen Registrierung veröffentlichen.

Mit dem Docker-Client können Sie nach bereits veröffentlichten Bildern suchen und diese auf Ihren Docker-Rechner herunterladen, um Container zu erstellen.

Docker Hub bietet öffentliche und private Image-Repositorys. Das Suchen und Herunterladen von Bildern aus öffentlichen Repositories ist für jedermann möglich. Der Inhalt privater Speicher wird nicht in die Suchergebnisse einbezogen. Und nur Sie und Ihre Benutzer können diese Bilder empfangen und daraus Container erstellen.

Wie funktioniert ein Container?

Ein Container besteht aus einem Betriebssystem, Benutzerdateien und Metadaten. Wie wir wissen, wird jeder Container aus einem Bild erstellt. Dieses Bild teilt Docker mit, was sich im Container befindet, welcher Prozess gestartet werden soll, wann der Container startet und andere Konfigurationsdaten. Das Docker-Image ist schreibgeschützt. Wenn Docker einen Container startet, erstellt es eine Lese-/Schreibebene über dem Image (unter Verwendung des Union-Dateisystems, wie zuvor erwähnt), in der die Anwendung ausgeführt werden kann.

Was passiert, wenn der Container startet?

Oder mit dem Programm dockeroder mithilfe der RESTful-API weist der Docker-Client den Docker-Daemon an, den Container zu starten.

$ sudo docker run -i -t ubuntu /bin/bash

Werfen wir einen Blick auf diesen Befehl. Der Client wird mit dem Befehl gestartet docker, mit Option run, was besagt, dass ein neuer Container gestartet wird. Die Mindestanforderungen zum Ausführen eines Containers sind die folgenden Attribute:

  • welches Bild zum Erstellen 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 passiert unter der Haube, wenn wir diesen Befehl ausführen?

Docker führt der Reihe nach Folgendes aus:

  • lädt das Ubuntu-Image herunter: Docker prüft die Bildverfügbarkeit ubuntu auf dem lokalen Computer, und wenn es nicht vorhanden ist, laden Sie es von herunter Docker-Hub. Wenn ein Bild vorhanden ist, wird daraus ein Container erstellt.
  • erstellt einen Container: Wenn das Bild empfangen wird, erstellt Docker daraus einen Container.
  • Initialisiert das Dateisystem und mountet die schreibgeschützte Ebene: der Container wird im Dateisystem erstellt und das Image wird zur schreibgeschützten Ebene hinzugefügt;
  • initialisiert das Netzwerk/die Bridge: erstellt eine Netzwerkschnittstelle, die es Docker ermöglicht, mit dem Host-Computer zu kommunizieren;
  • IP-Adresse einstellen: findet und legt die Adresse fest;
  • Startet den angegebenen Prozess: startet Ihre Anwendung;
  • Verarbeitet und erzeugt die Ausgabe Ihrer Anwendung: verbindet und protokolliert die Standardeingabe, -ausgabe und den Fehlerstrom Ihrer Anwendung, sodass Sie die Leistung Ihrer Anwendung verfolgen können.

Sie haben jetzt einen funktionierenden Container. Sie können Ihren Container verwalten und mit Ihrer Anwendung interagieren. Wenn Sie sich entscheiden, die Anwendung zu stoppen, löschen Sie den Container.

Verwendete Technologien

Docker ist in Go geschrieben und nutzt einen Teil des Linux-Kernels, um die oben genannte Funktionalität zu implementieren.

Namensräume

Docker nutzt Technologie namespaces um isolierte Arbeitsbereiche zu organisieren, die wir Container nennen. Wenn wir einen Container starten, erstellt Docker eine Reihe von Namespaces für diesen Container.

Dadurch entsteht eine isolierte Schicht, wobei jeder Aspekt des Containers in seinem eigenen Namensraum läuft und keinen Zugriff auf das externe System hat.

Liste einiger Namespaces, die Docker verwendet:

  • pid: den Prozess isolieren;
  • Netz: zur Verwaltung von Netzwerkschnittstellen;
  • IPC: um IPC-Ressourcen zu verwalten. (ICP: InterProccess Communication);
  • Achtung: Mountpunkte verwalten;
  • koordinierte Weltzeit: um den Kernel zu isolieren und die Versionsgenerierung zu steuern (UTC: Unix-Timesharing-System).

Kontrollgruppen

Auch Docker nutzt Technologie cgroups oder Kontrollgruppen. Der Schlüssel zum isolierten Ausführen einer Anwendung besteht darin, der Anwendung nur die Ressourcen bereitzustellen, die Sie bereitstellen möchten. Dadurch wird sichergestellt, dass die Container gute Nachbarn sind. Kontrollgruppen ermöglichen es Ihnen, verfügbare Hardware-Ressourcen zu teilen und bei Bedarf Grenzen und Einschränkungen festzulegen. Begrenzen Sie beispielsweise die mögliche Speichermenge für den Container.

Union-Dateisystem

Union File System oder UnionFS ist ein Dateisystem, das durch die Erstellung von Ebenen funktioniert und dadurch sehr leicht und schnell ist. Docker verwendet UnionFS, um die Blöcke zu erstellen, aus denen der Container erstellt wird. Docker kann mehrere Varianten von UnionFS verwenden, darunter AUFS, btrfs, vfs und DeviceMapper.

Containerformate

Docker kombiniert diese Komponenten in einem Wrapper, den wir Containerformat nennen. Das Standardformat heißt libcontainer. Docker unterstützt auch das traditionelle Containerformat unter Linux LXC. In Zukunft unterstützt Docker möglicherweise andere Containerformate. Zum Beispiel die Integration mit BSD-Jails oder Solaris-Zonen.

Source: habr.com

Kommentar hinzufügen