LXC als Docker-Wegbereiter
In Verlauf der vergangenen zwei Jahre hat insbesondere LXC (Linux Containers) enorm an Popularität gewonnen, dessen Code abgesehen von entsprechenden User-Space-Tools im Gegensatz zu OpenVZ seit einiger Zeit offizielle Bestandteil des Vanilla-Kernels ist. Technisch betrachtet ist LXC eine Technologie, die einen Prozess unter Zuhilfenahme von chroot/pivot_root in einen mit Namespaces, Capabilities und Cgroups ausgestatteten Container packt.
Aus Sicht des Host-System ist jeder Container ein gewöhnlicher Prozess mit einer PID. Architektonisch besteht LXC aus dem im Vanilla-Kernel enthaltenen Code, einer Programmbibliothek, verschiedenen APIs, einer Reihe von Tools zum Verwalten und Steuern der Container, sowie den Container-Vorlagen. Die LXC-Management-Werkzeuge verwenden neben Namespaces und Cgroups noch eine Reihe weiterer Kernel-Funktionen, wie SELinux oder AppArmor, weshalb man sich den LXC-Kernelcode besser als einer Art Wrapper vorstellt, den auch anderen Anwendungen nutzen können, etwa der LXC-Treiber des libvirt-Projektes.
Ein Meilenstein in der Entwicklung von LXC ist die Version 1.0 vom Februar 2014, die unter anderem erstmals unpriviligierte Container unterstützt und damit auch in der Container- und Anwendungsvirtualisierung ein hohes Sicherheit-Niveau ermöglicht. Im Gegensatz zu voneinander völlig unabhängigen virtuellen Maschinen besteht bei Containern zumindest theoretisch immer die Gefahr einer gegenseitigen Beeinflussung, weil sich sämtliche Container und das Host-System die gleiche Hardware teilen. Somit ist beispielsweise bei LXC < 1.0 der root-Nutzer eines Containers mit dem root auf dem Host-System identisch, was theoretisch ein hohes Sicherheitsrisiko darstellt.
Und Docker?
Docker ist eine ursprünglich vom Unternehmen DotCloud Inc. entwickelte Software zur Anwendungs-Virtualisierung, die bis einschließlich der Version 0.8 unter anderem auf LXC basierte. LXC kann gleichermaßen System-Container, also komplette virtualisierte Betriebssysteme, als auch spezielle Anwendungs-Container, die ausschließlich zum Virtualisieren einer einzigen Anwendung dienen, zur Verfügung stellen.
Dabei ist das Bereitstellen von System-Containern (Betriebssystem-Virtualisierung) der eigentlich einfachere Part, weil sich der System-Architekt hierbei nicht mit dem gezielten Isolieren von einzelnen Ressourcen auseinander setzen muss. Dass dies bei LXC kein Pappenstil ist, zeigt ein Blick in die "man lxc.conf". Docker dagegen konzentriert sich ausschließlich auf das Verpacken, Ausliefern und Ausführen von beliebigen Applikationen. Docker verfrachtet Anwendungen samt der jeweils benötigten Laufzeit-Umgebung transparent in (virtuelle) Container, die sich dann nahezu überall ausführen lassen. Docker´s Ansatz zur Industrialisierung und Standardisierung der Anwendungs-Virtualisierung hat offenbar bei vielen Unternehmen einen Nerv getroffen.