Writing
Was sind Container?
Einführung in Container, Linux cgroups, Namespaces und moderne Containerisierung.
Table of Contents
- Container sind eine Technologie, um Anwendungen und ihre Abhängigkeiten zu paketieren und in einer isolierten Umgebung auszuführen.
Das grundlegende Ziel der Containerisierung besteht darin, eine verlässlichere Methode zur Erstellung, Paketierung und Bereitstellung von Software über verschiedene Umgebungen hinweg auf vorhersagbare und einfach zu verwaltende Weise zu bieten.
Was sind Container?
Container sind eine Virtualisierungstechnologie auf Betriebssystemebene, mit der Anwendungen und ihre Abhängigkeiten paketiert und in isolierten Umgebungen ausgeführt werden. Sie bieten eine leichtgewichtige Methode, um Anwendungen standardisiert über viele verschiedene Infrastrukturtypen hinweg bereitzustellen.
Linux cgroups und Namespaces
Der Linux-Kernel verfügt über grundlegende Funktionen, die dies ermöglichen. Linux Control Groups (cgroups) sind eine Kernel-Funktion, mit der Prozesse und ihre Ressourcen als Einheit gruppiert, isoliert und verwaltet werden können. cgroups bündeln Prozesse, bestimmen, auf welche Ressourcen sie zugreifen dürfen, und bieten Mechanismen zur Überwachung ihres Verhaltens. Sie folgen einem hierarchischen System, wodurch Kindprozesse die Bedingungen ihrer Elternprozesse erben und weitere Einschränkungen übernehmen können.
Die zweite Kernfunktion, auf die sich Container stützen, sind Linux-Namespaces. Namespaces schränken ein, was Prozesse vom Rest des Systems sehen können. Prozesse, die innerhalb eines Namespaces laufen, haben keine Kenntnis über Prozesse außerhalb dieses Namespaces. Da Namespaces einen isolierten Kontext definieren, spiegelt der Prozessbaum diesen Kontext wider: Innerhalb des Namespaces wird der Hauptprozess zur PID 1 (traditionell für das Init-System reserviert). Dieser Prozessbaum ermöglicht es Prozessen im Container, sich wie in einer normalen, uneingeschränkten Umgebung zu verhalten.
Leichtgewichtige Virtualisierung
Im Vergleich zur Hardware-Virtualisierung mit virtuellen Maschinen (VMs) sind Container extrem leichtgewichtig. Anstatt alle Hardwareressourcen zu virtualisieren und ein vollständiges, unabhängiges Betriebssystem auszuführen, nutzen Container den Kernel des Hostsystems und laufen als getrennte Prozesse innerhalb dieses OS.
Aus Sicht des Hosts laufen Container wie jeder andere Prozess, was schnelle Start- und Stoppzeiten und einen sparsamen Ressourcenverbrauch bedeutet. Ein Container kann nur auf einen zugewiesenen Teil des Prozessraums und der Ressourcen zugreifen, verhält sich jedoch in den meisten Situationen wie ein eigenständiges Betriebssystem.
Container-Images können sehr kompakt gehalten werden. Minimale Image-Größen ermöglichen Workflows, bei denen das neueste Image zur Laufzeit ohne spürbare Verzögerung geladen wird – eine Voraussetzung für fehlertolerante, selbstheilende verteilte Systeme.
Isolierung der Umgebung
Durch den Einsatz von cgroups und Namespaces werden Container sowohl vom Host als auch voneinander isoliert. Dies gewährleistet eine funktionale Abgrenzung, die gegenseitige Beeinträchtigungen verhindert.
Obwohl dies keine vollständige Sicherheits-Sandbox darstellt, bietet diese Isolierung erhebliche Vorteile: Versionskonflikte bei Bibliotheken werden vermieden, da Host und Container separate Dateisysteme nutzen. Zudem können Netzwerkumgebungen getrennt werden, sodass Anwendungen auf Standardports lauschen können, ohne mit anderen Diensten auf dem Host zu kollidieren.
Standardisiertes Paketierungsformat und Laufzeitumgebung
Einer der größten Vorteile von Containern ist die Standardisierung des Paketierungs- und Deployment-Prozesses. Mit Container-Images bündeln Entwickler Anwendungen und alle Laufzeitabhängigkeiten in einer einzigen, überall lauffähigen Einheit.
Abhängigkeiten werden beim Erstellen des Images fixiert. Da die Container-Runtime als einheitliche Zielplattform fungiert, läuft der Container in der Produktion genauso wie in der Entwicklungsumgebung. Administratoren können sich auf die Bereitstellung homogener Host-Plattformen konzentrieren, während anwendungsspezifische Eigenheiten innerhalb des Containers gekapselt bleiben.
Skalierbarkeit
Container ermöglichen eine unkomplizierte Skalierung von Anwendungen. Geringe Image-Größen, schnelle Startzeiten und unveränderliche Images („Golden Images“) erleichtern den Aufbau hochskalierbarer Systeme. Microservices-Architekturen harmonieren ideal mit Containern, da die Zerlegung in fokussierte Komponenten die Entwicklung, Skalierung und Aktualisierung vereinfacht.
Container-Terminologie
- Container: Betriebssystem-Virtualisierung zur Paketierung und isolierten Ausführung von Anwendungen.
- Container Image: Statische Dateien, die das Dateisystem und Verhalten einer Konfiguration definieren und als Vorlage dienen.
- Container Orchestration: Werkzeuge und Prozesse zur Verwaltung ganzer Flotten von Containern über mehrere Hosts hinweg (z. B. Skalierung, Failover).
- Container Runtime: Die Komponente, die Container auf einem Host ausführt und verwaltet (z. B. containerd, CRI-O, Docker Engine).
- Docker: Die Technologie, die Linux-Container populär gemacht hat, inklusive Build-Tools, Runtime und Image-Registry.
- Dockerfile: Textdatei mit Anweisungen zur Erstellung eines Container-Images.
- Kata Containers: Leichtgewichtige virtuelle Maschinen, die sich wie Container anfühlen, aber zusätzliche Hardware-Isolierung bieten.
- Kubernetes: Führende Plattform zur Container-Orchestrierung für hochverfügbare Produktionsumgebungen.
- Linux cgroups: Kernel-Feature zur Gruppierung und Ressourcenbegrenzung von Prozessen.
- Linux Namespaces: Kernel-Feature zur Isolierung von Systemressourcen und Sichtbarkeiten.
- LXC: Frühe Linux-Container-Technologie zur Virtualisierung vollständiger Linux-Systemumgebungen.
- Virtuelle Maschinen (VMs): Vollständige Hardware-Emulation mit eigenem Gastbetriebssystem.
- Virtualisierung: Abstraktion physischer IT-Ressourcen in logische Einheiten.
Fazit
Container sind kein Allheilmittel, bieten aber enorme Vorteile gegenüber Bare-Metal-Installationen und klassischen VMs. Durch leichtgewichtige Isolierung und ein reiches Ökosystem bieten sie maximale Flexibilität über den gesamten Software-Lebenszyklus hinweg.