Denkt man heute an den internationalen Handel, taucht vor dem inneren Auge schnell das Bild eines Containerschiffs auf. Der 20-Fuß-Container hat seit den 1960er Jahren den globalen Warentransport revolutioniert. Als standardisierte Transporteinheit ermöglicht er einen effizienten und reibungslosen Umschlag von Waren über verschiedene Verkehrsträger hinweg – ob auf der Schiene, der Straße oder auf dem Wasser.
Die gesamte Logistikinfrastruktur ist weltweit auf dieses Format ausgerichtet. Dadurch lassen sich Güter in großen Mengen bewegen, ohne dass beim Umladen zwischen Transportmitteln auf individuelle Verpackungseinheiten geachtet werden muss. Das spart Zeit, reduziert Kosten und vereinfacht den gesamten Prozess erheblich.
Software in Containern aka Containervirtualisierung
Einen ähnlichen Ansatz verfolgt man in der IT mit der Containervirtualisierung. Das Konzept existiert bereits seit Längerem, hat aber spätestens mit der Veröffentlichung von Docker im Jahr 2013 und dessen rasanter Verbreitung eine neue Relevanz gewonnen. Besonders im Zusammenspiel mit Microservice-Architekturen und der Verlagerung von Workloads in die Cloud erweist sich Containervirtualisierung als die relevante Technik.
Die Grundidee ist, dass eine Anwendung zusammen mit allen benötigten Bibliotheken und Abhängigkeiten in einem Container gebündelt wird. Anstatt Software direkt auf einem Rechner zu installieren, wird nur der Container gestartet – das eigentliche System bleibt unverändert.
Bleiben wir bei der Analogie des Seecontainers, um den Unterschied zu verdeutlichen:
Wird eine Software herkömmlich installiert, werden ihre einzelnen Bestandteile ins Betriebssystem integriert – vergleichbar mit dem manuellen Umladen einzelner Pakete an jedem Umschlagpunkt. Ein Softwarecontainer hingegen bleibt eine geschlossene Einheit, die weitgehend unabhängig vom zugrundeliegenden System läuft. Er wird nicht entpackt, sondern als Ganzes ausgeführt. Der Datenaustausch erfolgt ausschließlich über definierte Schnittstellen, ähnlich wie Waren in einem Container sicher verpackt bleiben, bis sie ihr Ziel erreichen.
Die Abhängigkeits-Hölle
Auf den ersten Blick ist der Vorteil der Containervirtualisierung vielleicht nicht sofort ersichtlich. Doch vermutlich hat jeder schon einmal erlebt, dass sich eine Software einfach nicht installieren ließ oder das System mit jeder neuen Anwendung instabiler wurde. Oder das berüchtigte Update, das plötzlich alles lahmlegte.
Die Ursache liegt meist in den unterschiedlichen Abhängigkeiten, die jede Software mitbringt. Programme benötigen externe Module und Bibliotheken – oft in verschiedenen, teils inkompatiblen Versionen. Dadurch können Anwendungen sich gegenseitig beeinflussen oder lassen sich gar nicht erst parallel auf demselben System betreiben. Dieses Problem ist als „Abhängigkeits-Hölle“ oder „Dependency Hell“ bekannt.
Auflösung durch Isolation
Containervirtualisierung löst dieses Problem durch Isolation. Jeder Container bringt alle benötigten Abhängigkeiten mit und ist nicht auf Bibliotheken des Host-Systems angewiesen. Zudem laufen Container voneinander getrennt, sodass keine unerwarteten Wechselwirkungen zwischen Anwendungen in den Containern oder mit dem Betriebssystem auftreten. Dadurch ist es sogar möglich, zwei Dienste mit eigentlich unvereinbaren Abhängigkeiten auf demselben Rechner auszuführen – in separaten Containern.
Weitere entscheidende Vorteile der Containervirtualisierung
Da Software in Form fertiger, lauffähiger Container bereitgestellt wird, können – ähnlich wie in einem Containerhafen – verschiedene Versionen schnell geladen und ausgetauscht werden. Jeder Container enthält eine vollständige, konsistente Version der Software inklusive aller Abhängigkeiten. Dadurch lassen sich unterschiedliche Versionen einer Anwendung problemlos wechseln oder sogar parallel betreiben.
Ein weiterer Vorteil ist die Reproduzierbarkeit: Der Entwickler kann sicherstellen, dass exakt die getestete und freigegebene Version der Software auf dem Zielsystem ausgeführt wird. Lediglich Konfigurationsparameter und Bestandsdaten variieren je nach System. So entsteht eine standardisierte Bereitstellung, bei der selbst kleinste Softwareänderungen in identischen Containern resultieren.
Zusätzlich ermöglicht Containervirtualisierung eine hohe Flexibilität. Ein Container kann samt seiner Nutzdaten einfach von einem System auf ein anderes verschoben werden. Richtig eingesetzt, reduziert dies den Wartungsaufwand erheblich.
Docker-Umgebungen sind heute auf verschiedenen Plattformen produktiv einsetzbar, darunter Windows und macOS. Aufgrund der engen Verzahnung mit Linux empfehlen wir jedoch, produktive Docker-Deployments stets auf einem Linux-Server zu betreiben.
Unterschiede Containervirtualisierung vs. Hypervisor Virtualisierung
Der wesentliche Unterschied zwischen Containervirtualisierung und Hypervisor-Virtualisierung liegt im Umfang der Virtualisierung.
Klassische virtuelle Maschinen (VMs) laufen auf einem Hypervisor und benötigen jeweils ein vollständig installiertes Betriebssystem. Jede VM bringt also ihr eigenes OS mit, was ressourcenintensiv ist und zu einem höheren Overhead führt.
Bei der Containervirtualisierung hingegen teilen sich alle Container den Betriebssystem-Kern des Host-Systems. Jeder Container enthält nur die minimal erforderlichen Komponenten, wodurch der Ressourcenverbrauch deutlich geringer ausfällt. Dies führt nicht nur zu einem kleineren Overhead, sondern auch zu erheblich kürzeren Startzeiten – ein Container kann in Sekunden hochfahren, da kein komplettes Betriebssystem gebootet werden muss.
Ein Nachteil der Containervirtualisierung ist jedoch, dass die Isolation nicht so strikt ist wie bei einer vollständigen VM. Während Hypervisor-Virtualisierung eine klare Trennung zwischen den Systemen gewährleistet, laufen Container näher am Host-System und teilen sich dessen Kernel, was Auswirkungen auf Sicherheit und Stabilität haben kann.
Die besondere Stärke der Containervirtualisierung
Aus unserer Sicht liegt die größte Stärke der Containervirtualisierung – und insbesondere von Docker – in der Möglichkeit, kontrolliert und gezielt konsistente Softwareversionen bereitzustellen. Einzelne Versionen lassen sich schnell austauschen, regelmäßige Updates unkompliziert durchführen und Installationen problemlos skalieren, indem mehrere Instanzen der gleichen Software parallel betrieben werden. Zudem ermöglicht Docker einen einfachen Umzug auf andere Systeme.