Container-Technologie: Die Revolution der modernen IT-Infrastruktur
Container Technologien wie Docker, DDev, Podman, Kubernetes und co sind in aller Munde und nicht mehr aus der Informatik weg zu denken. Die Gründe sprechen auch ganz klar für sich. Doch einige Fragen bleiben: Was sind Container? Was ist die Motivation? Wofür verwende ich Container?
Zugegeben solche Fragen werden uns oft gestellt und das ist auch absolut verständlich. Die Technologie hinter den Konzepten zu Containern ist auch fast schon eine Wissenschaft für sich. In der modernen IT-Infrastruktur spielt Container-Technologie eine entscheidende Rolle bei der Bereitstellung, Verwaltung und Skalierung von Anwendungen. Durch die Nutzung von Containern können Softwarelösungen isoliert, leichtgewichtig und plattformunabhängig ausgeführt werden, was sowohl Entwicklern als auch Unternehmen zahlreiche Vorteile bietet. Im Vergleich zu herkömmlichen Virtualisierungsansätzen ermöglichen Container eine effizientere Ressourcennutzung und schnellere Deployment-Zyklen. Technologien wie Docker und Kubernetes haben sich in diesem Bereich als Standard etabliert und treiben die Automatisierung sowie die Cloud-Native-Entwicklung maßgeblich voran.
Erste Container Technologien
Bereits 1979 konnten schon sehr einfache Prozessisolationen mittels chroot auf UNIX V7 Systemen ermöglicht werden. Die Prozessisolationen von 1979 sind jedoch nicht vergleichbar mit den Isolationen heutiger Container Technologien wie Docker, Podman und co. Im Jahr 2000 erschien FreeBSD Jail als die erste Technologie für Container. Mit FreeBSD Jail ließen sich damals bereits Ressourcen virtualisieren und Netzwerkschnittstellen mit separaten IP-Adressen bestücken.
In den folgenden Jahren erschienen verschiedene weitere Softwares, welche einen ähnlichen Ansatz verfolgten. Durch eine Initiative von Google, mit dem Ziel für eine Technik zur Ressourcenbegrenzung von einzelner virtueller Instanzen, welche in den Linux-Kernel mit integriert wurde, entstand 2008 LXC. Mit den damals innovative Schnittstellen, welche von LXC mit geliefert wurden, konnten Entwickler:innen mit verschiedenen Programmiersprachen wie Python, Ruby und Java LXC um ihre Bedürfnisse erweitern, was letztlich zur großen Beliebtheit von LXC führte. Im März 2013 wurde Docker auf Grundlage von LXC veröffentlicht. Mit der Gründung der Open Container Initiative (OCI) im Jahr 2015, welche sich zum Ziel gesetzt hatte, einen offenen Standard im Umgang und der Entwicklung von Containern, verlagerte sich der Fokus von Docker von LXC weg und somit wurde die Bibliothek libcontainers entwickelt. Diese ist mit allen gängigen Betriebssystemen und Container Runtimes kompatibel.
Mehr zu LXC: LXC
Mehr zu Docker: Docker (Software)
Was ist die Open Container Initiative (OCI)?
Die Open Container Initiative (OCI) ist eine offene, herstellerneutrale Organisation, die Standards für Container-Formate und -Laufzeiten definiert. Sie wurde 2015 von der Linux Foundation gegründet, um eine einheitliche und interoperable Container-Technologie zu fördern.
Warum wurde die OCI gegründet?
Vor der OCI gab es verschiedene Container-Formate, die nicht immer miteinander kompatibel waren. Unternehmen wie Docker, CoreOS und Red Hat entwickelten eigene Standards, was zu Problemen bei der Portabilität und Interoperabilität führte. Die OCI wurde ins Leben gerufen, um einheitliche und offene Standards für Container zu schaffen und so die Kompatibilität zwischen verschiedenen Plattformen und Laufzeiten sicherzustellen.
Was sind Container?
Container sind im Grunde isolierte Laufzeitumgebungen für Softwares, welche den Vorteil haben, dass diese nahtlos auf allen gängigen Betriebssystemen ausgeführt werden können und deutlich kleiner sind als gängige virtuelle Maschinen. Sie bündeln alle, für die Software, notwendigen Abhängigkeiten (Bibliotheken, Konfigurationen, Umgebungsvariablen), sodass die Software unabhängig von der zugrunde liegenden Infrastruktur zuverlässig ausgeführt werden kann.
Im Gegensatz zu virtuellen Maschinen (VMs) benötigen Container kein eigenes Betriebssystem, sondern teilen sich den Kernel des Host-Systems. Dadurch sind sie effizienter in Bezug auf Speicher- und CPU-Nutzung und starten wesentlich schneller.
Wie funktioniert nun ein Container?
Die Grundlage eines Containers bildet die Technologie zur Prozessisolation. Hierzu können verschiedene Technologien verwendet werden:
- Namespaces: Trennen die Container-Prozesse voneinander, sodass sie keine Informationen über andere Container oder den Host sehen.
- cgroups (Control Groups): Begrenzen und verwalten die Ressourcennutzung (CPU, RAM, Netzwerk) für Container.
- Union Filesystems: Erlauben das effiziente Speichern von Container-Images in mehreren Schichten, wodurch Speicherplatz gespart wird.
Diese Mechanismen ermöglichen es, dass jeder Container wie eine eigenständige kleine "virtuelle Maschine" agiert, jedoch ohne den Overhead eines vollständigen Betriebssystems.
Motivation
Die grundlegende Motivation hinter Container Technologien wurde 1979 bereits mit einfachen Mechanismen, dem chroot, ermöglicht. Der Gedanke bzw der Wunsch war es Prozesse in einer separaten Dateisystemumgebung auszuführen ohne dass andere Prozesse mit diesen interagieren konnten. Das Ziel war ganz klar die Erzeugung von Prozess-Isolationen und Verbesserungen der Sicherheiten. Aus diesem Konzept entstanden in den 2000er Jahren Linux Namespaces und Control Groups (cgroups), welche Prozesse effizienter isolieren und die Ressourcennutzung verbessert. Diese Techniken bilden die Grundlage der heutigen Container Technologien.
Mit der Zeit etablierten sich weitere Motivationen auf Container Technologien zu setzen.
"It works on my machine"
Sprüche wie diese stellen ein fundamentales Problem in der Zusammenarbeit und dem Release-Management von Softwares dar. Mit Virtuellen Maschinen haben die entwickelnden Personen die Möglichkeit ihre Umgebungen so zu konfigurieren wie sie es benötigen. Gerade hierbei kann es schnell dazu kommen, dass jemand eine andere Version einer wichtigen Bibliothek installiert hat und somit kann es dazu kommen, dass die Software nicht mehr ordnungsgemäß funktioniert.
Um solche Situationen zu unterbinden, dass verschiedene Betriebssysteme, Bibliotheksversionen oder andere Abhängigkeiten aktiv Einfluss auf die Entwicklung haben, bestand der Wunsch nach System übergreifender Konsistenz. Mit heutigen Containern lassen sich einfach standardisierte Umgebungen schaffen, welche alle benötigten Abhängigkeiten, wie bestimmte Bibliotheken oder ähnliches, gekapselt enthalten und dies somit überall gleich ausführbar macht.
Effizienz im Vergleich zu virtuellen Maschinen (VMs)
Gerne wird an dieser Stelle argumentieren, das könnte man mit entsprechenden virtuellen Maschinen, wie Virtualbox, VMWare, Vagrant und co, ebenfalls ermöglichen. Dies ist auch soweit korrekt. Jedoch reduzieren Container, im Gegensatz zur einer klassischen VM, die Ressourcenbenutzung auf dem Betriebssystem erheblich. Während virtuelle Maschinen die Ressourcen gerne mehrfach abbilden, um entsprechend sich selbst zu isolieren, so arbeitet ein Container deutlich “leichtgewichtigter”. Eine virtuelle Maschine benötigt, damit diese im allgemeinen funktionieren kann immer ein Betriebssystem mit einem funktionierendem Kernel. Ein Container übersetzt die entsprechenden Sys-Calls per Container Runtime an den Kernel des Host Betriebssystem und benötigt somit kein eigenes Betriebssystem. Das heißt Container und Host teilen sich den selben Kernel.
Dies führt dazu, dass der Container deutlich weniger Ressourcen Overhead (CPU, RAM) erzeugt und deutlich effizienter arbeitet. Durch den geringeren Ressourcen Overhead und der Implementation der Container, lassen sich einfach und effizient mehrere Container auf der selben physischen Hardware betreiben und dem entsprechend skalieren.
Dank der geringere Größe kann der Container, je nach Konfiguration und Image, in wenigen Sekunden starten. Eine VM benötigt zu meist Minuten. Solche schnellen Iterationsgeschwindigkeiten sind für Betrieb mit variablen Skalierungen enorm wichtig.
Skalierbarkeit und Automatisierung
Mit der Entstehung des Cloud-Computing entstand die Notwendigkeit Anwendungen dynamisch skalieren zu können. Dank der enormen Iterationsgeschwindigkeit und der effizienten Ressourcenverwaltung von Containern, haben sich Container als das Medium für ein skalierten Betrieb von Anwendungen etabliert. Im Jahr 2015 erschien, durch die Initiative von Google, das Container-Orchestrierungstool Kubernetes. Kubernetes bietet durch seine Ansätze die perfekte Möglichkeit Anwendungen im großen Stil zu betreiben und automatisch zu verwalten.
In den darauf folgenden Jahren gab es verschiedene “Bastel”-Ansätze ebenfalls VM’s in eine Kubernetes Cluster zu betreiben. Diese haben sich jedoch nicht durchgesetzt.
Dank der enormen Möglichkeit an Automatisierungen entstanden verschiedene Ansätze den Release-Zyklus zu optimieren und dedizierte Entwicklungsstände bereitzustellen. Solche Konzepte lassen sich nahtlos in eine CI/CD-Pipeline integrieren.
Wofür können Container verwendet werden?
Die Container Technologie hat sich in alle Bereiche der IT ausgestreckt und sind mittlerweile ein unverzichtbares Werkzeug der modernen Softwareentwicklung. Dank der Effizienz, Portabilität und Skalierbarkeit können Container auf jeglicher Hardware ausgeführt werden.
Softwareentwicklung & Testing
Neben der Bereitstellung von standardisierten Container Images für Entwickler:innen können ebenfalls die selben Container Images mit der bestückten Software als Test-System hochgefahren werden. Dies führt dazu, dass die Entwicklungsumgebungen und Testumgebungen nahe zu identisch sind. Fehler innerhalb der Laufzeit oder der gleichen lassen sich schneller und effizienter ermitteln und beheben. Solch standardisierten Verfahren reduzieren Sätze wie “It works on my machine” auf ein Minimum.
Skalierung
Monolithische Software Architekturen haben oftmals das Problem, dass diese schwer skalierbar und wartbar sind. Gerne wird hier argumentiert, dass man doch mittels 3 VM’s mit einem Loadbalancer davor, ebenfalls eine “skalierte” Umgebung schaffen kann. Nun dies stimmt auch zum Teil. Monolithische Softwares innerhalb von VM’s lassen sich nicht so elegant und Kosten-effizient wie Microservice Architekturen in Container Umgebungen skalieren und betreiben. Während bei einer Monolithischen Architektur die gesamte Software skaliert wird, auch die Software Teile die ggf. nicht benötigt werden, so kann in einer Microservice Architektur lediglich die Software-Teile skaliert werden, welche, durch z.B.: hoher Last, es in dem Moment nötig haben. Bei manueller Bereitstellung und Skalierung kann es oft zu Fehlern kommen. Container-Orchestrierungstools wie Kubernetes können hierbei mit den verbauten Automatismen, die Fehlerrate reduzieren und die Bereitstellung und Skalierung automatisieren.
Edge Computing & IoT
Physische Hardware haben in der Regel limitierte Rechenleistungen zur Verfügung um hier dennoch rechenintensive Softwares auf der Hardware auszuführen, können mittels Orchestrierungstools wie Kubernetes sogenannte Cluster bereitgestellt werden. Somit können alle Arten von Softwares auf jeglicher Hardware ausgeführt werden. Hierbei gibt es keine Grenzen, siehe dazu: https://www.golem.de/news/militaer-us-air-force-nutzt-kubernetes-fuer-neuen-b-21-stealth-bomber-2006-148891.html und hier: The James Webb Space Telescope — Success through Redundancy .
Big Data & Künstliche Intelligenz (KI/ML)
Unabhängig ob Künstliche Intelligenz oder Big Data, beide hantieren mit enormen Datenmengen, teilweise im Terrabyte Bereich, und müssen dabei effizient sein. Hier bietet es sich an eine flexible und skalierbare Umgebung zu haben. Container Technologien und Container Orchestrierungstools wie Kubernetes bieten genau solche Umgebungen an. Zusätzlich lassen sich Datenanalyse-Pipelines und KI-Modelle isoliert und reproduzierbar auszuführen, was die Validierung der Daten enorm verbessert.
Fazit
Container-Technologien haben sich als unverzichtbares Werkzeug in der modernen IT-Infrastruktur etabliert. Ihre Entwicklung begann mit einfachen Prozessisolationen und hat sich bis zu hochentwickelten Orchestrierungslösungen wie Kubernetes weiterentwickelt. Die Vorteile liegen auf der Hand: Container bieten eine effiziente, plattformunabhängige und skalierbare Möglichkeit zur Bereitstellung und Verwaltung von Anwendungen.
Durch die Reduzierung von Ressourcen-Overhead im Vergleich zu virtuellen Maschinen ermöglichen Container eine optimierte Nutzung der Hardware und eine schnellere Bereitstellung von Software. Dies verbessert nicht nur die Entwicklung und das Testing, sondern erleichtert auch den Betrieb und die Automatisierung großer Anwendungen in der Cloud oder auf Edge-Geräten.
Dank offener Standards, wie sie von der Open Container Initiative (OCI) definiert wurden, sind Container plattformübergreifend einsetzbar und sorgen für Konsistenz zwischen Entwicklungs-, Test- und Produktionsumgebungen.
Ob für Microservices, Cloud-Computing, Edge-Computing oder KI-Anwendungen – Container sind die Grundlage für eine zukunftssichere, flexible und automatisierte IT-Landschaft. Ihr Einfluss wird weiter wachsen, da sie Unternehmen helfen, effizienter, sicherer und agiler zu arbeiten.