Docker Schnellstart – Docker Anwendungsfälle
Die Bekanntheit von Docker, sowohl der Technologie als auch des Unternehmens, ist im letzten Jahr in die Höhe geschnellt. Ich kann mit Sicherheit sagen, dass es die am schnellsten wachsende Technologie ist, die ich in meiner Karriere gesehen habe, mit einer Adoptionsrate, die beispiellos ist.
Die Technologie wurde von einigen wichtigen Unternehmen angenommen und von großen Softwareanbietern, darunter Microsoft und Google, anerkannt. Das Unternehmen hat beträchtliche finanzielle Mittel erhalten und investiert in die Verbesserung der Nutzbarkeit der Technologie durch Forschung und Entwicklung, einschließlich der Verbesserung der Netzwerkfähigkeiten. Im Laufe des Jahres 2014 hat Docker sogar erhebliche Anstrengungen unternommen, eine formale Partnerstruktur aufzubauen.
Mein Unternehmen, Flux7, ist einer der ursprünglichen Gründungspartner von Docker. Wir wurden als Partner ausgewählt, weil wir schon früh Erfahrungen mit der Implementierung von Docker in mehreren wichtigen Anwendungsfällen gesammelt haben.
Dieser Artikel hebt hervor, was ich als die besten Anwendungsfälle ansehe, die alle auf Erfahrungen aus erster Hand sowie auf Versuch und Irrtum basieren.
Docker's wesentliche Vorteile
Docker bietet eine leichtgewichtige Virtualisierung mit fast null Overhead. Das bringt einige entscheidende Vorteile mit sich.
In erster Linie kannst du von der zusätzlichen Abstraktionsebene profitieren, die Docker bietet, ohne dich um den Overhead kümmern zu müssen. Der nächste große Vorteil ist, dass du viel mehr Container auf einer einzigen Maschine laufen lassen kannst als mit Virtualisierung allein.
Ein weiterer großer Effekt ist, dass das Hoch- und Herunterfahren von Containern innerhalb von Sekunden erledigt werden kann. Die Docker FAQ hat einen guten Überblick darüber, was Docker zu traditionellen Containern hinzufügt.
Zusammenfassend lässt sich sagen, dass die Funktionalität von Docker in mehrere Kategorien fällt:
- Portables Deployment von Anwendungen als ein einziges Objekt versus Prozess-Sandboxing;
- Anwendungszentriert versus Maschinen-/Server-zentriert;
- Unterstützung für automatische Container-Builds;
- Eingebaute Versionsverfolgung;
- Wiederverwendbare Komponenten;
- Öffentliche Registry für die gemeinsame Nutzung von Containern; und
- Ein wachsendes Tool-Ökosystem durch die veröffentlichte API.
Das Feature, das Docker meiner Meinung nach wirklich abhebt, ist das geschichtete Dateisystem und die Möglichkeit, Versionskontrolle auf ganze Container anzuwenden. Die Vorteile der Möglichkeit, Änderungen zu verfolgen, rückgängig zu machen und einzusehen, sind wohlbekannt und insgesamt eine sehr wünschenswerte und weit verbreitete Funktion in der Softwareentwicklung. Docker erweitert dieselbe Idee auf ein höheres Konstrukt; die gesamte Anwendung, mit all ihren Abhängigkeiten in einer einzigen Umgebung. Das ist noch nie dagewesen.
Die wichtigsten Anwendungsfälle von Docker
Hier sind nur einige der Anwendungsfälle, die mit der Docker-Technologie eine konsistente Umgebung mit geringem Overhead bieten.
1. Vereinfachung der Konfiguration
Der primäre Anwendungsfall, den Docker befürwortet, ist die Vereinfachung der Konfiguration. Einer der großen Vorteile von VMs ist die Möglichkeit, jede Plattform mit ihrer eigenen Konfiguration auf deiner Infrastruktur zu betreiben.
Docker bietet die gleiche Möglichkeit ohne den Overhead einer virtuellen Maschine. Es erlaubt dir, deine Umgebung und Konfiguration in Code zu packen und diesen zu deployen. Die gleiche Docker-Konfiguration kann auch in einer Vielzahl von Umgebungen verwendet werden. Dadurch werden die Anforderungen an die Infrastruktur von der Anwendungsumgebung entkoppelt.
Die Freiheit, deine Anwendungen über mehrere IaaS/PaaS zu betreiben, ohne zusätzliche Anpassungen, ist der ultimative Traum, den du mit Docker erreichen kannst.
Heute unterstützt jeder IaaS/PaaS-Anbieter von Amazon bis Google Docker. Die großen Namen haben ihre Wette auf Docker gesetzt. Jetzt bist du an der Reihe, von den gleichen Optionen zu profitieren.
2. Code Pipeline Management
Der vorherige Anwendungsfall hat einen großen Einfluss auf die Verwaltung der Code-Pipeline. Auf dem Weg des Codes von der Maschine des Entwicklers zur Produktion gibt es viele verschiedene Umgebungen, die er durchlaufen muss. Jede dieser Umgebungen kann kleine Unterschiede auf dem Weg dorthin aufweisen.
Docker bietet eine konsistente Umgebung für die Anwendung von der Entwicklung bis zur Produktion und vereinfacht so die Code-Entwicklung und die Deployment-Pipeline.
Die unveränderliche Natur von Docker-Images und die Leichtigkeit, mit der sie aufgesetzt werden können, helfen dir dabei, die Laufzeitumgebung deiner Anwendung von der Entwicklung bis zur Produktion nicht zu verändern.
3. Produktivität der Entwickler
Dies wiederum führt zu einigen zusätzlichen Vorteilen, die Docker für die Produktivität von Entwicklern bietet. Für ein detailliertes Beispiel kannst du dir hier meinen Vortrag auf der DockerCon 2014 ansehen.
In einer Entwicklerumgebung haben wir zwei Ziele, die im Widerspruch zueinander stehen:
- Wir wollen, dass es so nah wie möglich an der Produktion ist; und
- Wir wollen, dass die Entwicklungsumgebung so schnell wie möglich für die interaktive Nutzung ist.
Um das erste Ziel zu erreichen, müssen wir idealerweise jeden Dienst auf seiner eigenen VM laufen lassen, um zu reflektieren, wie die Produktionsanwendung läuft. Allerdings wollen wir nicht immer eine Internetverbindung benötigen und jedes Mal, wenn eine Kompilierung benötigt wird, den Overhead der Remote-Arbeit hinzufügen.
Hier kommt der geringe Overhead von Docker zum Tragen. Eine Entwicklungsumgebung hat in der Regel eine geringe Speicherkapazität und da Docker den Speicherbedarf nicht erhöht, wie es bei der Verwendung einer VM der Fall ist, können problemlos ein paar Dutzend Dienste ausgeführt werden.
Um das zweite Ziel zu erreichen, nämlich eine schnelle Feedbackschleife, nutzen wir die Shared Volumes von Docker, um den Anwendungscode für den/die Container aus dem Host-Betriebssystem des Containers verfügbar zu machen, welches eine Virtualbox VM ist (typischerweise eine Vagrant Box). Der Quellcode der Anwendung wird dem Host-Betriebssystem des Containers (Vagrant-Box) über die synchronisierten Ordner von Vagrant mit dem Host-Betriebssystem (Windows, Mac oder Linux) zur Verfügung gestellt.
Dieser Ansatz hat mehrere Vorteile. Der Entwickler kann den Quellcode von der Plattform seiner Wahl (Windows, Mac oder Linux) aus bearbeiten und ist in der Lage, die Änderungen sofort zu sehen, da die Anwendungen mit demselben Quellcode in der Laufumgebung der Vagrant-Box mit Docker-Container(n) laufen.
Darüber hinaus hilft dieser Ansatz einem Frontend-Ingenieur, der sich nicht so sehr für die Feinheiten des Backends interessiert, das komplette Anwendungssetup zu nutzen und an seinem Interessengebiet zu arbeiten, ohne dass der Setup- oder Installationsblues im Weg steht. Außerdem bietet es eine optionale Möglichkeit, weiter zu erforschen, wie Backend-Systeme unter der Haube funktionieren, um ein besseres Verständnis für den gesamten Stack zu bekommen.
Es gibt mehr Gedanken, die in diesen Ansatz einfließen. Die Vagrant-Box, über die wir sprechen, kann eine Vanilla OS-Distribution sein, die vollständig durch das Vagrantfile provisioniert wird. Oder es kann eine benutzerdefinierte Box sein, die bis zu einem gewissen Grad vorprovisioniert ist und dann mit dem Vagrantfile weiter provisioniert wird, wenn wir ein Vagrant up machen.
Es ist ein Kompromiss, wie es meistens der Fall ist, wenn es um technische Probleme geht. Wenn du keine Abhängigkeit vom Netzwerk haben willst, ist es der richtige Weg, eine eigene Box zu bauen, die mit allem vorprovisioniert ist. Der einzige Nachteil ist eine große VM-Box und eine nicht aktualisierte Umgebung.
Ein weiterer Punkt, den du beachten solltest, wenn du das erste Ziel erreichen willst (Minimierung der Diskrepanz zwischen Entwicklung und Produktion), ist eine Strategie für den Datenbank-Dump zu haben, damit alle Teile der App abgedeckt sind. Das ist etwas Analoges zu dem, was wir bei der Testabdeckung anstreben. Einfach eine zufällige Teilmenge zu bekommen ist keine optimale Lösung. Du musst eine Strategie haben, die alle abhängigen Funktionen deiner Anwendung abdeckt.
Wenn du die Möglichkeit hast, einen kompletten Datenbank-Dump zu machen, ist das auch ein guter Weg. Aber in diesen Zeiten von Big Data kannst du dir das kaum leisten. Du musst eine Teilmenge haben, an der du arbeiten oder die du testen kannst.
4. App Isolation
Es kann viele Gründe geben, warum du am Ende mehrere Anwendungen auf der gleichen Maschine laufen lässt. Ein Beispiel dafür ist der oben beschriebene Entwicklerproduktivitätsfluss. Aber es gibt auch andere Fälle.
Ein paar solcher Fälle, die man in Betracht ziehen sollte, sind die Serverkonsolidierung zur Kostensenkung oder ein schrittweiser Plan, eine monolithische Anwendung in entkoppelte Teile zu trennen.
Nehmen wir zum Beispiel an, dass du zwei REST API Server betreiben musst, die beide Flask nutzen. Aber jeder von ihnen verwendet eine etwas andere Version von Flask und anderen Abhängigkeiten. Wenn du diese API-Server unter verschiedenen Containern laufen lässt, bietet das einen einfachen Ausweg aus der sogenannten "Abhängigkeitshölle"
5. Server-Konsolidierung
Genauso wie die Verwendung von VMs zur Konsolidierung mehrerer Anwendungen, ermöglicht die Application Isolation Fähigkeit von Docker die Konsolidierung mehrerer Server, um Kosten zu sparen. Ohne den Speicherbedarf mehrerer Betriebssysteme und die Möglichkeit, ungenutzten Speicher über die Instanzen hinweg zu teilen, bietet Docker eine weitaus dichtere Serverkonsolidierung, als du sie mit VMs erreichen kannst.
Die neue Generation von hochgradig anpassbaren PAAS, wie Heroku, Elastic Beanstalk und App Engine, nutzen alle diese mächtige Funktion von Containern, die dir jetzt mit Docker zur Verfügung steht.
Darüber hinaus machen Open-Source-Projekte wie Deis, Kubernetes, Cadvisor, Panamax und andere das Deployment und die Überwachung einer großen Anzahl von Containern, die eine mehrschichtige Anwendungsarchitektur darstellen, überschaubar.
6. Debugging-Fähigkeiten
Docker stellt viele Tools zur Verfügung, die nicht unbedingt spezifisch für Container sind, aber gut mit dem Konzept von Containern funktionieren. Sie bieten auch extrem nützliche Funktionen. Dazu gehört die Möglichkeit, Container und Containerversionen zu überprüfen, sowie zwei Container zu vergleichen. Dies kann sehr nützlich sein, um eine Anwendung zu reparieren.
Flux7.com wurde innerhalb eines Docker Containers betrieben. Unser Webentwickler sagte uns, dass ein Absturz von einer Codeänderung herrührte, die er von der UI in die functions.php Datei geschoben hatte. Innerhalb einer Minute war ich in der Lage, eine Dev-Umgebung zu erstellen, die es dem Webentwickler ermöglichte, in einer Sandbox zu debuggen. Als er uns kurze Zeit später grünes Licht gab, konnten wir dank Docker und Linux Containern wieder auf die neueste Version der Website wechseln.
Obwohl der Prozess auch mit einer anderen Strategie lösbar gewesen wäre, war die Verwendung von Docker ein effizienter Weg, um das Problem zu lösen. Und es ist eine, die wir in einer Reihe von Kundenprojekten implementiert haben, bei denen die Front-End-Funktionalität geschäftskritisch ist.
7. Multi-Tenancy
Ein weiterer interessanter Anwendungsfall von Docker ist der Einsatz in mandantenfähigen Anwendungen, wodurch größere Anwendungsumstellungen vermieden werden können.
Unser eigenes Beispiel ist die Entwicklung einer schnellen und einfachen Multi-Tenancy für eine IoT-Anwendung. Codebasen für solche Multi-Tenant-Anwendungen sind weitaus komplizierter, starr und schwer zu handhaben. Das Umschreiben einer Anwendung ist nicht nur zeitaufwendig, sondern kostet auch viel Geld.
Mit Docker war es einfach und kostengünstig, isolierte Umgebungen zu schaffen, um mehrere Instanzen von App-Tiers für jeden Tenant zu betreiben. Dies war möglich, da Docker-Umgebungen sehr schnell hochgefahren werden können und eine einfach zu bedienende API zur Verfügung steht, mit der wir Container programmatisch spinnen können. Wir nutzten docker-py, eine Python-Bibliothek, um mit dem Docker-Daemon über eine Web-Applikationsschnittstelle zu interagieren.
8. Schnelles Deployment
Vor der Einführung von VMs dauerte das Einrichten einer neuen Hardware-Ressource Tage. Die Virtualisierung brachte diese Zahl auf Minuten herunter. Docker, indem es nur einen Container für den Prozess erstellt und kein Betriebssystem hochfährt, bringt es auf Sekunden. Dies ist die Technologie, die Google und Facebook dazu gebracht hat, Container zu verwenden.
Im Wesentlichen kannst du Ressourcen in deinem Rechenzentrum erstellen und zerstören, ohne dir Gedanken über die Kosten für das Wiederherstellen zu machen. Bei einer typischen Rechenzentrumsauslastung von 30% ist es einfach, diese Zahl durch eine aggressivere Zuteilung von Ressourcen zu erhöhen. Und die niedrigen Kosten für das Hochfahren einer neuen Instanz ermöglichen eine aggressivere Ressourcenzuweisung.
Außerdem gibt dir die unveränderliche Natur von Docker-Images die Gewissheit, dass die Dinge genau so funktionieren, wie sie funktionieren und funktionieren sollen.
Fazit zu Docker
Es gibt noch viele weitere dokumentierte Anwendungsfälle, die Docker als eine geeignete Lösung zeigen. Diese umfassen das Spektrum von Sicherheit bis hin zur Ermächtigung von Entwicklern. Ich habe mich auf die Anwendungsfälle konzentriert, bei denen wir gesehen haben, dass sie einen signifikanten Mehrwert für reale Projekte darstellen.
Von der Ausführung von API-Servern und Webanwendungen bis hin zur Ausführung von CUDA-Anwendungen und vollwertiger High-Definition-Desktop-Cloud-Visualisierung - wo du die GPU innerhalb des laufenden Containers nutzen kannst - bietet Docker eine breite Palette von Anwendungsfällen. Docker hat die Linux-Containertechnologie zugänglich und benutzerfreundlich gemacht, und, was noch wichtiger ist, verwaltbar. Für uns geht es bei der Motivation, Docker zu nutzen, immer darum, das richtige Werkzeug für das Projekt zu verwenden. Der interessanteste Teil ist der Business Case, dann bauen wir von dort aus auf.
Ich freue mich darauf, wenn dir der Docker-Schnellstart gefallen hat und bin gespannt, wie du Docker einsetzt.