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:
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.