Sebastian Kawelke
CEO
1.2.2024

Die Revolution in der Softwareentwicklung: Container und ihre Bedeutung

Bonn, 1.2.20241 Minuten Lesezeit
Die Revolution in der Softwareentwicklung: Container und ihre Bedeutung

Containerisierung hat die Art und Weise, wie wir Anwendungen entwickeln und verwalten, grundlegend verändert. Aber warum ist dieses Thema so wichtig?

Zu diesem Artikel ist auch ein Video verfügbar:

Wir brauchen Ihre Einwilligung Dieser Inhalt wird von YouTube bereit gestellt. Wenn Sie den Inhalt aktivieren, werden ggf. personenbezogene Daten verarbeitet und Cookies gesetzt.


Historischer Rückblick und die Entwicklung der Virtualisierung

Anwendungen wurden traditionell auf dedizierten, physischen Servern betrieben. Diese Einzelzuweisung von Servern zu spezifischen Anwendungen gewährleistete zwar eine strukturierte Betriebsführung und Interferenzfreiheit zwischen verschiedenen Programmen, sie resultierte jedoch ebenso in beträchtlichen finanziellen Ausgaben sowie einem aufgeblähten administrativen Aufwand. Mit dem Aufkommen der Virtualisierungstechnologie zeichnete sich ein Paradigmenwechsel ab. Die Virtualisierung ermöglichte die Emulation physischer Computersysteme innerhalb einer virtuellen Umgebung, was die simultane Ausführung multipler Applikationen auf einem einzelnen physischen Rechner erlaubte.

Trotzdem stößt die Vollvirtualisierung an ihre technischen Grenzen. Ihre Tendenz zu hohem Ressourcenverbrauch und daraus resultierenden mangelnden Flexibilität stehen im Gegensatz zu den agilen Anforderungen moderner Softwareentwicklungsprozesse. Die Dynamik zeitgenössischer Softwareentwicklung verlangt nach einer Architektur, die die schnelle, autonome und skalierbare Entwicklung und Bereitstellung einzelner Dienste ermöglicht. An diesem Punkt setzt die Container-Technologie an, die eine Antwort auf die Restriktionen der Vollvirtualisierung bietet und den Weg für eine effiziente, agile und ressourcenschonende Bereitstellung von Anwendungsdiensten ebnet.

Was ist ein Container?

Ein Container ist ein hochgradig portables, leichtgewichtiges und eigenständiges „Paket“ (Instanz eines Container-Images), das eine Softwareanwendung und alle ihre Abhängigkeiten enthält, einschließlich des Codes, der Laufzeitumgebung, der Systemwerkzeuge, der Systembibliotheken und der Einstellungen. Diese Technologie ermöglicht es, dass Anwendungen in verschiedenen Computing-Umgebungen homogen und isoliert funktionieren können.

In der Funktionsweise eines Containers spielen zwei Schlüsselkonzepte des Linux-Kernels eine zentrale Rolle: Linux Namespaces und Control Groups (cgroups).

Schema-Darstellung der Fundamente eines Containers: Linux Namespaces und cgroupsSchema-Darstellung der Fundamente eines Containers: Linux Namespaces und cgroups
Quelle: L3montree
Linux Namespaces sind eine Funktion des Linux-Kernels, die isolierte Arbeitsbereiche, sogenannte Namespaces, bereitstellt. Innerhalb dieser Namespaces kann eine Menge von Systemressourcen ausschließlich von Prozessen innerhalb des gleichen Namespaces gesehen und verwendet werden. Dies ermöglicht eine starke Prozessisolation, da Prozesse in einem Namespace Veränderungen vornehmen können, ohne andere Prozesse zu beeinflussen. Dadurch wird auch ein hohes Maß an Sicherheit gewährleistet, da Anwendungen nicht auf die Ressourcen oder Prozesse außerhalb ihres eigenen Namespace zugreifen können.

Control Groups (cgroups) sind ein weiteres Feature des Linux-Kernels, das die Organisation und Limitierung von Systemressourcen wie CPU, Speicher, Festplatten-I/O und Netzwerk für eine Gruppe von Prozessen ermöglicht. cgroups bieten eine feingranulare Kontrolle und Isolierung der Ressourcennutzung, was bedeutet, dass die Ressourcenverteilung präzise gesteuert werden kann, um Überlastung zu vermeiden und eine gerechte Ressourcenverteilung sicherzustellen.

Gegenüberstellung der Sicht von dem Host aus und von innerhalb eines Containers aus auf die ProzessstrukturGegenüberstellung der Sicht von dem Host aus und von innerhalb eines Containers aus auf die Prozessstruktur
Quelle: L3montree
Die Kombination aus Namespaces und cgroups bildet die Grundlage für die Isolation und das Ressourcenmanagement in Container-Umgebungen. Ein Container nutzt diese Mechanismen, um eine abgegrenzte Laufzeitumgebung für die Anwendung bereitzustellen, die von anderen Prozessen und Anwendungen auf demselben Host-System isoliert ist. Durch diese Isolation wird sichergestellt, dass sich die Ausführung oder das Verhalten einer Anwendung nicht auf andere Container auswirkt und umgekehrt.

Wichtig festzuhalten ist, dass auch ein Container am Ende „nur ein Prozess“ auf dem Host ist. In einem Container sieht es so aus, als sei man ein eigenes System (vgl. Abbildung, Prozess ID (PID) 1 für Startpunkt des Containers, auf dem Host PID 205732).


Warum sind Container in der Softwareentwicklung wichtig?

In der Domäne der Softwareentwicklung stellen Container eine fundamentale Innovation dar, die es ermöglicht, Anwendungsarchitekturen erheblich zu verdichten. Diese Technologie trägt maßgeblich zur Optimierung der Verwaltung und des Betriebs von Software bei. Container zeichnen sich durch ihre Portabilität aus, die es ermöglicht, Anwendungen und Services nahtlos zwischen verschiedenen Umgebungen zu migrieren – von der Entwicklung über das Testing bis hin zur Produktion. Diese Portabilität, gepaart mit einem modularen Aufbau, erleichtert nicht nur die Entwicklung und Bereitstellung von Anwendungen, sondern auch deren Skalierung und Verwaltung.

Ein entscheidender Vorteil der Containerisierung ist die Ermächtigung der Entwickler, die Bereitstellungsumgebung ihrer Anwendungen selbst zu definieren, anstatt sich auf Operations-Teams zu verlassen.

Dies fördert eine enge Integration von Entwicklungs- und Betriebsprozessen, bekannt als DevOps, und verringert den Koordinierungsaufwand zwischen den verschiedenen Teams. Die Ergebnisse sind eine gesteigerte Effizienz in der Entwicklungspipeline und eine beschleunigte Bereitstellung von Features und Updates, was in der agilen Welt der Softwareentwicklung von immenser Bedeutung ist.

Kulturwandel durch Container in der Softwareentwicklung

Die Integration von Containertechnologien in die Softwareentwicklung markiert einen signifikanten Kulturwandel, der tiefgreifende Auswirkungen auf Entwicklungsprozesse und Organisationsdynamiken hat. Dieser Wandel manifestiert sich in der Adaption von sechs Schlüsselprinzipien, die die Philosophie und Methodik der Softwareentwicklung transformieren.

Unveränderlichkeit (Immutability): Container verkörpern das Prinzip der Unveränderlichkeit, da einmal erstellte Container-Images nicht modifiziert werden. Änderungen führen zur Erstellung neuer Images statt zur Modifikation bestehender, was die Konsistenz und Vorhersehbarkeit von Anwendungsumgebungen sicherstellt. Diese Unveränderlichkeit minimiert Seiteneffekte und Regressionen, was wiederum die Zuverlässigkeit der Softwarebereitstellung erhöht.

Zustandslosigkeit (Statelessness): Container sind oft zustandslos konzipiert, was bedeutet, dass sie keine Benutzerdaten oder Zustände zwischen den Sitzungen speichern. Diese Eigenschaft vereinfacht das Management von Anwendungen, da Container beliebig zerstört und neu erstellt werden können, ohne dass der Gesamtzustand der Anwendung beeinträchtigt wird. Zustandslosigkeit ist somit integral für die Resilienz und Verfügbarkeit von Diensten.

Portabilität: Durch die Bündelung von Anwendungen mit ihren Abhängigkeiten fördern Container eine hohe Portabilität über verschiedene Umgebungen hinweg. Dies ermöglicht es Teams, einheitliche Entwicklungs-, Test- und Produktionsumgebungen zu verwenden, wodurch die Komplexität reduziert und der Übergang von der Entwicklung zur Produktion nahtlos gestaltet wird.

Skalierbarkeit (Scalability): Die leichte und schnelle Duplizierbarkeit von Containern erleichtert die horizontale Skalierbarkeit von Anwendungen. Dies bedeutet, dass bei zunehmender Last weitere Containerinstanzen problemlos hinzugefügt werden können, was eine flexible und dynamische Anpassung an wechselnde Lastanforderungen ermöglicht.

Ressourceneffizienz (Resource Efficiency): Container nutzen die vorhandenen Systemressourcen effizienter als traditionelle Virtualisierungstechnologien. Durch die gemeinsame Nutzung des Host-OS und der Ressourcenverwaltung durch cgroups kann eine höhere Ressourcendichte erreicht werden, die eine kosteneffektive Skalierung und Betrieb von Anwendungen ermöglicht.

Isolation: Schließlich ermöglicht die Containerisierung eine sicherheitstechnisch relevante Isolation von Anwendungsprozessen.

Zusammenfassend kann gesagt werden, dass die Einführung von Containern in der Softwareentwicklung weit mehr als eine technische Neuerung darstellt; sie repräsentiert einen paradigmatischen Wandel in der Kultur und Praxis der Softwareerstellung. Durch die Umsetzung dieser Prinzipien werden Organisationen befähigt, ihre Entwicklungsprozesse zu optimieren, was zu einer erhöhten Agilität, Effizienz und Qualität der Softwareprodukte führen kann.


Quellen:
1: Indrasiri, Kasun ; Siriwardena, Prabath: Microservices for the Enterprise: Designing, Developing, and Deploying. San Jose, CA, USA : Apress, Berkeley, CA, 2018. – 422 S. – ISBN 1484238575

2: Lukša, Marko: Einführung in Kubernetes. Version: Jul 2018, https://doi.org/10.3139/9783446456020.001

3: Ovens, Steve ; Red Hat Inc.: The 7 most used Linux namespaces | Enable Sysadmin https://www.redhat.com/sysadmin/7-linux-namespaces. Version: 2021

4: Docker Inc.: Docker Documentation | Glossary. https://docs.docker.com/glossary. Version: 2021, Abruf: 2021-08-175: Docker Inc.: What is a Container? | App Containerization | Docker https://www.docker.com/resources/what-container. Version: 2021, Abruf: 2021-08-17