
Sami - stock.adobe.com
Von VMs zu Containern: Ressourcen sparen und schnell deployen
Container sind leichtgewichtige Alternativen zu VMs. Sie starten schneller, benötigen weniger Ressourcen und lassen sich mit Kubernetes und Docker flexibel verwalten.
Container sind für VMs das, was VMs für physische Server waren – eine Neuerung in Bezug auf Größe, Geschwindigkeit und Flexibilität. Sich auf konzeptioneller Ebene mit Containern vertraut zu machen, zahlt sich in vielerlei Hinsicht aus.
Zwar gibt es nach wie vor Anwendungsfälle für VMs, doch Container und Containerplattformen wie Docker setzen sich verstärkt als Standard für die Erstellung und Bereitstellung von Anwendungen durch. Dies liegt an ihrer Skalierbarkeit, Benutzerfreundlichkeit und Portabilität.
Vorteile von Containern gegenüber VMs
Zu den Vorteilen von Containern gegenüber VMs gehören die folgenden:
- Geschwindigkeit: Die Bereitstellung eines Containers aus einem Container-Image dauert nur wenige Sekunden. Container werden auf dem Host als Prozess ausgeführt, und auf einem einzigen Host können viele Container laufen. Dieser Prozess enthält alles, was der Container zum Funktionieren benötigt. Die Bereitstellung einer Nginx-Instanz benötigt beispielsweise weniger als 200 Megabyte für das Image und der Speicherverbrauch wird in Megabyte statt in Gigabyte gemessen.
- Skalierbarkeit: Container können die Bausteine für eine dynamische Skalierung liefern und gleichzeitig für mehr Flexibilität sorgen. Wenn sie hinter einem Load Balancer eingerichtet sind, ist es leicht, Container hinzuzufügen, um einen Anstieg der Anfragen zu bewältigen. Die Bereitstellung kann automatisiert werden und sich schnell skalieren lassen. Das ist es, was Kubernetes als Steuerungsebene bietet: Container-Automatisierung, Verfügbarkeit und Orchestrierung. Mit Kubernetes und Zusatzprojekten wie KubeVirt können auch VMs orchestriert werden.
- geringere Kosten: Die Skalierung hilft, die Kosten niedrig zu halten, da ein Container möglicherweise nur vorübergehend existiert, bevor er heruntergefahren und automatisiert wird. Gleichzeitig kann eine Gruppe von Hosts mehrere containerbasierte Anwendungs-Stacks verwalten – es gibt keine 1:1-Verhältnisse mehr zwischen Anwendungen und VMs, die alle gepatcht werden müssen, auch wenn sie nicht verwendet werden.
- Portabilität: Entwickler können ein Image nach den erforderlichen Spezifikationen erstellen und dieses Container-Image als produktionsreif ausliefern. Es funktioniert identisch auf einer anderen Workstation oder einem anderen Server, wenn Sie sicherstellen, dass das Container-Image alles enthält, was zum Ausführen erforderlich ist. Docker ist nicht mehr zwingend die Runtime in Kubernetes (seit 2020 wurde Docker als Runtime abgelöst, CRI-kompatible Runtimes wie containerd und CRI-O sind Standard). Docker wird aber weiterhin für Entwicklung und Compose-Szenarien stark genutzt. Container sind Cloud-übergreifend standardisiert und werden verstärkt in Remote-Dev-Umgebungen eingesetzt. Unterschiede zwischen Clouds (Netzwerke, Storage, IAM, Security Policies) können die Portabilität einschränken.
- wenig Speicherplatz: Container-Images sind kleiner als VMs, da sie nicht alle OS-bezogenen Dateien enthalten müssen, die viele Gigabyte Speicherplatz beanspruchen. Es ist ein Leichtes, ein Image herunterzuladen und es auf einem Docker-fähigen Host auszuführen. Minimal-Images wie Alpine liegen bei wenigen Megabyte, aber viele produktive Images (beispielsweise mit Python, Java, TensorFlow) können mehrere hundert Megabyte oder sogar über ein Gigabyte groß sein., VMs jedoch oft zehn bis 20 Gigabyte.

Steigern Sie die Effizienz von Cloud-Anwendungen mit Docker
Der Übergang zu Docker ist ein Schritt hin zu einer dynamischen Bereitstellung von Applikationen, die stärker anwendungsorientiert ist als der schwerfällige Ansatz von VMs. Dabei wird die Anwendung von der Hardware entkoppelt.
Die Docker-Containerplattform nutzt die Vorteile von Containern und verbessert gleichzeitig deren Effizienz. So erfordert die Bereitstellung einer neuen Version einer Docker-Anwendung beispielsweise nur einen einzigen Befehl. Es ist nicht erforderlich, die Umgebung über Skripte, Bereitstellungs-Tools oder manuell zu aktualisieren.
Bereitstellung und Upgrades beschleunigen
Bei einer VM müssen Sie diese manuell aktualisieren oder neu bereitstellen. Upgrades können fehlschlagen und VMs müssen neu erstellt oder aus einem Backup wiederhergestellt werden, was Zeit und Ressourcen kostet. Wenn ein Container nicht korrekt bereitgestellt werden kann, löschen Sie ihn und laden Sie einfach ein neues Container-Image herunter. In diesem Fall dauert der Austausch nur Sekunden, im Gegensatz zu Stunden für das Troubleshooting oder Wiederherstellung. Es ergibt keinen Sinn, zu versuchen, den Container zu reparieren; starten Sie einfach innerhalb von Sekunden einen neuen, wenn es sich um stateless Services handelt. Bei stateful Containern wie etwa Datenbanken müssen Sie Backups, Persistenz und Wiederherstellungsstrategien berücksichtigen.
Steuerung vereinfachen
Eine in eigenständigen Host-Umgebungen wenig genutzte Funktion ist der Docker-Compose-Parameter. Damit kann ein gesamter Anwendungs-Stack, zum Beispiel Datenbank- und Anwendungsserver, alle Informationen für die Anwendung in einer YAML-Datei speichern und verwalten. Mit Docker Compose können Benutzer außerdem einen gesamten Stack mit einem einzigen Befehl stoppen und starten oder Optionen für den Autostart der Container festlegen. Um einen Stack zu starten, verwenden Sie docker compose up. Um einen Stack zu stoppen, verwenden Sie docker compose down.
Mit docker compose pull wird die YAML-Konfigurationsdatei gelesen, um sicherzustellen, dass der Stack die neuesten verfügbaren Images verwendet. Im Gegensatz dazu ist die Bereitstellung neuer VMs oder die Aktualisierung von Images eine langwierige Angelegenheit. Docker beseitigt diese Infrastrukturanforderungen und senkt so die Betriebskosten.
Docker Compose hat sich nicht nur für lokale Tests bewährt, sondern wird zunehmend genutzt, um komplette Entwicklungsumgebungen remote bereitzustellen. Entwickler können damit mit einem einzigen Befehl Datenbanken, Services und Anwendungen konsistent starten: unabhängig davon, wo sie arbeiten. Das erleichtert verteilte Teams die Zusammenarbeit und reduziert Setup-Aufwand erheblich. Zudem lassen sich mit Compose auch Staging-Umgebungen schnell replizieren.
Speicherplatz reduzieren
Was passiert, wenn ein neu bereitgestelltes Image ein Problem enthält? Das Herunterladen der vorherigen Version des Containers ist so einfach wie das Anhalten des fehlerhaften Containers und das Neustarten mit der vorherigen Containerinstanz. Diese Images sind so leichtgewichtig, dass Administratoren mehrere Kopien speichern können, ohne viel Speicherplatz zu beanspruchen.
Entwicklung von Containern und VMs?
Neben den etablierten Vorteilen von Containern zeichnen sich neue Entwicklungen ab, die den Einsatzbereich erweitern und die Rolle von Kubernetes, MicroVMs und Technologien wie WebAssembly oder Serverless noch stärker in den Vordergrund rücken.
Serverless und Knative
Die Relevanz von Serverless-Architekturen nimmt kontinuierlich zu, da diese Anwendungen nur dann Ressourcen verbrauchen, wenn sie tatsächlich ausgeführt werden. Die Nutzung von Knative auf Kubernetes eröglicht die automatisierte Skalierung von Container-Workloads, selbst auf den Zustand Zero, bei dem keine Anfragen vorliegen. Das resultiert in einer effizienten Ressourcennutzung und einer signifikanten Senkung der Betriebskosten. Unternehmen kombinieren die Flexibilität von Containern mit der Einfachheit serverloser Workloads.
WebAssembly (Wasm)
WebAssembly wird zunehmend als Laufzeitumgebung für Microservices eingesetzt. Wasm-Module starten noch schneller als Container und benötigen nur minimale Ressourcen. Das macht sie besonders interessant für Edge Computing, wo Rechenleistung knapp ist und Anwendungen möglichst nahe am Endnutzer ausgeführt werden sollen. Kubernetes unterstützt bereits erste Ansätze, Container und Wasm-Workloads in einem Cluster gemeinsam zu betreiben.
KI/ML-Workloads in Containern
Auch im Bereich künstliche Intelligenz (KI) und Machine Learning sind Container zwischen Standard. Sie ermöglichen reproduzierbare Umgebungen für Training, Test und Inferenz und vereinfachen den Umgang mit GPU-basierten Workloads. Kubernetes übernimmt dabei das Ressourcen-Management und sorgt dafür, dass aufwendige Trainingsprozesse über mehrere Nodes verteilt werden können. So lassen sich auch große KI-Modelle effizient und skalierbar betreiben.
MicroVMs und hybride Architekturen
Neben klassischen Containern und VMs setzen sich MicroVMs wie Firecracker oder Kata Containers durch. Sie verbinden die Geschwindigkeit und Ressourcenschonung von Containern mit der Isolation von VMs, was ein Vorteil vor allem in Multi-Tenant-Umgebungen oder für sicherheitskritische Anwendungen ist. Viele Unternehmen fahren heute hybride Strategien, bei denen Container, MicroVMs und klassische VMs je nach Anforderung parallel eingesetzt werden. Kubernetes entwickelt sich dabei zunehmend zur gemeinsamen Steuerungsebene für alle drei Technologien.
Sicherheit und Supply Chain Practices
Container-Images werden standardmäßig mit SBOMs (Software Bill of Materials) ausgeliefert, die genau auflisten, welche Abhängigkeiten enthalten sind. Zudem setzen Unternehmen auf signierte Images und Tools wie Trivy oder Sigstore, um Schwachstellen frühzeitig zu erkennen. Sicherheit wird dadurch stärker in den Entwicklungsprozess integriert (Shift Left Security). So entsteht eine zuverlässige Lieferkette für Software, die von der Entwicklung bis zur Produktion nachvollziehbar bleibt.
Container im Vergleich zu VMs
Container bieten gegenüber virtuellen Maschinen deutliche Vorteile in Effizienz und Flexibilität. Sie starten innerhalb von Sekunden, benötigen nur wenig Speicherplatz und ermöglichen eine hohe Dichte pro Host. Durch ihre Portabilität lassen sich Anwendungen konsistent in unterschiedlichen Umgebungen ausführen. Mit Kubernetes wird die Skalierung und Orchestrierung automatisiert, während Docker und Docker Compose die Bereitstellung, Updates und Verwaltung kompletter Anwendungsstacks vereinfachen.