Container: Die Zukunft der Anwendungsentwicklung
Software. Traditionell für den Einsatz auf einem einzigen System gedacht, erlebt seit der Einführung von Cloud-Technologien eine Revolution. Skalierbarkeit, Hochverfügbarkeit, Multi-Tenancy, Multi-Cloud und Portabilität (Vermeidung eines Vendor Lock-in) sind die Top-Themen mit denen sich CTOs und IT-Architekten seit geraumer Zeit beschäftigen müssen, um die Erwartungen der Geschäftsseite zu erfüllen.
Die Anforderungen um Hochverfügbarkeit und insbesondere Portierbarkeit zu beherrschen ist nicht einfach. Zum einen fehlen Unternehmen noch ausreichend Erfahrungswerte, zum anderen das notwendige Wissen für die Umsetzung. Aber wie lässt sich eine Software über unterschiedliche Plattformen und Infrastrukturen "bewegen", ohne dabei ständig an die jeweiligen Voraussetzungen für das Deployment und den Betrieb angepasst zu werden? Unterschiedliche Hardware- und Softwarekonfigurationen sowie Abhängigkeiten zu wechselnden Softwareversionen sorgen für eine stetig steigende Komplexität.
Im Jahr 1956 hat die Industrie ein Vorbild geschaffen. Container als Transportmittel für eine Vielzahl unterschiedlicher Güter, um diese per LKW und Schiffen von einem Ort A an einen anderen Ort B zu verfrachten. Ein Container ist per se erst einmal neutral. Für den Mieter ist einzig und alleine entscheidend welche Inhalte sich darin befinden. Container sind standardisiert und nach ISO genormt. Der Spediteur stellt lediglich die entsprechende Containergröße zur Verfügung. Für den Mieter ist also von vorneherein klar, welches Transportmittel ihn für welche Mengen und Größen an Gütern zur Verfügung steht.
Diesem Vorbild folgend etabliert sich ein ähnlicher Ansatz auch langsam aber sicher in der Anwendungsentwicklung. Mit Docker steht seit dem Jahr 2013 eine Technologie zur Verfügung, mit der sich Applikationen zwischen verschiedenen Systemen portieren lassen.
Software-Container: Was ist Docker?
Bei Docker handelt es sich um ein Open-Source Projekt, das für die automatisierte Bereitstellung von Applikationen, die in einem Container organisiert sind, eingesetzt werden kann. Docker nutzt hierzu die Eigenschaften des Linux Kernels. Ressourcen wie Prozessor, RAM, Netzwerk oder Block Speicher können so voneinander isoliert werden, ohne auch nur eine einzige virtuelle Maschine starten zu müssen. Weiterhin lassen sich Applikationen vollständig von der jeweiligen Umgebung inklusive der Prozesse, Dateisysteme oder des Netzwerks trennen und damit autonom betreiben. Mit dem Aufheben von externen Abhängigkeiten lassen sich Applikationen autonom über Systeme hinweg verschieben. Docker kapselt hierzu die eigentliche Anwendung und ihre notwendigen Abhängigkeiten wie Bibliotheken in einen virtuellen Container, welcher sich dann auf jedem beliebigen Linux Server ausführen lässt. Dies erhöht den Portabilitätsgrad und erhöht die Flexibilität.
Beim Betrieb einer Applikation auf einer virtuellen Maschine wird nicht nur die Applikation selbst, sondern ebenfalls eine Reihe weiterer Ressourcen benötigt, die für einen enormen Overhead und große Abhängigkeiten sorgen. Dazu gehören die notwendigen Bibliotheken sowie ein vollwertiges Betriebssystem und möglicherweise weitere Dienste und Applikationen.
Ein Docker Container hingegen umfasst nur die eigentliche Applikation sowie die dazugehörigen Abhängigkeiten. Dieser wird als isolierter Prozess auf dem Host Betriebssystem ausgeführt und teilt sich den Linux-Kernel mit anderen Docker Containern. Durch die strickte Isolation können mehrere Container auf dieselben Kernel-Ressourcen zugreifen. Für jeden Container lässt sich jedoch exakt definieren, wie viele Ressourcen (Prozessor, RAM, Bandbreite) ihm zur Verfügung stehen.
Wofür sollte Docker eingesetzt werden?
Für die Container-Virtualisierung á la Docker bieten sich verschiedene Einsatzmöglichkeiten, die für die tägliche Entwicklung und im Bereich DevOps Vorteile bieten:
• Offline-Entwicklung auf einem Laptop, um dieselbe Umgebung zu nutzen, wie es auf dem Produktivserver der Fall ist.
• Für Continuous Integration und Continuous Delivery
• Zur Optimierung des Entwicklungsprozesses (Entwicklung > Test > QA > Produktion)
• Für das verteilte "Collaborative Development" im Team.
• Zur Umsetzung von Multi-Cloud Szenarien (Umziehen / Betreiben der gleichen Applikation auf mehreren Cloud-Plattformen).
Docker ist bereits im Club der Großen angekommen
Ungeachtet dessen, dass Docker erst im Jahr 2013 veröffentlicht wurde, genießt die Technologie bereits eine sehr große Beliebtheit. Erst im Januar diesen Jahres wurde Docker Inc. mit 15 Millionen US-Dollar frischem Risikokapital ausgestattet. Zudem ist die Liste der Partner und Unterstützer prominent besetzt. Hierzu gehören:
• Amazon Web Services: In Docker verpackte Applikationen lassen sich z.B. über Amazon Elastic Beanstalk bereitstellen.
• Google: Anhand von Google Kubernetes lassen sich eine Vielzahl von Docker Containern auf der Google Compute Engine bereitstellen.
• Red Hat: Mit dem Project Atomic hat Red Hat ein Betriebssystem entwickelt, das als Basis für ein Host-System dienen soll, um Docker Container bereitzustellen.
• Microsoft: Microsoft hat Docker in seine Azure Plattform integriert, um Docker Container via virtuellen Linux Maschinen auf Azure bereitzustellen.
• IBM: IBM hat gleich mehrere Projekte gestartet, um den Docker-Einsatz im Unternehmensumfeld voranzutreiben. Hierzu wird ein DockerHub auf Softlayer zur Verfügung gestellt, um den Kunden den Zugriff auf das Docker Repository inklusive aller 14.000 Docker-Applikationen zu ermöglichen. Weiterhin wird in Zukunft ein von IBM zertifiziertes Docker-Image des WebSphere Liberty Profile Application Server angeboten.
Die Unterstützung und Adaption großer IT-Unternehmen, allen voran Microsoft, Google und IBM zeigt die große Bedeutung der Docker-Technologie für deren Zielgruppen und den Entwicklermarkt im Allgemeinen. IBM aber auch Microsoft können Docker dabei helfen, mittelfristig ebenfalls im Unternehmensumfeld Fuß zu fassen, um Portabilität von Cloud-Anwendungen zu optimieren.
Die Multi-Cloud wird Realität
Die Definition und der Einsatzweck einer Hybrid Cloud ist bekannt. Sie verbindet eine Private mit einer Public Cloud, um die lokalen Infrastrukturen bei Bedarf mit weiteren Ressourcen zu versorgen. Bei diesen Ressourcen kann es sich um Rechenleistung, Speicherplatz aber auch Services in Form von Software handeln. Ein Multi-Cloud Konzept erweitert den Hybrid Cloud Gedanken um die Anzahl der zu verbindenden Clouds. Genauer gesagt kann es sich dabei um n-Clouds handeln, die in irgendeiner Form miteinander integriert sind. Dabei werden beispielsweise Cloud-Infrastrukturen so miteinander verbunden, dass die Applikationen verschiedene Infrastrukturen oder Services parallel oder je nach Auslastung oder aktuellen Preisen nutzen. Auch das parallele oder verteilte Speichern von Daten über mehrere Clouds ist notwendig, um die Verfügbarkeit und Redundanz sicherzustellen.
So setzt schnee von morgen webTV von Nikolai Longolius zum Beispiel primär auf die Amazon Web Services und hat als Fallback Szenario eine native Web-Applikation 1:1 für die Google App Engine entwickelt. Das ist kein Multi-Cloud Ansatz, zeigt aber dessen Bedeutung, um weniger Aufwand für eine anbieterübergreifende Hochverfügbarkeit und Skalierbarkeit zu erreichen.
Werden Web-Applikationen samt ihrer Abhängigkeiten in Docker Containern gekapselt, lassen sich diese im Fehlerfall der darunterliegenden Infrastruktur/ Plattform zu einem anderen Anbieter verschieben/ starten. Durch den generischen Ansatz entfällt gleichzeitig die Entwicklung weiterer nativer Applikationen, um diese im Notfall hochzufahren. Werden die eigentlichen Daten/ Datenbanken dann separat bei weiteren Anbietern verteilt gespeichert ist das Risiko eines Ausfalls zu einem hohen Prozentsatz reduziert. Ein mögliches Docker-Szenario beschreibt James Thomson auf seinem Blog.
Docker ist ein strategisches Werkzeug
Nachdem die IT-Industrie Container in Form von virtuellen Maschinen genutzt hat, um eine Abstraktionsebene zu den physikalischen Plattformen zu schaffen, ermöglicht es Docker nun, Container zwischen den Plattformen zu verschieben. Genauer, Linux Applikationen und Workloads zwischen mehreren Clouds zu bewegen. Und damit die Portabilität zu verbessern.
Im ersten Moment erscheint Docker als ein reines Tool für Entwickler. Aus dem Blickwinkel eines IT-Entscheiders handelt es sich allerdings klar um ein strategisches Werkzeug für die Optimierung von modernen Applikations-Deployments. Docker hilft dabei, die Portabilität einer Anwendung sicherzustellen, die Verfügbarkeit zu erhöhen und das Gesamtrisiko zu minimieren. (jha)