c't 5/2016
S. 108
Know-how
Container: Apps für Server
Aufmacherbild

Container: Apps für Server

Wie Docker-Container die IT industrialisieren

Container stecken eine Anwendung und alles, was sie zum Funktionieren braucht, in ein handliches Paket. Das erleichtert Installation und Betrieb. Aber ihr wahres Potenzial entfalten Container erst beim massenweisen Einsatz.

Container wollen die Art und Weise revolutionieren, wie (Server-)Anwendungen installiert und betrieben werden. Admins sollen sich nicht mehr mit programm- und plattformspezifischen Einrichtungsprozeduren und speziellen, womöglich widersprüchlichen Anforderungen an das Betriebssystem herumschlagen müssen – Container kapseln all diese Eigenheiten. Das Versprechen: Sämtliche containerisierten Anwendungen lassen sich einheitlich managen, für ihren Betrieb müssen nur noch minimale Voraussetzungen erfüllt sein.

Das ist wie bei den Frachtcontainern, die unabhängig von ihrem Inhalt immer die gleichen Abmessungen haben und sich mit den gleichen Anlagen verladen lassen – ein Riesenfortschritt gegenüber den Kisten, Säcken und Bündeln, die früher einzeln an Bord geschafft werden mussten. Die Frachtcontainer haben das Transportwesen industrialisiert und wurden zur Grundlage der globalisierten Wirtschaft. Docker-Container ermöglichen eine weitgehende Automatisierung des Rechenzentrumbetriebs, wie sie im Cloud-Zeitalter mit seinen skalierbaren, verteilten Anwendungen unabdingbar ist.

Eingesperrt

Container sind normale Prozesse, bei denen Kernel-Mechanismen für eine bessere Isolierung gegenüber dem Rest des Systems und damit auch gegeneinander sorgen. Im Linux-Kernel kontrollieren und limitieren Control Groups (Cgroups) den Zugriff von Prozessen auf Speicher-, CPU- und I/O-Ressourcen. Sie verhindern, dass der Ressourcenhunger eines Prozesses andere laufende Prozesse beeinträchtigt.

Namespaces beschränken einen Prozess und seine Kindprozesse auf einen Ausschnitt des Systems. So sieht ein containerisierter Prozess dank Mount-Namespaces nicht das gesamte Dateisystem des Hosts, sondern nur einen kleinen Teil davon. In der Regel handelt es sich dabei um ein Image speziell für diesen Container. Das eröffnet die Möglichkeit, eine Anwendung, ihre Konfiguration und die benötigte Laufzeitumgebung in ein Container-Image zu packen, das nur noch minimale Anforderungen an das System stellt. Der Effekt von Mount-Namespaces ist vergleichbar einer Chroot-Umgebung.

Prozess- und IPC-Namespaces sorgen dafür, dass in einem Container keine Prozesse sichtbar oder per Interprozess-Kommunikation erreichbar sind, die außerhalb des Containers laufen. Jeder Container kann eine eigene IP-Adresse, eigene Routing-Tabellen und einen eigenen Host- und Domänennamen haben. Auch können mehrere containerisierte Anwendungen den gleichen Port binden – sie werden dann auf unterschiedliche Host-Ports abgebildet.

Namespaces und Control Groups bilden die technische Grundlage des Container-Betriebs. Ausgelöst hat den Container-Boom aber erst Docker. Das Unternehmen hat Werkzeuge entwickelt, die diese Kernel-Mechanismen einfach handhabbar machen, ein Format für Container-Images definiert und mit der Docker Engine eine Plattform für den Container-Betrieb bereitgestellt. Heutzutage sind fast immer Docker-Container gemeint, wenn von Containern die Rede ist. Selbst der Windows-Server kennt mittlerweile Docker-Container (S. 122) – das zeigt, wie wichtig Docker-Container geworden sind.

Virtualisierung light

Container werden gerne als leichtgewichtige Systemvirtualisierung beschrieben. Im Unterschied zu VMware, VirtualBox, KVM und Co. emulieren sie allerdings keine Hardware und starten auch kein eigenes Betriebssystem: Alle Container laufen auf demselben Kernel, nämlich dem des Host-Systems. Unterschiede gibt es lediglich im Userland.

Container vs. virtuelle Maschinen

Das kostet Flexibilität, da man mit Containern natürlich kein Windows auf einen Linux-Server kriegt. Aber es spart eine Menge Ressourcen: Wo eine virtuelle Maschine genauso booten muss wie eine reale Hardware und ein komplettes Betriebssystem als Overhead mit sich schleppt, sind Container auf das Allernötigste reduziert. Der Start eines Apache-Containers dauert daher kaum länger und frisst kaum mehr Ressourcen als der Start des Webservers direkt auf dem Host. So laufen Hunderte von Containern gleichzeitig auf einer Maschine, die schon bei einem Dutzend virtueller Maschinen in die Knie gehen würde.

Die Reduzierung kommt der Sicherheit zugute: Software, die nicht im Container steckt, kann auch nicht angegriffen werden. Und selbst wenn es gelingt, von außen in einen Container einzubrechen: Was kann man schon anrichten, wenn selbst rudimentäre Kommandozeilenwerkzeuge fehlen? Allerdings sind Container weniger gut gegeneinander und gegenüber dem System abgeschottet als virtuelle Maschinen – schon allein, weil alle Container auf einem Rechner denselben Kernel teilen.

Trotzdem bieten Docker-Container viele Vorteile von virtuellen Maschinen: Sie können eine eigene Systemumgebung mitbringen (wenn auch kein komplett anderes Betriebssystem), lassen sich einfrieren und wieder starten und ermöglichen Snapshots des aktuellen Zustands. Zudem lassen sich Container unabhängig von ihrem Inhalt mit den gleichen Werkzeugen managen, was ähnlich wie bei Virtualisierungs- und Cloud-Plattformen viel Potenzial für Automatisierung bietet. Und nicht zu vergessen: Container laufen auch in virtuellen Maschinen, was weitere Flexibilität bringt.

Videos