Mit Docker schichten Sie Systeme oder Programme in Form von Image-Dateien in einen Container und arbeiten dann in einer virtuellen Umgebung.
Selten hat eine so junge Software so viel Aufsehen erregt wie in der jüngsten Zeit die Containerverwaltung Docker [1]. Dahinter verbirgt sich eines der am schnellsten wachsenden Projekte in der Geschichte freier Software.
Im März 2013 als Open Source freigegeben, erreichte es Mitte Juni 2014 Version 1.0, mit der die Entwickler es für den produktiven Einsatz freigaben. Im gleichen Monat fand sich Docker bereits in Red Hats RHEL 7. Weitere Kooperationen bestehen mit Canonical, OpenSuse, CoreOS, VMware und anderen Unternehmen. Zudem ist Docker Mitglied im Kubernetes-Projekt von Google [2].
Die mit dem Namen Docker verbundene Assoziation trifft den Zweck des Programms recht gut: Die Software belädt einen Rechner mit Containern, die Inhalte transportieren, isolieren und schützen. Bei Bedarf stapeln Sie diese übereinander, um Funktionen zu kombinieren.
Docker-Container in der IT sind virtuelle Umgebungen zum isolierten Ausführen von Prozessen und Anwendungen. Das geschieht derzeit hauptsächlich zum Entwickeln, Testen und Bereitstellen von Applikationen. Die Methode erlaubt, Anwendungen inklusive aller Abhängigkeiten so zu isolieren, dass sie praktisch keinen Overhead haben und somit fast so schnell laufen wie die nativen Anwendungen.
Im Gegensatz zu den bekannten Programmen wie Virtualbox, VMware Workstation, HyperV, Parallels Desktop oder Xen braucht ein Docker-Container kein eigenes Betriebssystem: Jeder Container nutzt die Grundfunktionen des Gastsystems (Abbildung 1), lediglich der Kernel des Hosts muss zum Gast passen.

Abbildung 1: Im Gegensatz zu einer virtuellen Maschine nutzt ein Container in Docker die Ressourcen des Hosts, wo dies möglich ist.
Die Grundlagen
Um die beschriebenen Funktionen zu erreichen, bedient sich Docker Techniken wie Control Groups [3] und Kernel-Namespaces [4]. Dabei schotten die Namespaces die Software im Container nach innen und außen ab, während die Control Groups (kurz Cgroups) dafür sorgen, dass der Container nur ihm zugeteilte Ressourcen des Hosts nutzt.
Bis Version 0.8 – zu Redaktionsschluss war Version 1.2 aktuell – machte sich Docker zudem die Funktionen von Linux-Container (LXC) [5] zunutze. Dann entwickelten die Maintainer jedoch für Version 0.9 eine eigene API namens Libcontainer, die für andere Projekte frei bereitsteht.
Derzeit kommt Docker hauptsächlich als PaaS zum Einsatz. Es eignet sich aber durchaus auch dafür, künftig als ressourcenschonende Alternative zur herkömmlichen Virtualisierung zu operieren. Derzeit beginnt die Arbeit an grafischen Werkzeugen zum Verwalten der Container, das Tool Panamax gehört zu den ersten Programmen dieser Art.
Komponenten
Das Docker-System besteht aus drei Komponenten: dem Daemon, dem Client und mindestens einem Image. Dabei übernimmt der Daemon das Verwalten der Container, über den Client steuern Sie mit entsprechenden Befehlen das System. Dabei dürfen Client und Daemon lokal auf einer Maschine laufen, alternativ kontaktiert der Client den Daemon auf einem Server im Rechenzentrum oder in der Cloud.
Docker-Images entsprechen in etwa vorgefertigten Virtual Machines (VMs) für Virtualbox oder den Appliances von VMware. Im Vergleich mit diesen fallen die Abbilder für Docker jedoch enorm platzsparend aus. Zudem lassen sie sich stapeln und wie in einem Versionskontrollsystem verwalten.
Der Docker Hub beherbergt die Repositories, die mittlerweile rund 15?000 vorbereitete Rezepte für Images enthalten. Dabei unterscheidet man zwischen Base-Images, die ein Basissystem darstellen, sowie darauf aufbauenden Images, die eine oder mehrere Applikationen enthalten (Abbildung 2). Das Erstellen eigener Images fällt nach etwas Einarbeiten leicht: Sie müssen dazu lediglich die Befehlsstruktur der verwendeten Distribution kennen.
Ebenen dank Overlay
Dank der von AUFS [6] oder Device Mapper [7] bereitgestellten Overlay-Funktionen verfügt Docker über ein effizientes Backend zum Speichern der Container. Jeder Container liegt, vereinfacht gesagt, als transparente Ebene über dem System. Hierbei kommen die gleichen Funktionen zum Einsatz, die es Ihnen erlauben, Live-Systeme im laufenden Betrieb zu verändern.
Weiterführende Informationen zu den unterschiedlichen Filesystem-Funktionen für das Speichern und Verwalten der Container finden sich in der Dokumentation von Red Hats Project Atomic [8], einem noch in Entwicklung befindlichen Container-Betriebssystem.
Bei einem Image handelt es sich lediglich um eine Art Rezept. Das Base-Image [9] bringt rudimentäre Funktionen mit und steht in einer Eltern-Kind-Beziehung zu weiteren Images (Abbildung 3), die mit dem Base-Image auf verschiedenen Ebenen interagieren, wie etwa ein Owncloud-Image, das eine zentrale Ablage im Netzwerk bereitstellt.
Die Syntax für die Arbeit mit Containern auf der Kommandozeile lehnt sich an die Kommandos des Versionskontrollsystems Git an und ist relativ leicht zu erlernen. Der Kasten “Erste Schritte” zeigt anhand eines Debian-Base-Image, wie Sie direkt loslegen.
Erste Schritte
Zunächst installieren Sie Docker mit dem Befehl aus Listing 1, Zeile 1. Für ernsthaftes Arbeiten mit dem Programm sollten Sie zudem die Pakete cgroup-tools, dbootstrap, rinse sowie cgroupfs-mount aufs-tools installieren. Um Befehle ohne administrative Rechte ausführen zu können, fügen Sie den Benutzer der Gruppe docker hinzu (Listing 1, Zeile 2).
Als Nächstes legen Sie ein Konto auf https://hub.docker.com/account/signup/ an. Dort melden Sie sich als User auf der Kommandozeile an (Zeile 3). Daraufhin suchen Sie nach einem Image Ihrer Wahl, im Beispiel Debian (Zeile 4). Zu Redaktionsschluss gab es etwa 360 verschiedene Debian-Images im Docker-Hub. Diesen durchsuchen Sie bei Bedarf auch über die Webseite. Dort finden Sie Beschreibungen der einzelnen Dateien. Für einen Test genügt das erste Image mit dem Namen debian (Abbildung 4). Der Befehl in Zeile 5 lädt das Image auf den lokalen Rechner.
Sie starten das Image in einem Container mit einer Shell (Zeile 6). Es bestünde die Möglichkeit, das Image direkt über docker run zu laden. Steht das Image nicht lokal bereit, holt der Rechner es. Sie sehen nun einen veränderten Prompt (User@Container-ID:). Mit dem Befehl aus Zeile 7 ermitteln Sie die Version des Debian-Systems. Hier sollte das System 7.6 ausgeben. Mit exit oder [Strg]+[D] verlassen Sie den Container.
Der Befehl in Zeile 8 schiebt einen Container in den Hintergrund. Das Kommando aus Zeile 9 zeigt laufende Container. Hängen Sie an diesen Befehl den Parameter -a an, zeigt die Software alle Container. Mit der Anweisung aus Zeile 10 löschen Sie den zuvor gestoppten Container; mit der aus Zeile 11 das Image. Eine Vielzahl weiterer Optionen und Parameter finden Sie in der Docker-Dokumentation [19].
Listing 1
# apt-get update && apt-get install docker.io # gpasswd -a Benutzername docker $ docker login $ docker search debian $ docker pull debian $ docker run -t -i debian /bin/bash user@70a1d73753b5: cat /etc/debian_version $ docker run -d Container-ID $ docker ps $ docker rm debian $ docker rmi debian
Container und Images
Um etwas besser zu verstehen, wie ein Image entsteht, sehen Sie sich im Docker-Hub die Beschreibung eines Owncloud-Images an [10]. Diese befindet sich im zweiten Reiter namens Dockerfile und zeigt die Kommandos, die die Datei enthält. Zusätzlich enthält ein Image noch Informationen zur Lizenz und ein README, das über Besonderheiten aufklärt.
Das Beispiel Owncloud zeigt, was das Image – wobei der Begriff Vorlage es eigentlich besser trifft – eigentlich genau macht: In der ersten Zeile steht hinter dem einleitenden FROM das Basis-Image, das zum Einsatz kommt – in diesem Fall Debian “Stable”. Laden Sie die Datei herunter, führt Docker jeweils die Anweisungen hinter dem Befehl RUN in dieser Reihenfolge aus.
Zuerst installiert es das Kommandozeilen-Tool Wget, um damit einen GPG-Schlüssel zu laden. Diesen fügt es dem Schlüsselbund hinzu, trägt das Repository von Owncloud in die Quellen ein und installiert abschließend Owncloud samt Abhängigkeiten. Dann setzt die Vorlage noch Voreinstellungen für den Webserver Apache, der in diesem Fall im Basis-Image enthalten ist.
Dieses vorbereitete Image laden Sie in einen Container, wobei Docker das Basis-Image automatisch mitzieht. Container sind von Haus aus isoliert, sie dürfen nicht mit der Außenwelt kommunizieren. Sollen sie das doch tun, erlaubt der Parameter EXPOSE in der Docker-Datei die Angabe eines Ports, den Sie nach außen freigeben möchten.
Abgeschottet
Der Parameter VOLUME erlaubt das Einhängen von Dateisystemen des Hosts oder anderer Container an definierten Stellen. Seit Docker 1.2 ist es möglich, die Rechte und Fähigkeiten eines Containers sehr abgestuft zu steuern [11]. Die Kombination aus Cgroups und Namespaces spielt hier ihre Fähigkeiten voll aus.
Diese Anweisungen teilen Docker mit, was der Container enthält, und gegebenenfalls, welchen Befehl Sie beim Start ausführen möchten. So startet im einfachsten Fall mit dem Container gleich eine Shell, aber auch wesentlich komplexere Abläufe wären möglich, wie etwa automatisierte Testläufe.
Da die Images selbst das Schreiben von Daten nicht erlauben, spannt Docker beim Start eines Containers mithilfe eines Union File Systems wie AUFS oder Device Mapper darüber eine Ebene auf, worin dann die Applikation läuft. Ändert sich jetzt etwas, etwa durch ein Update, fügt es eine weitere Ebene darüber ein, anstatt zur Laufzeit das gesamte Image zu ändern. Änderungen während der Laufzeit übernimmt die Software erst, wenn Sie den Zustand mit dem Befehl docker commit wieder in ein Image umwandeln.
Es gibt zwei Arten von Docker-Containern: interaktive und solche, die als Daemon laufen. Möchten Sie, dass der Container einen vorgegebenen Ablauf abarbeitet und dann stoppt, starten Sie ihn interaktiv mit einem Befehl wie in der ersten Zeile von Listing 2. Nutzen Sie dagegen den Befehl aus der zweiten Zeile, wartet der gestartete Container im Hintergrund auf Eingaben.
Listing 2
$ docker run -t -i debian:sid Befehl_1;Befehl_2 $ docker run -d debian:sid /bin/bash
Panamax hilft
Obwohl die Befehlsstruktur von Docker recht einfach wirkt und sich in großen Teilen an den Kommandos von Git orientiert, gerät das Hantieren mit mehreren Containern schnell unübersichtlich. Abhilfe schafft das grafische Frontend Panamax [12], das dabei hilft, Docker-Container zu verwalten.
Die Applikation befindet sich derzeit im Beta-Stadium. Um die webbasierte GUI zu nutzen, installieren Sie Vagrant mindestens in Version 1.6.5 sowie Virtualbox mindestens in Version 1.4.2. Falls die von Ihnen eingesetzte Distribution keine Pakete bereitstellt, laden Sie die Programme als DEB-Pakete von den Webseiten der Anbieter Vagrant [13] und Virtualbox [14] herunter. Die Installation von Panamax gelingt derzeit nur auf Debian-basierten Distributionen oder unter Mac OS X.
Sind die Vorbedingungen erfüllt, installiert der Befehl aus Listing 3 ein minimales CoreOS sowie Panamax in eine virtuelle Maschine (Abbildung 5). Der Vorgang läuft automatisch ab; lediglich am Ende fordert das Skript Sie auf, im Browser die Adresse http://localhost:8888 zu besuchen. Dort erwartet Sie eine Oberfläche, die es erlaubt, Images zu suchen, zu installieren, auszuführen, zu verändern, zu verwalten und wieder zu speichern.
Listing 3
$ curl http://download.panamax.io/installer/ubuntu.sh | bash
Um das Programm in diesem frühen Stadium sinnvoll zu nutzen, sollten Sie allerdings das Prinzip von Docker in Grundzügen verinnerlicht haben. Dabei sollten Sie sich über den Unterschied zwischen Image und Container im Klaren sein. Mit Panamax kommen Sie ohne Eingabe von Befehlen schnell zu funktionierenden Containern (Abbildung 6). Geht etwas schief, löschen Sie die Images einfach und beginnen von vorn.
Ausblick
Noch gestaltet sich der Umgang mit Docker für Endanwender etwas sperrig, doch dass der Einsatz der Container auf dem Desktop sinnvoll ist, steht außer Frage. Mit deren Hilfe isolieren Sie beispielsweise nicht vertrauenswürdige Programme oder Prozesse auf einfache Weise vom Rest des Betriebssystems oder testen Software ohne große Umstände unter leicht veränderten Bedingungen. Bauen Sie ab und an Pakete für den Eigenbedarf, bietet sich Docker dabei als Ersatz für eine Change-Root-Umgebung an.
Möchten Sie Docker ohne viel Aufwand testen, bietet sich das Projekt Boot2Docker an [15]. Dabei handelt es sich um ein auf Tiny Core Linux basierendes ISO-Image mit lediglich 23 MByte Größe, das Sie in Virtualbox ausführen und das unter Mac OS X und Windows lauffähig ist. Boot2Docker eignet sich hervorragend für einen ersten Test mit Containern (Abbildung 7).

Abbildung 7: Mit wenigen Handgriffen setzen Sie mit Boot2Docker eine einsatzbereite Umgebung für Docker in einer virtuellen Maschine auf – allerdings nur unter Windows oder Mac OS X.
Fazit
Das Prinzip der Container ist keineswegs neu: Seit Langem gibt es BSDs Jails [16], Solaris’ Zonen [17], OpenVZ [18] oder LXC. Selbst beim Change Root unter Linux handelt es sich im Prinzip um nichts anderes als um einen Container. Allerdings haben die Macher von Docker zum richtigen Zeitpunkt die richtigen Ideen als freie Software gebündelt. Innerhalb kürzester Zeit sind mit CoreOS, dem Projekt Atomic und Dockerera drei Systeme entstanden, die sich der Technik bedienen.
Obwohl es scheint, als ob herkömmliche Virtualisierung mittels Virtualbox oder VMware dabei weder hinsichtlich der Geschwindigkeit noch des Verbrauchs an Speicher mithalten könne, bleiben die VMs zumindest mittelfristig sicher erhalten. So verwendet aus Sicherheitsgründen Google beispielsweise Docker-Container innerhalb von virtuellen Maschinen. Zudem läuft Docker in einer VM auch auf anderen Betriebssystemen, wie das Projekt Boot2Docker beweist.
Der Autor
Ferdinand Thommes lebt und arbeitet als Linux-Entwickler, freier Autor und Stadtführer in Berlin.
Glossar
-
PaaS
-
Plattform as a Service. Bezeichnet einen Dienst im Internet, der für einen speziellen Zweck (Webanwendung, Entwicklung) eine virtuelle Umgebung bereitstellt.
Infos
[1] Docker: https://docs.docker.com
[2] Kubernetes: http://www.admin-magazin.de/News/Kubernetes-fuer-Docker-Alle-machen-mit
[3] Cgroups: http://www.pro-linux.de/artikel/2/1464/ressourcen-verwaltung-mit-control-groups-cgroups.html
[4] Kernel Namespaces: http://lwn.net/Articles/531114/
[5] LXC: Florian Effenberger, “Sandkastenspiele”, LU 06/2012, S. 72, https://www.linux-community.de/25665
[6] AUFS: http://de.wikipedia.org/wiki/Aufs
[7] Device Mapper: http://de.wikipedia.org/wiki/Device_Mapper
[8] Project Atomic: http://www.projectatomic.io/
[9] Base-Image: https://docs.docker.com/terms/image/#base-image-def
[10] Dockerfile: https://registry.hub.docker.com/u/toke/owncloud7/dockerfile/
[11] Docker 1.2: http://www.golem.de/news/containerverwaltung-docker-1-2-erlaubt-regelung-von-containerneustarts-1408-108796.html
[12] Panamax: http://panamax.io/
[13] Vagrant: https://www.vagrantup.com/downloads.html
[14] Virtualbox: https://www.virtualbox.org/wiki/Downloads
[15] Boot2Docker: http://boot2docker.io
[16] BSD Jails: http://en.wikipedia.org/wiki/FreeBSD_jail
[17] Solaris Zonen: http://de.wikipedia.org/wiki/Container_(Solaris)
[18] OpenVZ: http://de.wikipedia.org/wiki/OpenVZ
[19] Docker-Doku: http://docs.docker.com/userguide/










