Was ist Docker? Der Funke für die Containerrevolution

Docker ist eine Softwareplattform zum Erstellen von Anwendungen auf der Basis von Containern - kleine und einfache Ausführungsumgebungen, die den Betriebssystemkern gemeinsam nutzen, aber ansonsten isoliert voneinander ausgeführt werden. Während es Container als Konzept schon seit einiger Zeit gibt, hat Docker, ein 2013 gestartetes Open-Source-Projekt, dazu beigetragen, die Technologie bekannt zu machen und den Trend zu Containerisierung und Microservices  in der Softwareentwicklung voranzutreiben , der als Cloud-native bekannt geworden ist Entwicklung.

Was sind Container?

Eines der Ziele der modernen Softwareentwicklung ist es, Anwendungen auf demselben Host oder Cluster voneinander isoliert zu halten, damit sie den Betrieb oder die Wartung des anderen nicht übermäßig beeinträchtigen. Dies kann aufgrund der Pakete, Bibliotheken und anderen Softwarekomponenten, die für die Ausführung erforderlich sind, schwierig sein. Eine Lösung für dieses Problem waren virtuelle Maschinen, die Anwendungen auf derselben Hardware vollständig getrennt halten und Konflikte zwischen Softwarekomponenten und den Wettbewerb um Hardwareressourcen auf ein Minimum reduzieren. Virtuelle Maschinen sind jedoch sperrig - jede erfordert ein eigenes Betriebssystem, hat also normalerweise eine Größe von Gigabyte - und sind schwer zu warten und zu aktualisieren.

Im Gegensatz dazu isolieren Container die Ausführungsumgebungen von Anwendungen voneinander, teilen jedoch den zugrunde liegenden Betriebssystemkern. Sie werden normalerweise in Megabyte gemessen, verbrauchen weit weniger Ressourcen als VMs und werden fast sofort gestartet. Sie können auf derselben Hardware viel dichter gepackt und mit weitaus weniger Aufwand und Aufwand massenhaft auf und ab gedreht werden . Container bieten einen hocheffizienten und äußerst detaillierten Mechanismus zum Kombinieren von Softwarekomponenten zu den in einem modernen Unternehmen erforderlichen Anwendungs- und Service-Stacks und zum Aktualisieren und Verwalten dieser Softwarekomponenten.

Docker

Was ist Docker?

Docker ist ein Open Source-Projekt, mit dem Container und containergestützte Apps einfach erstellt werden können. Ursprünglich für Linux entwickelt, läuft Docker jetzt auch unter Windows und MacOS. Um zu verstehen, wie Docker funktioniert, werfen wir einen Blick auf einige der Komponenten, die Sie zum Erstellen von Docker-Container-Anwendungen verwenden würden.

Dockerfile

Jeder Docker-Container beginnt mit einer Docker- Datei . Eine Docker-Datei ist eine Textdatei, die in einer leicht verständlichen Syntax geschrieben ist und die Anweisungen zum Erstellen eines Docker- Images enthält (mehr dazu gleich). Eine Docker-Datei gibt das Betriebssystem an, das dem Container zugrunde liegt, sowie die Sprachen, Umgebungsvariablen, Dateispeicherorte, Netzwerkports und andere Komponenten, die er benötigt - und natürlich, was der Container tatsächlich tun wird, wenn wir ihn ausführen.

Paige Niedringhaus von ITNext hat eine gute Aufschlüsselung der Syntax einer Docker-Datei.

Docker-Bild

Sobald Sie Ihre Docker-Datei geschrieben haben, rufen Sie das Docker- buildDienstprogramm auf, um ein Image basierend auf dieser Docker-Datei zu erstellen . Während die buildDocker-Datei eine Reihe von Anweisungen ist, die angeben, wie das Image erstellt werden soll, ist ein Docker-Image eine tragbare Datei, die die Spezifikationen enthält, für welche Softwarekomponenten der Container ausgeführt wird und wie. Da eine Docker-Datei wahrscheinlich Anweisungen zum Abrufen einiger Softwarepakete aus Online-Repositorys enthält, sollten Sie darauf achten, die richtigen Versionen explizit anzugeben. Andernfalls kann Ihre Docker-Datei inkonsistente Bilder erzeugen, je nachdem, wann sie aufgerufen wird. Sobald ein Bild erstellt wurde, ist es statisch. Codefresh bietet einen detaillierteren Einblick in die Erstellung eines Bildes.

Docker laufen

Das Docker- runDienstprogramm ist der Befehl, mit dem ein Container tatsächlich gestartet wird. Jeder Container ist eine Instanz eines Bildes. Container sind so konzipiert, dass sie vorübergehend und vorübergehend sind. Sie können jedoch gestoppt und neu gestartet werden, wodurch der Container in den Zustand versetzt wird, in dem er gestoppt wurde. Außerdem können mehrere Containerinstanzen desselben Images gleichzeitig ausgeführt werden (sofern jeder Container einen eindeutigen Namen hat). Die Codeüberprüfung enthält eine umfassende Aufschlüsselung der verschiedenen Optionen für den runBefehl, um Ihnen ein Gefühl dafür zu geben, wie er funktioniert.

Docker Hub

Während das Erstellen von Containern einfach ist, sollten Sie nicht auf die Idee kommen, dass Sie jedes einzelne Ihrer Bilder von Grund auf neu erstellen müssen. Docker Hub ist ein SaaS-Repository zum Freigeben und Verwalten von Containern, in dem Sie offizielle Docker-Images von Open-Source-Projekten und Softwareanbietern sowie inoffizielle Images der allgemeinen Öffentlichkeit finden. Sie können Containerbilder mit nützlichem Code herunterladen oder Ihre eigenen hochladen, sie offen freigeben oder stattdessen privat machen. Sie können auch eine lokale Docker-Registrierung erstellen, wenn Sie dies bevorzugen. (Docker Hub hatte in der Vergangenheit Probleme mit Bildern, die mit eingebauten Hintertüren hochgeladen wurden.)

Docker Engine

Docker Engine ist der Kern von Docker, der zugrunde liegenden Client-Server-Technologie, mit der die Container erstellt und ausgeführt werden. Wenn jemand Docker generisch sagt und nicht über das Unternehmen oder das Gesamtprojekt spricht, bedeutet dies im Allgemeinen Docker Engine. Es werden zwei verschiedene Versionen von Docker Engine angeboten: Docker Engine Enterprise und Docker Engine Community.

Docker Community Edition

Docker veröffentlichte seine Enterprise Edition im Jahr 2017, aber sein ursprüngliches Angebot, das in Docker Community Edition umbenannt wurde, bleibt Open Source und kostenlos und hat dabei keine Funktionen verloren. Stattdessen hat die Enterprise Edition, die 1.500 US-Dollar pro Knoten und Jahr kostet, erweiterte Verwaltungsfunktionen hinzugefügt, darunter Steuerelemente für die Cluster- und Image-Verwaltung sowie die Überwachung von Sicherheitslücken. Der BoxBoat-Blog bietet einen Überblick über die Unterschiede zwischen den Editionen.

Wie Docker die Containerwelt eroberte

Die Idee, dass ein bestimmter Prozess mit einem gewissen Grad an Isolation vom Rest seiner Betriebsumgebung ausgeführt werden kann, ist seit Jahrzehnten in Unix-Betriebssysteme wie BSD und Solaris integriert. Die ursprüngliche Linux-Containertechnologie LXC ist eine Virtualisierungsmethode auf Betriebssystemebene zum Ausführen mehrerer isolierter Linux-Systeme auf einem einzelnen Host. LXC wurde durch zwei Linux-Funktionen ermöglicht: Namespaces, die eine Reihe von Systemressourcen umschließen und sie einem Prozess präsentieren, damit es so aussieht, als wären sie diesem Prozess gewidmet; und cgroups, die die Isolation und Verwendung von Systemressourcen wie CPU und Speicher für eine Gruppe von Prozessen regeln.

Container entkoppeln Anwendungen von Betriebssystemen, was bedeutet, dass Benutzer ein sauberes und minimales Linux-Betriebssystem haben und alles andere in einem oder mehreren isolierten Containern ausführen können. Und da das Betriebssystem von Containern abstrahiert ist, können Sie einen Container über jeden Linux-Server verschieben, der die Container-Laufzeitumgebung unterstützt.

Docker hat einige wichtige Änderungen an LXC vorgenommen, die Container portabler und flexibler machen. Mithilfe von Docker-Containern können Sie eine Workload noch schneller und einfacher bereitstellen, replizieren, verschieben und sichern als mit virtuellen Maschinen. Docker bietet Cloud-ähnliche Flexibilität für jede Infrastruktur, in der Container ausgeführt werden können. Die Container-Image-Tools von Docker waren auch ein Fortschritt gegenüber LXC, mit dem Entwickler Bildbibliotheken erstellen, Anwendungen aus mehreren Images zusammenstellen und diese Container und Anwendungen auf lokaler oder Remote-Infrastruktur starten konnten.

Docker Compose, Docker Swarm und Kubernetes

Docker erleichtert auch das Koordinieren des Verhaltens zwischen Containern und das Erstellen von Anwendungsstapeln durch Anhängen von Containern. Docker Compose wurde von Docker erstellt, um das Entwickeln und Testen von Anwendungen mit mehreren Containern zu vereinfachen. Es ist ein Befehlszeilentool, das an den Docker-Client erinnert und eine speziell formatierte Deskriptordatei verwendet, um Anwendungen aus mehreren Containern zusammenzustellen und sie gemeinsam auf einem einzelnen Host auszuführen. (Weitere Informationen finden Sie im Docker Compose-Tutorial.)

Fortgeschrittenere Versionen dieser Verhaltensweisen - sogenannte Container-Orchestrierung - werden von anderen Produkten wie Docker Swarm und Kubernetes angeboten. Docker bietet jedoch die Grundlagen. Obwohl Swarm aus dem Docker-Projekt hervorgegangen ist, hat sich Kubernetes de facto zur bevorzugten Docker-Orchestrierungsplattform entwickelt.

Docker Vorteile

Docker-Container bieten eine Möglichkeit zum Erstellen von Unternehmens- und Branchenanwendungen, die einfacher zusammenzustellen, zu warten und zu verschieben sind als herkömmliche Gegenstücke. 

Docker-Container ermöglichen die Isolierung und Drosselung

Docker-Container halten Apps nicht nur voneinander, sondern auch vom zugrunde liegenden System isoliert. Dies sorgt nicht nur für einen saubereren Software-Stack, sondern erleichtert auch die Festlegung, wie eine bestimmte containerisierte Anwendung Systemressourcen verwendet - CPU, GPU, Speicher, E / A, Netzwerk usw. Dies erleichtert auch die Trennung von Daten und Code. (Siehe „Docker-Container sind zustandslos und unveränderlich“ weiter unten.)

Docker-Container ermöglichen Portabilität

Ein Docker-Container wird auf jedem Computer ausgeführt, der die Laufzeitumgebung des Containers unterstützt. Anwendungen müssen nicht an das Host-Betriebssystem gebunden sein, sodass sowohl die Anwendungsumgebung als auch die zugrunde liegende Betriebsumgebung sauber und minimal gehalten werden können.

Beispielsweise kann ein MySQL für Linux-Container auf den meisten Linux-Systemen ausgeführt werden, die Container unterstützen. Alle Abhängigkeiten für die App werden normalerweise im selben Container geliefert.

Containerbasierte Apps können problemlos von On-Prem-Systemen in Cloud-Umgebungen oder von Entwickler-Laptops auf Server verschoben werden, sofern das Zielsystem Docker und alle Tools von Drittanbietern unterstützt, die möglicherweise damit verwendet werden, z Kubernetes (siehe „Docker-Container erleichtern die Orchestrierung und Skalierung“ weiter unten).

Normalerweise müssen Docker-Container-Images für eine bestimmte Plattform erstellt werden. Ein Windows-Container kann beispielsweise nicht unter Linux ausgeführt werden und umgekehrt. Bisher bestand eine Möglichkeit, diese Einschränkung zu umgehen, darin, eine virtuelle Maschine zu starten, auf der eine Instanz des erforderlichen Betriebssystems ausgeführt wurde, und den Container in der virtuellen Maschine auszuführen.

Seitdem hat das Docker-Team jedoch eine elegantere Lösung namens  Manifeste entwickelt , mit der Bilder für mehrere Betriebssysteme nebeneinander in dasselbe Bild gepackt werden können. Manifeste gelten immer noch als experimentell, weisen jedoch darauf hin, wie Container sowohl zu einer plattformübergreifenden als auch zu einer umgebungsübergreifenden Anwendungslösung werden können. 

Docker-Container ermöglichen die Kompositionsfähigkeit

Die meisten Geschäftsanwendungen bestehen aus mehreren separaten Komponenten, die in einem Stapel organisiert sind - einem Webserver, einer Datenbank und einem speicherinternen Cache. Behälter ermöglichen es, diese Teile zu einer Funktionseinheit mit leicht austauschbaren Teilen zusammenzusetzen. Jedes Stück wird von einem anderen Container bereitgestellt und kann unabhängig von den anderen gewartet, aktualisiert, ausgetauscht und modifiziert werden.

Dies ist im Wesentlichen das Microservices-Modell des Anwendungsdesigns. Durch die Aufteilung der Anwendungsfunktionalität in separate, in sich geschlossene Dienste bietet das Microservices-Modell ein Gegenmittel gegen die Verlangsamung traditioneller Entwicklungsprozesse und unflexibler monolithischer Apps. Leichte und tragbare Container erleichtern die Erstellung und Wartung von Microservices-basierten Anwendungen.

Docker-Container vereinfachen die Orchestrierung und Skalierung

Da Container leicht sind und wenig Overhead verursachen, können auf einem bestimmten System viel mehr Container gestartet werden. Container können jedoch auch verwendet werden, um eine Anwendung über mehrere Cluster von Systemen hinweg zu skalieren und Dienste hoch- oder runterzufahren, um Nachfragespitzen zu begegnen oder Ressourcen zu schonen.

Die meisten Enterprise-Versionen der Tools zum Bereitstellen, Verwalten und Skalieren von Containern werden über Projekte von Drittanbietern bereitgestellt. Das wichtigste davon ist Kubernetes von Google, ein System zur Automatisierung der Bereitstellung und Skalierung von Containern, aber auch der Verbindung, des Lastausgleichs und der Verwaltung von Containern. Kubernetes bietet auch Möglichkeiten zum Erstellen und Wiederverwenden von Anwendungsdefinitionen für mehrere Container oder „Helmdiagrammen“, sodass komplexe App-Stacks bei Bedarf erstellt und verwaltet werden können.

Docker enthält auch ein eigenes integriertes Orchestrierungssystem, den Swarm-Modus, der immer noch für Fälle verwendet wird, die weniger anspruchsvoll sind. Das heißt, Kubernetes ist etwas von der Standardwahl geworden; Tatsächlich wird Kubernetes mit Docker Enterprise Edition gebündelt.

Docker Vorbehalte

Container lösen sehr viele Probleme, sind aber keine Allheilmittel. Einige ihrer Mängel sind beabsichtigt, während andere Nebenprodukte ihres Designs sind.

Docker-Container sind keine virtuellen Maschinen

Der häufigste konzeptionelle Fehler, den Menschen mit Containern machen, besteht darin, sie mit virtuellen Maschinen gleichzusetzen. Da Container und virtuelle Maschinen jedoch unterschiedliche Isolationsmechanismen verwenden, haben sie deutlich unterschiedliche Vor- und Nachteile.

Virtuelle Maschinen bieten ein hohes Maß an Isolation für Prozesse, da sie in einer eigenen Instanz eines Betriebssystems ausgeführt werden. Dieses Betriebssystem muss auch nicht mit dem Betriebssystem identisch sein, das auf dem Host ausgeführt wird. Eine virtuelle Windows-Maschine kann auf einem Linux-Hypervisor ausgeführt werden und umgekehrt.

Im Gegensatz dazu verwenden Container kontrollierte Teile der Ressourcen des Host-Betriebssystems. Viele Anwendungen verwenden denselben Betriebssystemkern auf hoch verwaltete Weise. Infolgedessen sind containerisierte Apps nicht so gründlich isoliert wie virtuelle Maschinen, bieten jedoch eine ausreichende Isolation für die überwiegende Mehrheit der Workloads.

Docker-Container bieten keine Bare-Metal-Geschwindigkeit