Alles, was Sie wissen müssen

Die Containerisierung ermöglicht Unternehmen, das Betriebssystem zu abstrahieren und Anwendungen in separierten Bereichen, sogenannten Containern, zu implementieren.

Containerisierung ist eine zeitgemäße Methode zur Anwendungsentwicklung.

Betrachten wir, wie das herkömmliche System und seine Architektur an einen Punkt gelangten, an dem viele Entwickler frustriert feststellten: „Mein Code funktioniert nicht; keine Ahnung warum! Oder Code funktioniert, aber niemand weiß genau weshalb!“

Mit zunehmender Komplexität von Anwendungen erweiterte sich die Definition von einer einfachen Codezeile hin zu einem Zusammenspiel von Code, Binärdateien, Konfigurationen und einer aktiven Laufzeitumgebung.

Stellen wir uns eine typische Situation aus der Vergangenheit vor: Ein Entwickler schrieb Java-8-Code auf seinem Laptop, der dann auf einem Webserver oder einer VM nicht funktionierte. Nach langwieriger Fehlersuche stellte sich heraus, dass auf dem Server JDK 11 installiert war.

Verwirrend, nicht wahr?

Der Code war unverändert, aber die Software, die ihn ausführte, hatte eine andere Konfiguration. Eine kleine Abweichung führte zu großen Problemen. Das Gleiche galt für den Transfer von Code zwischen Linux- und Windows-Betriebssystemen.

Der hohe Verwaltungsaufwand, die begrenzte Skalierbarkeit und die Kostenineffizienz des alten Systems ebneten den Weg für das Cloud Computing, bei dem Workloads auf VMs gehostet wurden, die von verschiedenen Cloud-Anbietern bereitgestellt wurden – im Grunde eine Form der Virtualisierung.

Vereinfacht gesagt, ermöglicht die Virtualisierung die Nutzung mehrerer Betriebssysteme (OS) auf einem einzelnen Server oder einer VM, die vom Cloud-Anbieter oder Rechenzentrum bereitgestellt wird. Virtualisierung isoliert Anwendungen, ohne dass physische Hardware oder detaillierte Kenntnisse über deren Inhalte erforderlich sind.

Doch auch diese Architektur erwies sich nicht als ideal, und die Containerisierung kam ins Spiel.

Die Containerisierung zielt darauf ab, Betriebssysteme in einzelne Blöcke zu zerlegen, die effizienter genutzt werden können. Sie schafft eine kleine, abgeschottete Umgebung, in der Anwendungscode ausgeführt wird, ohne sich Gedanken über das Betriebssystem oder die Hardware der VM machen zu müssen.

Lassen Sie uns die Containerisierung nun genauer betrachten.

Was bedeutet Containerisierung?

Containerisierung ist eine Art Betriebssystemvirtualisierung, bei der alle Komponenten einer Anwendung, einschließlich der Umgebung, d.h. des Betriebssystems, in dem sie laufen, in einem isolierten Bereich innerhalb einer VM, den sogenannten Containern, verpackt werden. Das zugrundeliegende Betriebssystem für diese Container ist identisch, aber jeder Container hat seine eigene spezifische Konfiguration.

Container sind keine massiven, ressourcenhungrigen Systeme. Sie sind klein, portabel und einfach einzurichten oder zu betreiben. Wenn ein Entwickler eine App containerisiert, wird der Container vom Hostbetriebssystem entkoppelt und hat nur eingeschränkten Zugriff auf die Ressourcen des Systems, ähnlich wie bei einer einfachen virtuellen Maschine. Die containerisierte Anwendung kann auf verschiedenen Infrastrukturen wie Bare Metal, in der Cloud oder auf VMs ausgeführt werden, ohne dass eine Neuentwicklung erforderlich ist.

Wie funktioniert die Containerisierungstechnologie?

Die Containerisierung funktioniert, indem alle notwendigen Elemente einer Anwendung in einer einzigen virtuellen Einheit zusammengefasst werden.

Containerisierung ermöglicht es Entwicklern, den Anwendungscode zusammen mit den zugehörigen Konfigurationsdateien, Abhängigkeiten und Bibliotheken zu bündeln. Dieses einzelne Softwarepaket, der Container, wird vom Hostbetriebssystem getrennt. Die Verkapselung macht den Container unabhängig und somit portabel, sodass er problemlos auf jeder Plattform oder in der Cloud ausgeführt werden kann. Stellen Sie sich das wie ein kleines Legostein auf einer Legoplatte vor.

Container nutzen jedoch keine direkt virtualisierten Hardware- oder Kernel-Ressourcen. Container kümmern sich nicht um das Betriebssystem, auf dem die VMs laufen.

Stattdessen werden Container auf einer Plattform ausgeführt, die speziell für den Umgang mit Containern entwickelt wurde und die zugrunde liegenden Ressourcen abstrahiert. Container sind virtuellen Maschinen und Bare-Metal-Servern hinsichtlich Geschwindigkeit und Größe überlegen, da sie nur die wesentlichen Komponenten und Abhängigkeiten einer Anwendung enthalten. Sie erlauben auch die Ausführung derselben Anwendung in verschiedenen Umgebungen, ohne die üblichen Kompatibilitätsprobleme.

Containerisierung vs. Virtualisierung

Personen, die sich nicht so gut mit dem Anwendungslebenszyklus auskennen, sind sich nicht immer des Unterschieds zwischen der Containerisierung, wie sie von Software wie Docker ermöglicht wird, und der traditionellen Servervirtualisierung, die mit Hypervisoren wie HyperV und VMware ESXi erreicht wird, bewusst. Hier ist der wesentliche Unterschied:

Bei der Servervirtualisierung wird die Hardware abstrahiert und ein Betriebssystem darauf installiert. Die Containerisierung ist eine Methode, um eine App auf einem bestehenden Betriebssystem auszuführen. Virtualisierung ist abhängig vom zugrundeliegenden Host-Betriebssystem, während sie die Hardware nur in Bezug auf verfügbare Ressourcen betrachtet. Hier ist eine detaillierte Auflistung der Unterschiede:

Eigenschaft Containerisierung Virtualisierung
Umgebung Container beinhalten ein Betriebssystem und können in unterschiedlichen Umgebungen laufen. Virtualisierung basiert auf dem Host, der als separate Maschine durch das Betriebssystem gesehen wird.
Startzeit Container starten sehr schnell. Virtuelle Maschinen benötigen einige Minuten zum Starten.
Ressourcen Container sind sehr ressourcenschonend. VMs benötigen viele Ressourcen und haben eine geringe Skalierbarkeit.
Implementierung Die zugrundeliegende Hardware wird durch Hypervisoren virtualisiert (gleiche Hardware). Container machen das Betriebssystem virtuell (gleiches Betriebssystem).
Kosten Einfacher und kostengünstiger zu implementieren. Höherer Aufwand und Kosten.

Ebenen der Containerisierung

Hardware-Infrastruktur: Das Fundament jeder Anwendung besteht aus einer Sammlung konkreter Ressourcen. Damit Container ordnungsgemäß funktionieren können, müssen diese Ressourcen vorhanden sein. Sie können sich auf einem Laptop oder in einem der zahlreichen mit der Cloud verbundenen Rechenzentren befinden.

Host-Betriebssystem: Direkt über der Hardware-Ebene befindet sich das Host-Betriebssystem. Ähnlich wie bei der Hardware-Ebene kann dies eine einfache Windows- oder * nix-Installation auf einem PC sein oder es kann komplett von einem Cloud-Service-Anbieter bereitgestellt werden.

Die Container Engine: Hier kommt ein entscheidender Bestandteil ins Spiel: die Container Engine. Container-Engines sind Programme, die auf dem Host-Betriebssystem laufen und für die Virtualisierung der Ressourcen zuständig sind, die von den containerisierten Anwendungen benötigt werden.

Diese Ebene wird am besten verstanden, wenn man Docker auf einem Computer verwendet. Diese Ebene stellt sicher, dass der Container einsatzbereit ist und verwaltet den gesamten Lebenszyklus.

Container: Containerisierte Anwendungen sind Code-Segmente, die alle Bibliotheken, Binärdateien und Konfigurationseinstellungen beinhalten, die eine App zum Laufen benötigt. Container werden oft auch als Docker-Container bezeichnet. Eine containerisierte Anwendung läuft als eigener Prozess im „User-Space“, der vom Kernel des Betriebssystems getrennt ist.

Die Vorteile der Containerisierung

Portabilität: Häufig klagen Entwickler, dass eine Anwendung in einer Umgebung (z.B. Staging) einwandfrei funktioniert, in einer anderen aber nicht. Das ist ein typisches DevOps-Dilemma. Oft liegt das Problem in Unterschieden in der Umgebung. Möglicherweise wurde eine Abhängigkeit aktualisiert. Mit Containerisierung können überall die gleichen Container-Images, inklusive der Abhängigkeiten, ausgeführt werden.

Schnelligkeit: Container starten viel schneller als virtuelle Maschinen oder Bare-Metal-Server. Container sind in wenigen Sekunden betriebsbereit, während VMs je nach Ressourcen und App-Größe mehrere Minuten benötigen.

Ressourcenschonung: Container sind effizienter als virtuelle Maschinen, da sie nur anwendungsspezifische Dateien enthalten. VMs sind Gigabyte groß, während Container oft nur Megabyte benötigen. Durch den Einsatz von Containern können Teams Serverressourcen deutlich effizienter nutzen.

Einfache Bereitstellung und Entwicklung: Portable Container können überall verwendet werden. Containerisierte Apps sind schnell, klein und einfach zu implementieren.

Die Containerisierung ermöglicht es Ihrem Team, dasselbe Image sowohl lokal als auch in der Produktion zu verwenden. Container-Apps können Situationen vermeiden, in denen etwas an einem Ort funktioniert, aber nicht an einem anderen. CI/CD-Pipelines unterstützen die Container-Erstellung. Diese Vorteile steigern die Produktivität der Teams.

Fehlerbehebung: Die Containerisierung isoliert und trennt Anwendungen. Ein Fehler in einem Container hat keine Auswirkungen auf die Funktion anderer Container. Entwicklungsteams können einen fehlerhaften Container erkennen und beheben, ohne andere zu beeinträchtigen. Die Container-Engine kann die SELinux-Zugriffssteuerung nutzen, um Containerprobleme zu finden und zu isolieren.

Sicherheit: Die Containerisierung von Programmen verhindert, dass Schadsoftware andere Anwendungen oder das Hostsystem beschädigt. Die festgelegten Sicherheitsberechtigungen verhindern, dass unerwünschte Komponenten in andere Container gelangen oder die Kommunikation zwischen ihnen eingeschränkt wird.

Verwaltbarkeit: Containerisierte Workloads und Dienste lassen sich über Container-Orchestrierungsplattformen automatisieren. Die Container-Orchestrierung erleichtert Verwaltungsaufgaben, wie z.B. die Veröffentlichung neuer App-Versionen, die Skalierung containerisierter Programme sowie die Überwachung, Protokollierung und Fehlerbehebung.

Kontinuität: Der Ausfall eines Containers beeinträchtigt die anderen Container nicht. Entwickler können einen Container reparieren, ohne andere zu beeinträchtigen. Containerisierung garantiert die Betriebskontinuität.

Fazit

Containerisierung ist ein neues Softwareentwicklungskonzept, das mit der Zeit immer leistungsfähiger wird. Seine Befürworter sind davon überzeugt, dass es Entwicklern hilft, Software und Apps schneller und sicherer zu entwickeln und bereitzustellen.

Mit zunehmender Reife und Weiterentwicklung des Containerisierungsökosystems erwarten Branchenexperten sinkende Preise. Das Betriebsproblem ist zwar gelöst, doch der Wartungsaufwand bei so vielen kleinen Umgebungen rückt in den Vordergrund. Der nächste bedeutende Schritt bei der Containerisierung ist die Orchestrierung.

Moderne Apps werden hier nicht stehen bleiben. Kubernetes ist die nächste große Entwicklung im Bereich Containerisierung und Microservices. Kubernetes erleichtert die Skalierung und Verwaltung von Containerinstallationen. K8s verwaltet Container-Deployments, die über die Möglichkeiten von Docker oder LXC hinausgehen. K8s ist ein häufig verwendetes Tool zur Containerverwaltung.

Nachdem Container nun etabliert sind, ist die allgemeine Empfehlung, auf K8s umzusteigen.