Container Virtualisierung mit Docker

Nils Ramsperger 13.05.2019

Entwicklung und Betrieb von Software-Systemen effizienter gestalten

Das Thema Container Virtualisierung und insbesondere Docker sind nun schon seit einiger Zeit in aller Munde. Seit dem Erscheinen von Docker im Jahr 2013 hat sich die Thematik prächtig entwickelt und ist inzwischen alles andere als bloß ein Hype. Im Bereich der Softwareentwicklung hat wahrscheinlich jeder schon davon gehört und viele setzen es produktiv ein. Sofern man sich noch nicht mit diesem Thema auseinandergesetzt hat, sollte man definitiv einen Blick riskieren.

Docker
Container Virtualisierung bietet ein enormes Potential, um Abläufe in Entwicklung und Betrieb von Software-Systemen effizienter zu gestalten. Zusätzlich ermöglicht die dadurch entstehende Abstraktionsebene zwischen Anwendungen und Maschinen eine einfachere Skalierung des Gesamtsystems. Einen ersten Einblick in dieses Thema soll dieser Artikel bieten.

Worum geht es bei Container Virtualisierung

Virtualisierung an sich ist im Bereich der IT Infrastruktur schon lange ein fester Bestandteil. Warum also die Begeisterung für etwas, das im ersten Moment nicht großartig anders erscheint? Wo liegt der Unterschied?
In der klassischen Virtualisierung werden vollständige Rechner simuliert. Es wird dabei auf einer virtuellen Maschine ein komplettes Betriebssystem ausgeführt. Dieses beinhaltet den vollständigen Bedarf an Speicher- und Rechenkapazität, den das jeweilige Betriebssystem auch auf einem realen Rechner benötigen würde. Werden auf einem Rechner mehrere virtuelle Maschinen ausgeführt, müssen auf der Hardware auch entsprechend viele Betriebssysteme ausgeführt werden. Es entsteht ein sehr hoher Overhead an Last, der die verfügbaren Ressourcen für Anwendungen entsprechend reduziert.
Die Containervirtualisierung im Gegensatz beschränkt sich ausschließlich auf eine jeweils einzelne Anwendung und deren Abhängigkeiten. Das verwendete Betriebssystem ist dabei das des realen Rechners.
Docker Schema
Man kann sich eine Anwendung in ihrem Container vorstellen wie eine App auf einem Smartphone. Alle Apps laufen auf dem selben System und sind dabei weitgehend voneinander isoliert. In Konsequnz ist der Bedarf an Speicher und Rechenkapazität deutlich kleiner und es stehen mehr Ressourcen für die produktive Nutzung zur Verfügung.
Im Vergleich zu virtuellen Maschinen sind Container sehr sparsam und leichtgewichtig. Ein Conatiner ist in Sekunden erstellt und gestartet. Genau so schnell ist er wieder gestoppt und rückstandsfrei gelöscht. Eine virtuelle Maschine benötigt hingegen für jede dieser Aktionen mehrere Minuten. Dieser Vorteil trägt maßgeblich zur Beliebtheit der Containervirtualisierung und Docker bei.

Was ist Docker

Docker ist aktuell die populärste Lösung für Container Virtualisierung. Es besteht dabei aus mehreren Komponenten, die zusammen ein ganzes Ökosystem bilden. Der primäre Teil ist die namensgebende Ausführungsumgebung für Container. Diese ist für nahezu alle Betriebssysteme verfügbar, die aktuell verwendet werden. Es werden Windows, macOS und viele Linux/Unix Systeme unterstützt. Ein Container verhält sich, mit wenigen Ausnahmen, auf allen Umgebungen gleich. Daraus ergibt sich der Vorteil, dass ein Conatiner zum Beispiel auf einem macOS Rechner entwickelt werden kann und anschließend ohne Probleme auf einem Linux Server ausführbar ist.
Eine weitere Komponente stellt DockerHub dar. Es handelt sich dabei um eine Bibliothek für Images. Diese werden benötigt, um Container zu erstellen. Sie stellen also gewissermaßen die Bauanleitung für einen Container dar. Auf DockerHub findet man offizielle Images für übliche Programme. Darunter fallen zum Beispiel verschienenste Datenbanken wie MySQL oder MongoDB und Laufzeitumgebeungen für Programmiersprachen wie Java oder Node.js. Dazu kommen noch unzählige weitere Images aus anderen Open Source Projekten oder von Privatpersonen.
Man sagt: “Für jedes Problem gibt es ein Docker Image.”
Unter Umständen lässt sich ein Problem nicht mit Standardsoftware lösen. Wahrschienlich möchte man auch eine selber entwickelte Software im Container laufen lassen. In diesen Fällen kann man selber ein passendes Image entwickeln und daraus Container erstellen. Diese Images können auf DockerHub der Allgemeinheit zur Verfügung gestellt werden, oder in privaten Repositories für interne Verwendung bereitgestellt werden.

Docker Components
Docker Images können aus eigenen Quellen gebaut (build), oder aus dem Repository heruntergeladen werden (pull). Nachdem das Image lokal zur Verfügung steht, kann daraus ein Container erstellt und dieser ausgeführt werden (run). Dafür sendet der Benutzer (client) über die Kommandozeile Befehle an die Docker Ausführungsumgebung (Docker Daemon).

Neben Docker gibt es auf dem Markt noch weitere Alternativen. Viele davon folgen den Standards der Open Container Iniative, welche von Docker ins Leben gerufen wurde. Durch die Implementierung einheitlicher Standards sind die einzelnen Systeme kompatibel zueinender und Docker hat sich als Oberbegriff etabliert. Zum Einen handelt es sich dabei um Laufzeitumgebungen analog zu Docker. Beispiele hierfür sind rkt oder runC. Zum Anderen handelt es sich um Integrationen in Cloud-Systemen, wie Amazon AWS oder Microsoft Azure.

Management von Containern und Clustern

Wurde Docker auf einer Maschine installiert, können auf dieser mittels Kommandozeile Container erstellt und ausgeführt werden. Während diese Herangehensweise im Rahmen einer Software Entwicklung durchaus zielführend ist, ist sie für den späteren Betrieb nicht ausreichend. Es ergeben sich zusätzliche Anforderungen im Bereich Wartbarkeit und Verfügbarkeit.
Um die Verfügbarkeit zu erhöhen, können mehrere Maschinen zu einem Cluster zusammengeschaltet werden. Daraus ergibt sich eine Erhöhung Ausfallsicherheit und mehr Spielraum zur Bewältigung von Lastspitzen. Aus dem Docker Universum steht dafür Docker Swarm zur Verfügung. Die wohl verbreiteste Lösung für dieses Szenario ist aber Kubernetes aus dem Hause Google. Wärend Docker Swarm analog zu Docker selbst nur über die Kommandoziele bedient werden kann, bietet Kubernetes eine Web Oberfläche zur Verwaltung des Clusters und der darauf laufenden Anwendungen. Um bei Docker Swarm denselben Komfort zu bekommen, kann Docker Cloud eingesetzt werden.
Kubernetes ist eine Open Source Software, die auf eigenen Maschinen installiert werden kann. Dagegen handelt es sich bei Docker Cloud um ein kommerzielles Software as a Service Produkt.

Pro und Contra

Möchte man Container Virtualisierung einsetzen, sollte einem bewusst sein, dass damit gewisse Mehraufwände verbunden sind. Einerseits muss die benötigte Infrastruktur geschaffen und funktionsfähig gehalten werden. Andererseits muss jeder eingesetzte Container regelmäßig auf Aktualisierungen geprüft werden.
Im Gegensatz dazu stehen allerdings viele Vorteile. Container können aufgrund ihrere leichtgewichtigen Natur sehr flexibel und agil eingesetzt werden. Gerade im Vergleich zu klassichen virtuellen Systemen. Da Container keine Rückstände auf ihren Host Systemen hinterlassen, steht kurzen Lebenszyklen nichts im Weg. Bei Bedarf werden Container erstellt und anschließend wieder verworfen. Container verhalten sich auf nahezu allen Systemen gleich. Somit können Probleme bei der Transition von Entwicklung zu Betrieb minimiert werden. Anwendungen aus mehreren Containern in Cluster Systemen können leicht skaliert werden. Auf Änderungen beim Bedarf kann daher schnell und flexibel reagiert werden.
Der in diesem Artikel gegebene Überblick über das Feld der Container Virtualisierung, sollte das große Potential dieser Technologie vermittelt und Ansatzpunkte für weitere Recherchen zur Thematik aufgezeigt haben.

Quellen
Nils Ramsperger

Consultant bei frobese GmbH