Container stehen bei Digitalisierungsstrategien mit Fokus auf IT-Architekturen weit oben auf der Agenda. Containerisation gilt als der bedeutendste Umbruch in der IT-Welt seit Einführung der Hardware-Virtualisierung mit virtuellen Maschinen (VMs). Dabei erhielt diese neue Variante der Virtualisierung ihren Aufschwung mit dem Trend hin zu sogenannten Microservices und weg von monolithischen Applikationen.
Ähnlich wie VMs sind Container eine Art Behälter für Anwendungen, in dem diese laufen können. Während VMs jedoch eine ganze Computer-Umgebung abbilden, enthalten die Container lediglich die wichtigen Daten, die für die Ausführung der Applikation benötigt werden. Dazu gehören Betriebssystem Komponenten wie Libraries und Binaries. Dies ermöglicht eine leichtgewichtigere Form der Virtualisierung. Die wohl bekannteste Container-Technologie ist Docker, weswegen der Begriff "Docker Container" in aller Munde ist.
Was sind Docker Container?
Docker Container stellen abgekapselte Einheiten dar, die unabhängig voneinander ausgeführt werden können, egal wo sie sich gerade befinden. Vergleichen wir sie mit Frachtcontainern, in denen ein oder mehrere Männchen sitzen und arbeiten. Diese Männchen sind in Wirklichkeit Applikationen, wie beispielsweise php, mysql und Apache und sitzen gemeinsam in einem Container (Beispiel s. Grafik). Für die Männchen macht es keinen Unterschied, ob der Frachtcontainer nun in München, New York oder Sydney steht, da dieser von innen immer gleich aussieht. Entsprechend herrschen dieselben Bedingungen. Dasselbe gilt auch für die Applikationen im Software-Container.
(Der tolle Vergleich wurde dieser Webseite entnommen)
Was ist der Unterschied zwischen Virtual Machines und Docker Containern?
Container werden als leichtgewichtigere Form der Virtualisierung bezeichnet, da innerhalb einer Betriebssystem-Installation mehrere von ihnen mit voneinander isolierten Applikationen laufen können. Wollen wir diese Trennung von Anwendungen mittels Hardware-Virtualisierung erreichen, müssen dafür zwei komplette VMs inklusive Betriebssystem gestartet werden. Dadurch benötigen VMs deutlich mehr Ressourcen.
Im Unterschied zu VMs wird bei Containern nicht die Hardware emuliert, sondern das Betriebssystem. Die VMs laufen direkt auf einem physischen Server der mit Hilfe eines sogenannten Hypervisors wie z.B. VMware ESXi virtualisiert wird. Die Virtualisierung bei Containern erfolgt auf einer höheren Ebene, ohne einen Hypervisor. Hier sorgt das installierte Betriebssystem mit der Container Engine für die Virtualisierung. Diese Art der Virtualisierung ist im Vergleich zur Emulation einer kompletten Hardware deutlich komplexer.
Was sind die Vorteile von Docker Containern?
Besonders bei Entwicklern erfreut sich die neue Technologie großer Beliebtheit, denn Docker Container sind im Vergleich zu VMs deutlich effizienter und ressourcensparender: Sie benötigen weniger CPU und Arbeitsspeicher.
Ein weiterer Vorteil ist ihre Portabilität. Als geschlossene Anwendungspakete sind sie auf unterschiedlichsten Systemen ausführbar. Somit lassen sie sich nicht nur für die Offline-Entwicklung nutzen, sondern funktionieren auch problemlos auf Produktiv-Servern, unabhängig von der gewählten Infrastruktur bzw. Cloud Plattform. Daraus resultiert eine höhere Geschwindigkeit und Konsistenz in der Entwicklung, beim Debugging und Testen. Passé sind die Diskussionen zwischen Entwicklung und Operations à la "bei mir lokal hat es aber noch funktioniert".
Container sind hochskalierbar. Werden zusätzliche Instanzen einer Anwendung benötigt, weil z.B. der Traffic auf einer Webseite durch eine gute Marketingkampagne steigt, lassen sich einfach neue starten und auch wieder stoppen. Innerhalb von Sekunden lassen sich hunderte Container hoch- oder runterfahren. Die Verwaltung dieser großen Anzahl kann durch Orchestrierungs-Lösungen erleichtert werden.
Was ist Container Management?
Zum effizienten Managen von einer großen Anzahl von Containern bedarf es einer Orchestrierungs-Lösung. Die wohl bekanntesten sind Kubernetes, Docker Swarm sowie Amazons Elastic Container Service. Sie sorgen u.a. für das Starten und Stoppen, die optimale Platzierung auf verfügbaren Compute Nodes oder die automatisierte Anpassung benötigter Compute Nodes bei Laständerungen.
Bei Claranet setzen wir für das Container Management auf Kubernetes. Wer sich eingehender mit dem Thema auseinandersetzen möchte, findet Informationen zu Chancen und Risiken sowie Beispielszenarien in unserem Whitepaper "Kubernetes im Unternehmen".
Whitepaper "Kubernetes im Unternehmen"
Was sind Container Images?
Nachdem die Vorteile der neuen Technologie auf der Hand liegen, stellt sich nun die Frage wie diese gebaut bzw. genutzt werden kann. Die Basis für Container bilden sogenannte Images, eine einfache Datei durch die die Installation und das Updaten einer Software wegfällt. Images beinhalten alle Komponenten, um eine Anwendung plattformunabhängig auszuführen. Somit kann ein Image lediglich durch einen einfachen Kopiervorgang auf ein anderes System übertragen werden. Anschließend lässt sich der Container aus dem Image starten.
Verfügbar gemacht werden Images über eine Registry, die sie speichert, verwaltet und bereitstellt. Die bekannteste öffentliche Registry ist Docker Hub.
Was ist der Container-Lebenszyklus?
Ein Image ist natürlich nicht in Stein gemeißelt und kann beliebig angepasst werden. Dieser Anpassungsprozess wird auch als Container-Lebenszyklus bezeichnet. Diesen möchte ich anhand eines Beispiels illustrieren:
- Typischerweise beginnt das Leben eines Docker Containers mit dem Download eines Images aus einer Registry. Wie bereits oben erwähnt ist eine Registry ist eine Art Lagerhalle für Container Images.
- Aus ihr laden wir nun ein Beispielimage herunter. Durch das Starten des Images auf unserem Docker Host erzeugen wir den eigentlichen Container. In unserem Beispiel enthält er ein Ubuntu Betriebssystem sowie einen Apache Webserver
- Nun können wir diesen nach Bedarf anpassen, indem wir zum Beispiel eine weitere Komponente hinzufügen. In unserem Fall nehmen wir PHP.
- Zum dauerhaften Speichern wird aus dem Container wieder ein Image erzeugt. Das neue Image besteht nun aus Ubuntu, Apache und PHP.
- Zum Schluss wird das Image wieder in der Registry abgelegt und kann daraufhin als Basis für andere Erweiterungen dienen.
Was ist zu beachten?
Zu guter Letzt hier noch ein paar Tipps und Tricks:
- Idealerweise sollte nur ein Service bzw. Prozess pro Container implementiert werden. Ausnahmen von der Regelung machen dann Sinn, wenn Applikationen eng miteinander verwoben bzw. voneinander abhängig sind. Beispielsweise kann es bei PHP sinnvoll sein nginx und php-fpm im selben Container zu haben.
- Es sollten keine Nutzdaten, also persistente Daten im Container gespeichert werden. Container sind nämlich standardmäßig als „Immutable Infrastructure“ zu verstehen. Das heißt, dass sie nur so lange existieren wie sie etwas tun. Beim Beenden bzw. beim Neu-Deployment verschwinden auch alle Daten die innerhalb der Laufzeit erzeugt wurden. Entsprechend muss für Nutzdaten ein externes, persistentes Volume verwendet werden.
- Für eine höhere Qualität und Wiederverwendbarkeit sollten Automatisierungs-Tools wie Terraform, Ansible und Jenkins genutzt werden. Mit den genannten Tools in petto und der Berücksichtigung einiger Do‘s and Don’ts erhält man eine sehr moderne, dynamische und hochskalierende Umgebung.
Falls Ihnen diese Erklärung gefallen hat und Sie die zugehörige Infografik an Kollegen oder Freunde weitergeben möchten, steht diese hier als PDF zum Teilen bzw. Download bereit.
Infografik Docker Container herunterladen