Container 101: Docker-Grundlagen

Docker startete 2012 als Open-Source-Projekt mit dem ursprünglichen Namen dotcloud, um Linux-Container für einzelne Anwendungen zu erstellen. Seitdem ist Docker ein äußerst beliebtes Entwicklungstool, das zunehmend als Laufzeitumgebung verwendet wird. Nur wenige - wenn überhaupt - Technologien haben sich bei Entwicklern so schnell durchgesetzt wie Docker.

Ein Grund, warum Docker so beliebt ist, ist das Versprechen, „einmal zu entwickeln, überall auszuführen“. Docker bietet eine einfache Möglichkeit, eine Anwendung und ihre Laufzeitabhängigkeiten in einen einzigen Container zu packen. Es bietet auch eine Laufzeitabstraktion, mit der der Container auf verschiedenen Versionen des Linux-Kernels ausgeführt werden kann.

Mit Docker kann ein Entwickler eine containerisierte Anwendung auf seiner Workstation erstellen und den Container dann problemlos auf einem beliebigen Docker-fähigen Server bereitstellen. Es ist nicht erforderlich, den Container für die Serverumgebung erneut zu testen oder zu optimieren, egal ob in der Cloud oder vor Ort.

Darüber hinaus bietet Docker einen Mechanismus zur gemeinsamen Nutzung und Verteilung von Software, mit dem Entwickler und Betriebsteams Containerinhalte problemlos freigeben und wiederverwenden können. Dieser Verteilungsmechanismus in Verbindung mit der Portabilität zwischen Maschinen trägt dazu bei, die Beliebtheit von Docker bei Betriebsteams und Entwicklern zu berücksichtigen.  

Docker-Komponenten

Docker ist sowohl ein Entwicklungstool als auch eine Laufzeitumgebung. Um Docker zu verstehen, müssen wir zuerst das Konzept eines Docker-Container-Images verstehen. Ein Container beginnt immer mit einem Bild und wird als Instanziierung dieses Bildes betrachtet. Ein Image ist eine statische Spezifikation der Laufzeit des Containers, einschließlich des Anwendungscodes im Container und der Laufzeitkonfigurationseinstellungen. Docker-Bilder enthalten schreibgeschützte Ebenen. Das bedeutet, dass ein einmal erstelltes Bild niemals geändert wird.

Abbildung 1 zeigt ein Beispiel für ein Containerbild. Dieses Image zeigt ein Ubuntu-Image mit einer Apache-Installation. Das Bild besteht aus drei Ubuntu-Basisebenen und einer Aktualisierungsebene mit einer Apache-Ebene und einer benutzerdefinierten Dateischicht darüber.

Ein laufender Docker-Container ist eine Instanziierung eines Bildes. Von demselben Image abgeleitete Container sind hinsichtlich ihres Anwendungscodes und ihrer Laufzeitabhängigkeiten identisch. Im Gegensatz zu schreibgeschützten Bildern enthalten laufende Container eine beschreibbare Ebene (die Containerebene) über dem schreibgeschützten Inhalt. Laufzeitänderungen, einschließlich aller Schreibvorgänge und Aktualisierungen von Daten und Dateien, werden in der Containerebene gespeichert. Daher können mehrere gleichzeitig ausgeführte Container, die dasselbe zugrunde liegende Image verwenden, Containerebenen aufweisen, die sich erheblich unterscheiden.

Wenn ein laufender Container gelöscht wird, wird auch die beschreibbare Containerebene gelöscht und bleibt nicht bestehen. Die einzige Möglichkeit, Änderungen beizubehalten, besteht darin, docker commitvor dem Löschen des Containers einen expliziten Befehl auszuführen. Wenn Sie a ausführen docker commit, wird der laufende Containerinhalt, einschließlich der beschreibbaren Ebene, in ein neues Container-Image geschrieben und auf der Festplatte gespeichert. Dies wird ein neues Bild, das sich von dem Bild unterscheidet, durch das der Container instanziiert wurde.

Mit diesem expliziten docker commitBefehl kann ein aufeinanderfolgender, diskreter Satz von Docker-Images erstellt werden, die jeweils auf dem vorherigen Image aufbauen. Darüber hinaus verwendet Docker eine Copy-on-Write-Strategie, um den Speicherbedarf von Containern und Images zu minimieren, die dieselben Basiskomponenten verwenden. Dies hilft, den Speicherplatz zu optimieren und die Startzeit des Containers zu minimieren.

Abbildung 2 zeigt den Unterschied zwischen einem Bild und einem laufenden Container. Beachten Sie, dass jeder laufende Container eine andere beschreibbare Ebene haben kann.

Über das Image-Konzept hinaus verfügt Docker über einige spezifische Komponenten, die sich von denen in herkömmlichen Linux-Containern unterscheiden.

  • Docker-Daemon. Der Docker-Daemon, auch als Docker Engine bekannt, ist eine dünne Schicht zwischen den Containern und dem Linux-Kernel. Der Docker-Daemon ist die persistente Laufzeitumgebung, die Anwendungscontainer verwaltet. Jeder Docker-Container kann auf jedem Server ausgeführt werden, auf dem Docker-Daemon aktiviert ist, unabhängig vom zugrunde liegenden Betriebssystem.
  • Dockerfile. Entwickler verwenden Dockerfiles, um Container-Images zu erstellen, die dann zur Grundlage für die Ausführung von Containern werden. Eine Docker-Datei ist ein Textdokument, das alle Konfigurationsinformationen und Befehle enthält, die zum Zusammenstellen eines Container-Images erforderlich sind. Mit einer Docker-Datei kann der Docker-Dämon automatisch ein Container-Image erstellen. Dieser Prozess vereinfacht die Schritte zur Containererstellung erheblich.

Insbesondere geben Sie in einer Docker-Datei zunächst ein Basis-Image an, von dem aus der Erstellungsprozess beginnt. Anschließend geben Sie eine Folge von Befehlen an, nach denen ein neues Container-Image erstellt werden kann.

  • Docker-Befehlszeilenschnittstellentools. Docker bietet eine Reihe von CLI-Befehlen zum Verwalten des Lebenszyklus von bildbasierten Containern. Docker-Befehle umfassen Entwicklungsfunktionen wie Erstellen, Exportieren und Markieren sowie Laufzeitfunktionen wie Ausführen, Löschen, Starten und Stoppen eines Containers und vieles mehr.

Sie können Docker-Befehle für einen bestimmten Docker-Daemon oder eine Registrierung ausführen. Wenn Sie beispielsweise den docker -psBefehl ausführen , gibt Docker eine Liste der Container zurück, die auf dem Dämon ausgeführt werden.

Inhaltsverteilung mit Docker

Zusätzlich zur Laufzeitumgebung und den Containerformaten bietet Docker einen Softwareverteilungsmechanismus, der allgemein als Registrierung bezeichnet wird und die Erkennung und Verteilung von Containerinhalten erleichtert.

Das Konzept der Registrierung ist für den Erfolg von Docker von entscheidender Bedeutung, da es eine Reihe von Dienstprogrammen zum Packen, Versenden, Speichern, Erkennen und Wiederverwenden von Containerinhalten bietet. Docker Das Unternehmen betreibt eine öffentliche, kostenlose Registrierung namens Docker Hub.

  • Registrierung. Eine Docker-Registrierung ist ein Ort, an dem Container-Images veröffentlicht und gespeichert werden. Eine Registrierung kann remote oder lokal sein. Es kann öffentlich sein, so dass jeder es verwenden kann, oder privat, beschränkt auf eine Organisation oder eine Gruppe von Benutzern. Eine Docker-Registrierung enthält eine Reihe allgemeiner APIs, mit denen Benutzer Container-Images erstellen, veröffentlichen, suchen, herunterladen und verwalten können.
  • Docker Hub. Docker Hub ist eine öffentliche, Cloud-basierte Containerregistrierung, die von Docker verwaltet wird. Docker Hub bietet Unterstützung für die Erkennung, Verteilung und Zusammenarbeit von Images. Darüber hinaus verfügt Docker Hub über eine Reihe offizieller Bilder, die von Docker zertifiziert wurden. Dies sind Bilder von bekannten Softwareherstellern wie Canonical, Red Hat und MongoDB. Sie können diese offiziellen Bilder als Grundlage für die Erstellung Ihrer eigenen Bilder oder Anwendungen verwenden.

Abbildung 3 zeigt einen Workflow, in dem ein Benutzer ein Bild erstellt und in die Registrierung hochlädt. Andere Benutzer können das Image aus der Registrierung abrufen, um Produktionscontainer zu erstellen und diese auf Docker-Hosts bereitzustellen, wo immer sie sich befinden.

Die Unveränderlichkeit von Docker-Containern

Eine der interessantesten Eigenschaften von Docker-Containern ist ihre Unveränderlichkeit und die daraus resultierende Staatenlosigkeit von Containern.

Wie im vorherigen Abschnitt beschrieben, ändert sich ein einmal erstelltes Docker-Image nicht. Ein aus dem Image abgeleiteter laufender Container verfügt über eine beschreibbare Ebene, in der Laufzeitänderungen vorübergehend gespeichert werden können. Wenn der Container vor dem Löschen mit festgeschrieben wird docker commit, werden die Änderungen in der beschreibbaren Ebene in einem neuen Bild gespeichert, das sich vom vorherigen unterscheidet.

Warum ist Unveränderlichkeit gut? Unveränderliche Bilder und Container führen zu einer unveränderlichen Infrastruktur, und eine unveränderliche Infrastruktur bietet viele interessante Vorteile, die mit herkömmlichen Systemen nicht erreichbar sind. Diese Vorteile umfassen Folgendes:

  • Versionskontrolle. Docker verlangt explizite Commits, die neue Images generieren, und zwingt Sie zur Versionskontrolle. Sie können aufeinanderfolgende Versionen eines Bildes verfolgen. Ein Zurücksetzen auf ein vorheriges Image (daher auf eine vorherige Systemkomponente) ist durchaus möglich, da vorherige Images beibehalten und niemals geändert werden.
  • Sauberere Updates und besser verwaltbare Statusänderungen. Mit einer unveränderlichen Infrastruktur müssen Sie Ihre Serverinfrastruktur nicht mehr aktualisieren. Dies bedeutet, dass Sie keine Konfigurationsdateien mehr ändern müssen, keine Software-Updates, keine Betriebssystem-Upgrades usw. Wenn Änderungen erforderlich sind, erstellen Sie einfach neue Container und schieben sie heraus, um die alten zu ersetzen. Dies ist eine viel diskretere und überschaubarere Methode zur Zustandsänderung.
  • Minimierte Drift. Um Abweichungen zu vermeiden, können Sie alle Komponenten in Ihrem System regelmäßig und proaktiv aktualisieren, um sicherzustellen, dass es sich um die neuesten Versionen handelt. Diese Vorgehensweise ist bei Containern, die kleinere Komponenten des Systems kapseln, viel einfacher als bei herkömmlicher, umfangreicher Software.

Der Docker-Unterschied

Das Image-Format von Docker, umfangreiche APIs für das Container-Management und ein innovativer Software-Verteilungsmechanismus haben es zu einer beliebten Plattform für Entwicklungs- und Betriebsteams gemacht. Docker bietet diese bemerkenswerten Vorteile für ein Unternehmen.

  • Minimale deklarative Systeme. Docker-Container sind am besten geeignet, wenn es sich um kleine Einzweckanwendungen handelt. Dies führt zu Containern mit minimaler Größe, die wiederum eine schnelle Lieferung, kontinuierliche Integration und kontinuierliche Bereitstellung unterstützen.
  • Vorhersehbare Operationen. Das größte Problem beim Systembetrieb war immer das scheinbar zufällige Verhalten von Infrastrukturen oder Anwendungen. Docker zwingt Sie zu kleineren, besser verwaltbaren Updates und bietet einen Mechanismus zur Minimierung der Systemdrift, mit dem Sie vorhersehbarere Systeme erstellen können. Wenn Abweichungen beseitigt werden, können Sie sicher sein, dass sich die Software immer identisch verhält, unabhängig davon, wie oft Sie sie bereitstellen.
  • Umfangreiche Wiederverwendung von Software. Docker-Container verwenden Ebenen aus anderen Bildern wieder, was natürlich die Wiederverwendung von Software fördert. Das Teilen von Docker-Bildern über Registries ist ein weiteres großartiges Beispiel für die Wiederverwendung von Komponenten im großen Stil.
  • Echte Multicloud-Portabilität. Docker ermöglicht echte Plattformunabhängigkeit, indem Container frei zwischen verschiedenen Cloud-Plattformen, lokalen Infrastrukturen und Entwicklungsarbeitsplätzen migrieren können.

Docker ändert bereits die Art und Weise, wie Unternehmen Systeme erstellen und Services bereitstellen. Es beginnt sich zu verändern, wie wir über Software-Design und die Wirtschaftlichkeit der Software-Bereitstellung denken. Bevor diese Änderungen wirklich Fuß fassen können, müssen Unternehmen besser verstehen, wie Sicherheit und Richtlinien für die Docker-Umgebung verwaltet werden. Aber das ist ein Thema für einen anderen Artikel.

Chenxi Wang ist Chief Strategy Officer der Containersicherheitsfirma Twistlock.

Das New Tech Forum bietet einen Ort, an dem Sie neue Unternehmenstechnologien in beispielloser Tiefe und Breite erkunden und diskutieren können. Die Auswahl ist subjektiv, basierend auf unserer Auswahl der Technologien, die wir für wichtig und für die Leser von größtem Interesse halten. akzeptiert keine Marketingmaterialien zur Veröffentlichung und behält sich das Recht vor, alle eingebrachten Inhalte zu bearbeiten. Senden Sie alle Anfragen an [email protected]