Docker – eine kleine Einführung

Virtualisierung und Cloud sind ja nun schon lange keine Hype-Themen mehr, gerade im Server-Umfeld ist Virtualisierung nicht mehr wegzudenken.

In aller erster Linie denkt man dabei natürlich an die Virtualisierung kompletter Betriebssysteme (nativ oder paravirtualisert), aber auch Bereiche wie Festplatten-Storages (SAN – Storage Area Networks) oder Netzwerkvirtualisierung z.B. über Virtual Distributed Switches abstrahieren die Logik von der zugrundeliegenden technischen Infrastruktur.

Ein neues Konzept der Virtualisierung – oder besser einen weitergehenden Schritt in diesem Bereich geht Docker.

Denn Docker stellt Container zur Verfügung, die als Sandbox innerhalb des Basis-Systems abgeschottet laufen. Durch dieses Konzept ist es z.B. möglich, abgeschottete Prozesse in einer eigenen Infrastruktur laufen zu lassen, ohne jeweils ein komplettes Betriebssystem virtualisieren zu müssen.

Das vereinfacht die Software-Verteilung enorm, kann man beispielsweise eine komplett vorbereitete LAMP-Umgebung (Linux-Apache-MySQL-PHP) als Image vorbereiten, die ohne Änderungen auch auf anderen Basis-Systemen läuft, ohne dass man auf Library-Versionen oder Paket-Abhängigkeiten Rücksicht nehmen müsste. Ein CentOS-Container läuft so ohne Änderungen auch auf einem Debian- oder Gentoo-System.

Ein praktisches Beispiel

Um die Arbeitsweise von Docker zu verdeutlichen, setzen wir in diesem Artikel auf Basis von Debian Testing (Jessie) ein Docker-Image auf, das das oben angesprochene LAMP-System zur Verfügung stellt.

Vorbereitung

Steht Debian Jessie als Basis-System selbst zur Verfügung, muss Docker nur noch mit

root@spielwiese:~# aptitude install docker.io

installiert werden. Ältere Systeme benötigen ggf. noch einen AUFS-fähigen Kernel >=3.8. Auf der Docker-Seite gibt es Installationsanleitungen für viele Betriebssysteme.

Vorbereitungen für das eigene Image

Als Basis für unsere LAMP-Umgebung benutzen wir in diesem Beispiel auch ein Debian Testing. Dies liegt, neben vielen anderen im zentralen Docker-Repository (welches sich mit „docker search [name]“ durchsuchen lässt) und lässt sich mit:

root@spielwiese:~# docker pull debian:jessie

auf das eigene System herunterladen.

Wir hätten hier auch – wie oben schon erwähnt –  ein CentOS, Ubuntu oder, oder, oder benutzen können, das spielt eigentlich keine Rolle.

Ist der Download fertig, liegt das Image auf dem lokalen System, und wir können damit arbeiten:

root@spielwiese:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
debian              jessie              aaabd2b41e22        2 weeks ago         154.7 MB

Den eigenen Container einrichten

Jetzt, da wir eine Basis haben, können wir auf dessen Grundlage unseren eigenen Container bauen. Dazu starten wir  erst einmal eine Shell auf unserem Basis-Container:

root@spielwiese:~# docker run -it debian:jessie /bin/bash

Ab hier geht es bei der Installation der Software immer straight forward:

root@0240ad83aae4:/# apt-get update && apt-get upgrade
root@0240ad83aae4:/# apt-get install apache2
root@0240ad83aae4:/# apt-get install libapache2-mod-php5
root@0240ad83aae4:/# apt-get install php5-mysql
root@0240ad83aae4:/# apt-get install mysql-server
root@0240ad83aae4:/# echo Unser kleines Docker-Tutorial >/var/www/html/index.html

Auch alle weiteren Konfigurationsarbeiten, wie das Anlegen einer Datenbank oder das Konfigurieren und Anlegen einer neuen Website, die in diesem Container zur Verfügung gestellt werden soll, können nun wir wie auf einem „normalen“ System vornehmen.

Ein abschließendes „exit“ beendet den Container.

Weiterarbeiten mit dem erstellten Container

Dass der Container nicht mehr aktiv ist, lässt sich über

root@spielwiese:~# docker ps

schnell sehen. Der Container existiert aber noch:

root@spielwiese:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
0240ad83aae4        debian:jessie       "/bin/bash"         16 minutes ago      Exited (0) 9 seconds ago                       happy_wozniak

und kann ganz einfach wieder gestartet werden:

root@spielwiese:~# docker start 0240ad83aae4
0240ad83aae4
root@spielwiese:~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0240ad83aae4        debian:jessie       "/bin/bash"         21 minutes ago      Up 3 seconds                            happy_wozniak

Mit

root@spielwiese:~# docker attach 0240ad83aae4

könnten wir uns wieder zum gerade gestarteten Container verbinden.

Container-Konfiguration speichern

Sind alle Änderungen vorgenommen, kann der Container committed werden, die Änderungen werden unter einem frei zu vergebenden Containernamen festgeschrieben:

root@spielwiese:~# docker commit 0240ad83aae4 meinservice
5450dc8749526ec01cf7980b38e02505bb9aba742d04f8614c4e85d1a47a8a0f

Das erstellte Image ist nun im lokalen Repository gespeichert:

root@spielwiese:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
meinservice         latest              5450dc874952        About a minute ago   584.3 MB
debian              jessie              aaabd2b41e22        2 weeks ago          154.7 MB

Ein kleiner Test

Um nun unseren Container nun einmal zu testen, starten wir in diesem noch einmal eine Bash. Der Parameter „-p 80:80“ bohrt dabei ein kleines Loch in Form eines zum aufrufenden System geöffneten Port 80, sodass wir auf den Container von außen Zugriff bekommen:

root@spielwiese:~# docker run -itp 80:80 meinservice:latest /bin/bash
root@a2980a75dca0:/# /etc/init.d/apache2 start

Rufen wir nun von einem anderen System die Apache-URL unseres Docker-Systems auf, sollte das dann so aussehen:

Docker_Beispiel

Fazit

Docker bietet eine perfekte Möglichkeit, kleine abgeschottete Applikationen unkompliziert zu verteilen. Neben der hier vorgestellten simplen Einrichtung gibt es auch erweiterte Möglichkeiten, beispielsweise das Verlinken von Containern, das Einhängen von Host-Verzeichnissen in einen Container und vieles mehr. Eine sehr gute Dokumentation steht auf der Projekt-Homepage online.

Ich denke, dass die Virtualisierungs-Lösung spätestens wenn Microsoft Docker zukünftig weitreichend unterstützen wird, einen großen Boom erfahren wird.