# Containervirtualisierung

Containervirtualisierung (oder Containering) ist eine Methode, um mehrere Instanzen eines Betriebssystems (als „Gäste“) isoliert voneinander den Kernel eines Hostsystems nutzen zu lassen. Im Gegensatz zur Virtualisierung mittels eines Hypervisors hat Containervirtualisierung zwar einige Einschränkungen in der Art ihrer Gäste, gilt aber als besonders ressourcenschonend.
Populär in der IT wurde die Software Docker im Jahr 2013, unter anderem durch eine intensive Zusammenarbeit mit Red Hat und die Integration in deren Produkt OpenShift. Es hatte allerdings auch davor schon vergleichbare Projekte gegeben.

## Prinzip

Auf einem gewöhnlichen Betriebssystem kann jedes Programm normalerweise alle Systemressourcen einsehen und verwenden. Unter anderem:
* Nutzbare Hardware(komponenten), wie CPU und Netzwerk
* Speicher (Lesen/Schreiben), Ordnerstrukturen und Netzwerkspeicher
* Peripheriegeräte wie Tastatur, Webcam, Scanner und Drucker.
Das Betriebssystem kann den Zugriff auf solche Ressourcen einschränken in Abhängigkeit davon, unter welchem Benutzer und Kontext der Prozess läuft.
Durch Containering lässt sich verwalten, welche Systemressourcen den Prozessen in dem Container zugewiesen werden.

## Geschichte

1979 führten die Entwickler von Unix den Systemaufruf chroot ein, mit dem sich ein Teilbereich des Dateisystems vom Rest isolieren ließ und damit einen ersten Schritt zur Virtualisierung des Betriebssystems ging. Viele Jahre wurde der Ansatz nur sporadisch zu Zwecken von Softwaretests und dem Schutz von Servern genutzt, besonders unter den Derivaten von BSD-Unix, die es unter dem Namen Jails weiterentwickelten. Auch wenn es in den späten 1990er-Jahren mit User Mode Linux Aktivitäten bei Linux-Entwicklern gab, um das Betriebssystem im Betriebssystem zu starten, fand dieser Ansatz nur in Fachkreisen höhere Beachtung. Verbreitet war mit dem Open-Source-Projekt OpenVZ und dem darauf basierenden Produkt Virtuozzo Mitte der 2000er Jahre Software, die es Webhostern gestattete, viele Linux-Websites auf einem einzigen Server zu betreiben. Die Betriebssysteme Solaris und BSD hatten jeweils eigene Realisierungen des Prinzips.
Die Entwickler des Linux-Kernels hatten unter dem Eindruck dieser Entwicklungen Vorsorge getroffen, ähnliche Funktionen in ihr Betriebssystem einzubauen. Dazu zählen unter anderem die Namespaces, Cgroups und Capabilities. Unter dem Begriff LXC kamen viele dieser Techniken zum Einsatz, bedurften aber noch viel Detailwissens im Aufbau von Betriebssystemen und Betriebssystemdistributionen. Das änderte sich, als 2013 das damals dotCloud genannte Unternehmen Docker vorstellte, das es Anwendungsentwicklern vereinfachte, ihre Software in Containern zu verpacken. In der Folge sind besonders für Linux eine Reihe von Alternativen zu Docker entstanden, darunter rkt (ausgesprochen Rocket) und das Teilprojekt Nspawn von systemd. Einige Projekte und Anbieter paketieren Containervirtualisierung auch in Produkten, die weitere Verwaltungssoftware enthält, etwa zur Orchestrierung oder um Platform as a Service anzubieten. Beispiele dafür sind die Projekte Kubernetes oder OpenShift.

## Realisierungen

Viele Projekte und Produkte implementieren das Prinzip der Containervirtualisierung, unterscheiden sich jedoch im Umfang, welche Systemressourcen (zum Beispiel Prozesse, Dateisystem, Netzwerkschnittstellen) sie virtualisieren und voneinander isolieren. Einige Realisierungen umfassen:
* chroot isoliert einen Teil des Dateisystems vom umliegenden Rest, sodass es für einen Prozess so aussieht, als ob der als Argument übergebene Pfad das Wurzelverzeichnis des Dateisystems wäre. Das Verfahren lässt sich jedoch leicht aushebeln, weshalb es nicht als echte Isolierung taugt.
* Drawbridge
* UML (User Mode Linux) lässt einen Linux-Kernel als Userland-Prozess ablaufen.
* BSD Jails entwickelt die Idee von Chroot für die BSD-Derivate von Unix weiter.
* Solaris Zones war die Weiterentwicklung von Sun Microsystems für sein Unix-Derivat Solaris.
* OpenVZ ist eine erhebliche Ergänzung des Linux-Kernels um Funktionen, die heutzutage in etwa dem Funktionsumfang von LXC entsprechen. Die Linux-Kernelentwickler haben jedoch einen Großteil der Funktionen neu geschrieben und verallgemeinert (Namespaces, Cgroups). Die proprietäre Variante von OpenVZ wird als Virtuozzo von Parallels, Inc. vertrieben.
* LXD ist ein Produkt von Canonical, das auf LXC aufsetzt, aber viele weitere Funktionen, die teilweise aus der Hypervisorvirtualisierung stammen, hinzufügt.
* Docker ist eine Containervirtualisierungsplattform, die viele der vorstehenden Techniken einsetzt und um benutzerfreundliche Werkzeuge und Dienste ergänzt. Dazu gehört beispielsweise eine Beschreibung von Images (Dockerfiles) oder ein Repository, das solche Images verwaltet. Der gleichnamige Hersteller bietet für die Plattform viele weitere Ergänzungen an, einige davon kostenlos, andere kostenpflichtig.
* systemd-nspawn ist ein Teilprojekt des systemd-Frameworks und war ursprünglich dazu gedacht, systemd selbst zu testen, ohne jedes Mal den Rechner neu zu starten. Es nutzt die Linux-spezifischen Namespaces und Cgroups.
* rkt ist eine alternative Implementierung des Docker-Ansatzes vom Wettbewerber CoreOS, der an einzelnen Designentscheidungen von Docker Kritik hervorgebracht hatte, die primär die Sicherheit betrifft.
* runC ist der Versuch, das drohende Schisma zwischen Docker und rkt zu schlichten. Dazu haben mehrere Hersteller unter dem Dach der Linux Foundation die Open Container Initiative gegründet. runC ist nur eine Runtime-Umgebung und enthält viele Funktionen anderer Containervirtualisierungsplattformen nicht.
* Podman ist ein Container-Manager, der ohne einen Daemon ausgeführt werden kann und auf dem Konzept von Kubernetes Pods aufbaut Podman ist eine Weiterentwicklung von Skopeo von Redhat

## Hostbetriebssysteme

Die meisten Realisierungen von Containervirtualisierungen stammen aus dem Umfeld der Betriebssystemfamilie Unix. Populär wurde sie besonders im Kontext von Linux ab 2013 durch Docker. Dafür gibt es auch Realisierungen für die Hostbetriebssysteme Windows und MacOS, die jedoch letztlich zusätzlich zur Containervirtualisierung einen leichtgewichtigen Hypervisor verwenden, um wieder einen Linux-Kernel zu starten und diesen dann mit Docker zu nutzen. Es gibt auch native Containervirtualisierung für andere Betriebssysteme als Linux, die jedoch noch keine große Verbreitung gefunden haben.

## Kritik

Da alle Gäste der Containervirtualisierung den gleichen Kernel nutzen, muss dieser starke Mechanismen mitbringen, um die Isolation der einzelnen Gäste zu realisieren. Das ist bei einer komplexen Software wie etwa einem Linux-Kernel mit mehreren hundert Systemaufrufen und diversen anderen Wegen der Kommunikation mit dem Kernel nicht ganz einfach.
Durch die Isolation der Dateisysteme nutzt jeder Container seine eigene Fassung von Systembibliotheken. Werden in ihnen Schwachstellen bekannt, wie beispielsweise die als Heartbleed bezeichnete Schwachstelle der SSL/TLS-Bibliotheken OpenSSL, so muss ein Systemverwalter alle ihre Instanzen auf einem Computer aktualisieren, anstatt nur einmal pro Server.
Durch die Vielfalt an Einstellungs- und Konfigurationsmöglichkeiten lassen sich Container leicht so einstellen, dass sie ungewollte Zugriffsmöglichkeiten eröffnen. So erlauben privilegierte Container zwar mehr Funktionen innerhalb des Containers auszuführen, aber schwächen die Isolation der Container vom Host.
Als Dienstleistung für Container sind Repositories entstanden, die bereits fertig zusammengestellte Images anbieten, die direkt auf der Containerplattform lauffähig sind. Einige dieser Artefakte sind von zweifelhafter Qualität und können durch Unwissenheit oder bösen Willen der Anbieter Schwachstellen enthalten, wenn sie nicht vor dem Download und Betrieb geprüft wurden.