Docker

In letzter Zeit ist überall die Rede von Docker. Wer trotzdem noch nichts davon gehört hat: Mit Docker ist es möglich, einzelne Anwendungen in einer immer gleich bleibenden, abgeschotteten Umgebung unabhängig vom eigenen System, laufen zu lassen. Ähnlich wie bei VMs hat man also eine Art Zweitsystem, in dem man die Anwendungen installiert. Mit dem Unterschied, dass Docker kein vollständiges Betriebssystem stellt. Es trennt also nur die Systemressourcen durch Cgroups und Namespaces. Trotzdem ist es möglich in einem sogenannten Docker Container ein anderes Unix/Linux-System laufen zu lassen, solange der Kernel des Host-Systems verwendet werden kann. Wer also für seine Anwendung openSUSE benötigt, den Host aber mit Ubuntu laufen lässt, kann dies ohne Probleme tun.

Der Hintergrundgedanke ist der, dass ein bestimmter Zustand einer Anwendung zu jeder Zeit sichergestellt werden soll. Das ist sowohl bei Entwicklungsumgebungen als auch bei produktiven Systemen mit sehr vielen Vorteilen verbunden. Zudem sind Docker-Container relativ klein, da sie nicht zwingend ein komplettes System benötigen, und zudem performant, da die Anwendungen nativ vom Kernel gestartet werden. Natürlich habe ich mir die Chance nicht entgehen lassen und das ganze getestet.

Die Installation von Docker selbst und das Erstellen von Containern durch sogenannte Dockerfiles ist ein Kinderspiel. Auch Spielereien wie einen abgeschotteten SSH-Server lassen sich in ein paar Zeilen realisieren. Doch wie bei jeder Software gibt es auch bei Docker ein paar Dinge, die mich stören. Getestet habe ich Docker nun auf 3 verschiedenen System, auf allen mit dem gleichen Ergebnis: DNS funktioniert nicht richtig. Ich weiß nicht, ob ich irgendwelche komischen Routen konfiguriert habe oder Docker mich einfach nicht mag, aber ohne einem

iptables -F

und der Option –dns beim Starten des Containers komme ich nicht weit. Das Problem bei der Sache ist, dass der Parameter beim Erstellen eines Containers aus einer Dockerfile heraus ignoriert wird, was bedeutet, dass ich keine Container bauen kann, welche Pakete installieren oder sonst auf das Internet zugreifen wollen.

Des weiteren gibt es dank selinux ein Problem beim Mounten eines Verzeichnisses. Mit der Option -v ist es möglich dem Docker-Container einen Ordner des Hostsystems durchzureichen. Das ist beispielsweise dann hilfreich, wenn man mit LaTeX ein lokal liegendes Dokument bauen möchte. Um Rechte auf den entsprechenden Ordner zu bekommen, muss auf dem Hostsystem folgende Berechtigung für den Ordner gesetzt werden:

chcon -Rt svirt_sandbox_file_t /path/to/folder

Auch scheint die Trennung der zwei Systeme nicht so sauber zu sein, wie ich mir das wünsche. So ist es z.B. nicht möglich den Hostnamen in einem Container zu setzen oder alternative DNS-Server einzutragen. Die Zugriffe auf die entsprechenden Dateien werden gesperrt, was bei mir dazu führte, dass manche Anwendungen nicht fehlerfrei funktionierten. Darunter auch HHVM und MySQL.

Alles in allem ist Docker aber ein sehr interessantes System und ich bin mir sicher, dass es eine große Zukunft vor sich haben wird. An dem Spruch

Docker is Git for deployment.
ist denke ich einiges dran. Docker ist ein mächtiges Tool. Wer mit Deployment etwas am Hut hat und sich mit Docker auskennt, kann sich sein Leben wesentlich vereinfachen.