Theoretische Grundlagen
Was ist Containerisierung?
Containerisierung bezeichnet einen Ansatz, bei dem Softwareanwendungen zusammen mit ihren Abhängigkeiten und der benötigten Laufzeitumgebung in isolierte, standardisierte Einheiten (Container) verpackt werden. Diese Container laufen unabhängig vom zugrunde liegenden Betriebssystem und ermöglichen es, Software konsistent über verschiedene Umgebungen hinweg zu entwickeln, zu testen und bereitzustellen.
Zu den bekanntesten Tools zur Containerisierung zählen:
- Docker
- Podman
- LXC/LXD
- Kubernetes
Technisch basiert die Containerisierung auf Funktionen des Linux-Kernels wie Namespaces und Control Groups (cgroups), die eine isolierte Ausführung einzelner Prozesse innerhalb eines gemeinsamen Systems ermöglichen. Namespaces schirmen bestimmte Ressourcenbereiche eines Prozesses – etwa Prozess-IDs, Netzwerkinterfaces, Dateisysteme oder Benutzer – voneinander ab, sodass Container nur ihre eigene Umgebung „sehen“. Control Groups dienen der Zuweisung und Begrenzung von Ressourcen wie CPU-Zeit, Arbeitsspeicher und I/O. Da Windows und macOS diese Funktionen nicht nativ unterstützen, wird beim Einsatz von u.a. Docker auf diesen Systemen im Hintergrund eine schlanke Linux-Umgebung gestartet, meist auf Basis einer minimalen Virtualisierung. Dabei handelt es sich jedoch nicht um eine klassische virtuelle Maschine, sondern um eine speziell optimierte, ressourcenschonende Umgebung zur Ausführung der Container.
Docker
Docker ist eine Open-Source-Software der Firma Docker Inc., die eine Plattform zur Containerisierung von Anwendungen bereitstellt. Die Plattform umfasst verschiedene Werkzeuge wie die Docker Engine zum Ausführen von Containern, Docker CLI für die Kommandozeilensteuerung, Docker Compose zur Verwaltung mehrerer Container und Docker Hub als zentrales Repository für Container-Images. Docker hat sich als zentrales Werkzeug in der Containerisierung und im modernen DevOps-Prozess etabliert.
Docker.com - Use containers to Build, Share and Run your applications
Das Diagramm veranschaulicht die Architektur einer containerisierten Umgebung mit Docker. Am unteren Ende befindet sich die physische oder virtuelle Infrastruktur (z.B. Rechenzentrumsserver, Virtual Machine, EC2-Instanz in AWS), auf der das Host-Betriebssystem läuft. Darüber liegt die Docker-Engine, welche als Abstraktions- und Ausführungsschicht für Container dient bzw. die Container unabhängig von der zugrunde liegenden Infrastruktur ausführbar macht und ihre Ausführung vom Host-System technisch realisiert. Auf dieser Grundlage werden mehrere Container betrieben, die jeweils isolierte Instanzen einzelner Anwendungen (App A bis App F) enthalten. Diese Architektur ermöglicht die parallele Ausführung mehrerer Anwendungen auf einem gemeinsamen System, wobei jeder Container in einer eigenen isolierten Laufzeitumgebung läuft und über separate Ressourcenbereiche (z. B. Netzwerk, Prozesse, Dateisystem) verfügt. Dadurch wird verhindert, dass sich Anwendungen gegenseitig stören oder unbeabsichtigt beeinflussen.
Virtual Machines (VMs)
Virtualisierung bezeichnet das Konzept, physische IT-Ressourcen – wie Server, Speicher oder Netzwerke – durch eine Abstraktionsschicht in virtuelle Instanzen zu überführen. Dabei wird Hardware mithilfe spezieller Software (sogenannter Hypervisoren) so emuliert, dass mehrere voneinander isolierte virtuelle Maschinen (VMs) auf einem einzigen physischen System parallel betrieben werden können.
Virtuelle Maschinen sind vollständig isolierte Software-Instanzen, die auf einem Hypervisor basieren und wie eigenständige physische Rechner agieren. Als Hypervisor wird hierbei die Software bezeichnet, die virtuelle Maschinen verwaltet, indem sie den Zugriff auf die physische Hardware koordiniert und eine Trennung zwischen den VMs und dem Host-System herstellt. Jede VM besitzt ein eigenes Betriebssystem sowie eigene Anwendungen, wodurch eine starke Trennung zwischen verschiedenen virtuellen Systemen gewährleistet wird.
Bekannte Virtualisierungsplattformen sind:
- VirtualBox
- VMware
- Microsoft Hyper-V
- KVM/QEMU (unter Linux)
Wie auf dem Veranschaulichungsmaterial erkennbar, besteht die Architektur eines virtualisierten Systems typischerweise aus der physischen Hardware (Infrastructure), einem Hypervisor als Abstraktionsschicht und mehreren darauf betriebenen virtuellen Maschinen, die jeweils ein vollständiges Gastsystem mit eigenem Betriebssystem und Anwendungen enthalten.
Docker.com - Use containers to Build, Share and Run your applications
Container vs. VMs vs. Virtuelle Umgebungen
Während Container nur Anwendung und Abhängigkeiten virtualisieren und sich dabei den Kernel des Host-Systems teilen, emulieren Virtuelle Maschinen komplette Systeme mit eigenem Betriebssystem. Container bleiben dadurch leichtgewichtig und schnell startbar, ohne ein vollständiges Betriebssystem zu emulieren.
Virtuelle Umgebungen hingegen isolieren ausschließlich die Abhängigkeiten innerhalb einer bestimmten Programmiersprache.
Kategorie | Virtuelle Maschinen (VMs) | Container (z. B. Docker) | Virtuelle Umgebungen (z. B. Conda) |
---|---|---|---|
🤖 Was wird virtualisiert? | Komplettes Betriebssystem (inkl. Kernel) | Anwendung + Abhängigkeiten (teilen sich den Host-Kernel) | Pakete und Abhängigkeiten innerhalb einer Programmiersprache |
🔋 Ressourcenverbrauch | Hoch – vollständiges OS pro VM | Gering – gemeinsame Nutzung von Kernel und Ressourcen | Sehr gering – läuft im Userspace |
📦 Isolation | Sehr stark – Hardware-nahe Virtualisierung | Mittel bis hoch – Prozess- und Namespace-Isolation | Gering – keine echte Systemisolation |
⏱ Startzeit | Relativ langsam – oft mehrere Sekunden bis Minuten | Schnell – wenige Sekunden | Sofort verfügbar (nur Pfadwechsel) |
🛠 Beispiel-Tools | VirtualBox, VMware, Hyper-V | Docker, Podman, LXC, Kubernetes (Orchestrierung) | Conda, venv, pipenv, poetry |
Unterschiede: klassisches vs. containerisiertes Deployment
Deployment bezeichnet den Prozess, bei dem Software von der Entwicklungsumgebung in eine produktive Umgebung überführt wird, in der sie von Endnutzern verwendet werden kann. Dabei werden Anwendungen auf Servern installiert, konfiguriert und gestartet. Der Ablauf umfasst in der Regel das Bauen der Software, das Übertragen auf das Zielsystem sowie das Starten und Testen der Anwendung. Ziel ist es, die Software stabil, funktionsfähig und zugänglich bereitzustellen.
Beim klassischen Deployment wird Software direkt auf dem Zielsystem installiert, was häufig zu Problemen durch unterschiedliche Umgebungen führt. Abhängigkeiten, Bibliotheken und Konfigurationen müssen manuell eingerichtet werden, was zeitaufwendig und fehleranfällig ist. Zudem ist die Skalierung klassischer Anwendungen oft komplex und ressourcenintensiv.
Beim containerisierten Deployment wird die gesamte Anwendung inklusive aller Abhängigkeiten in einem Container gebündelt. Dadurch lässt sich die Software unabhängig vom Zielsystem konsistent und reproduzierbar bereitstellen. Container ermöglichen eine schnelle, automatisierte Skalierung und sind besonders für moderne Cloud- und Microservices-Architekturen geeignet.
Aspekt | Klassisches Deployment | Containerisiertes Deployment |
---|---|---|
Umgebung | Abhängig von Host-System | Unabhängig, durch Container isoliert |
Installation | Manuell auf Zielsystem | Automatisiert via Container-Image |
Konsistenz | Fehleranfällig durch Umgebungsunterschiede | Einheitlich auf allen Systemen |
Skalierung | Aufwendig | Leicht automatisierbar (z. B. mit Kubernetes) |
Ressourcenverbrauch | Höher | Geringer durch gemeinsame Kernelnutzung |
Grundbegriffe
- Containerisierung: Ansatz, bei dem Anwendungen samt Abhängigkeiten in standardisierte, isolierte Container verpackt werden.
- Container: Laufzeitinstanz eines Docker-Images, die in einer isolierten Umgebung ausgeführt wird.
- Namespaces: Mechanismus zur Isolation von Prozessen und Ressourcen innerhalb eines Containers.
- cgroups: Funktion des Linux-Kernels, mit der sich die Nutzung von Ressourcen wie CPU, Arbeitsspeicher oder I/O gezielt für Gruppen von Prozessen begrenzen und überwachen lässt.
- Virtualisierung: Technologie zur Abstraktion physischer IT-Ressourcen z.B. durch Hypervisor. Mehrere virtuelle Maschinen laufen parallel auf gemeinsamer Hardware.
- Virtuelle Maschinen (VMs): Vollständig isolierte Software-Instanzen mit eigenem Betriebssystem, die auf einem Hypervisor ausgeführt werden. Hoher Ressourcenverbrauch, starke Isolation.
- Virtuelle Umgebungen: Abgeschottete Softwarebereiche innerhalb einer Programmiersprache (z. B. Python), in denen Abhängigkeiten unabhängig vom System installiert werden.
- Deployment: Prozess zur Überführung von Software aus der Entwicklung in die Produktivumgebung. Umfasst Installation, Konfiguration und Start der Anwendung.
- containerisiertes Deployment: Bereitstellung von Software in Containern. Unabhängig vom Zielsystem, reproduzierbar, leicht skalierbar und automatisierbar.
- Docker: Open-Source-Software von Docker Inc. zur Erstellung, Verwaltung und Ausführung von Containern. Weit verbreitet in DevOps- und Cloud-Umgebungen.
- Docker Engine: Zentrale Komponente von Docker, die für das Starten und Ausführen von Containern verantwortlich ist.
- Docker CLI: Kommandozeilenwerkzeug zur Steuerung von Docker. Wird z. B. zum Erstellen, Starten und Stoppen von Containern verwendet.
- Docker Compose: Tool zur Definition und Orchestrierung mehrerer Container über eine YAML-Datei. Ermöglicht das Starten komplexer Multi-Container-Anwendungen.
- Docker Hub: Öffentliche Registry zum Speichern, Verwalten und Teilen von Docker-Images. Ermöglicht einfachen Zugriff auf vorgefertigte Images.
- Dockerfile: Textdatei mit Anweisungen zur Erstellung eines Docker-Images. Definiert z. B. Basis-Image, Kopiervorgänge, Installationen und Startbefehle.
- Image: Unveränderliche Vorlage mit Anwendungscode, Bibliotheken und Abhängigkeiten. Grundlage für Container.
- Registry: Zentrale Plattform zur Speicherung und Verteilung von Images (z. B. Docker Hub).
- Container-Image Layer: Images bestehen aus Schichten (Layers), die einzeln gespeichert und wiederverwendet werden, was Speicher spart und Builds beschleunigt.
- Volume: Persistenter Speicher zur dauerhaften Datenspeicherung oder zum Datenaustausch zwischen Containern.
- Runtime Engine: Software zur Ausführung und Verwaltung von Containern (z. B. Docker Engine, containerd).
- Tag: Bezeichner zur Versionierung und Identifikation eines Docker-Images, meist im Format
name:version
. - Port Mapping: Verfahren, mit dem Ports eines Containers auf den Host weitergeleitet werden, um externen Zugriff zu ermöglichen.
- Environment Variables: Konfigurationswerte, die beim Start eines Containers übergeben werden, ohne den Image-Inhalt zu verändern.
Autor: SH