Virtuelle Maschinen, Container, Unikernel
Virtualisierung
Die Technik der Virtualisierung, bei der mehrere Betriebssysteme auf gemeinsam genutzter Hardware ausgeführt werden können, wird äußerst gut verstanden, wenngleich sie etwas ineffizient in der Nutzung der Ressourcen ist.
Ursprünglich basierte das System der Virtualisierung auf der Implementierung einer Reihe von virtuellen Maschinen (VM). Jede VM muss ihre eigene Instanz eines Betriebssystems ausführen, was die Verantwortung verdoppelt. Die Verwaltung einer solchen Infrastruktur ist schwierig, da es mehrere Server gibt, die alle unabhängige virtuelle Maschinen sind.
Die Bereitstellung von Software in einem System mit virtuellen Maschinen kann auf zwei Arten erfolgen:
- Das Build-System kann ein komplettes Image einer VM mit integrierter Software erstellen, und die VM wird neu gestartet, sobald das Update eintrifft.
- Das Build-System erzeugt nur das Softwarebündel, das mithilfe einer Sammlung von Skripten auf die Server hochgeladen wird.
Beide Ansätze erfordern eine komplexe Einrichtung und führen letztendlich zu Inkonsistenzen zwischen VM. Der Administrator hat jedoch für jeden Aspekt des Systems die vollständige Kontrolle über die Umgebung und kann sie entsprechend den spezifischen Anforderungen konfigurieren. Das Debugging ist relativ einfach, da man sich direkt mit einer VM verbinden kann.
Noch vor wenigen Jahrzehnten verwendete jeder VM, um Infrastruktur zu betreiben und zu verwalten. In jüngster Zeit werden dafür Container mit Systemen wie Docker und Kubernetes eingesetzt.
Containerisierung
Container versuchen, das gleiche Konzept wie virtuelle Maschinen zu erreichen, vermeiden aber den doppelten Aufwand zwischen Maschinen. Anstatt ein komplettes Betriebssystem für eine Anwendung zu laden, können Docker-Container den Kernel des Host-Betriebssystems verwenden und gleichzeitig anwendungsspezifische Bibliotheken und Programme nachladen. Durch die Anpassung des Containers und seines Images ist es möglich, die spezifischen Bibliotheken und die Konfiguration, die ihre Anwendung verwenden wird, fein abzustimmen. Dies führt zu Leistungssteigerungen, ohne dass der Overhead eines kompletten Betriebssystems anfällt.
Container lassen sich leicht auf Entwicklungsmaschinen ausführen. Auch der Bereitstellungsprozess selbst ist viel einfacher, da nur vorgefertigte Container in ein Container-Repository hochgeladen werden und die Produktionssysteme die aktualisierte Version abrufen können.
Der containerbasierte Ansatz hat aber auch Nachteile. Die Software muss für die Verwendung in Containern angepasst (containerisiert) werden, und das kann schwierig werden, insbesondere bei älteren Codebasen. Bei Containern gibt es viel mehr Konfigurationen für die Ressourcenzuweisung und Interop-Fähigkeiten, sodass sie leicht falsch konfiguriert werden können.