Ein Docker-Container – und Deine Anwendung läuft überall

„But it works on my machine!“

Diese allseits bekannte Entwickler-Wahrheit deutet schon seit langem darauf hin, daß die Portierung einer perfekt funktionierenden Anwendung in einen anderen Kontext immer schwieriger wird. Immer mehr Tools, Konfigurationen und unvorhergesehene Sicherheitsbestimmungen.. da kann die Präsentation der schönsten Anwendung zum frustrierenden Erlebnis werden.

dockerlogo
image-967

Transport im Docker-Container

Die Macher von Docker haben sich gedacht, daß es ja wohl nicht sein kann, daß die Menschheit mittlerweile Waren in jeglicher Form an jeglichen Ort der Welt verschiffen kann, aber die IT-Welt es immer noch nicht hinkriegt, problemlos eine Anwendung von einem Kontext in den nächsten zu portieren. In Anlehnung an diese Allegorie wurde 2013 der Docker-Container erfunden. Ebenso wie ein großer Schiffscontainer ein einheitliches (seit 1956 nach ISO-Norm standardisiertes) Format hat, das gleichermaßen von Schiffen und LKWs transportiert und gestapelt werden kann und mit beliebigem Inhalt zu befüllen ist, ist der Docker-Container dafür zuständig, eine Anwendung beliebiger Art so in sich zu kapseln, daß der Container alle Kontextinformationen übernimmt und sich problemlos in verschiedene Umgebungen verschieben lässt.

docker-containers
image-968

Quelle: Eine Folie des Docker Erfinders Solomon Hykes aus seiner Präsentation während der DockerCon Konferenz im Juni 2014.

Anwendungsbeispiele

Der Entwickler ist durch den Docker-Container der Verantwortung entbunden, sich um die Kontextinformationen bei der Portierung zu kümmern. Seine Anwendung läuft sowohl auf dem Mac oder Windowsrechner des Kollegen, als auch auf dem QA Server mit Ubuntu und den VMs in der Produktion mit Red Hat. Und er muss beim Containerbau auch nicht bei Null anfangen, sondern kann sich in dem Docker Hub-Repository ein fertiges Image abholen und dann seinen Container nur noch an spezielle Bedürfnisse anpassen.

SysAdmins bietet Docker die Möglichkeit, Entwicklern, Testern und anderen Projektbeteiligten eine standardisierte Umgebung zur Verfügung zu stellen, die nachträgliche Schuldzuweisungen verhindert. Durch den Docker-Container wird von den Unterschieden in Betriebssystemen und Infrastruktur abstrahiert und sich allein auf die Anwendung konzentriert. Zusätzlich ist die administrative Arbeit durch die Verwendung von standardisierten Docker-Containern weniger auf eine Infrastruktur beschränkt, sondern es können sowohl vor-Ort-Maschinen, als auch Datencenter VMs oder öffentliche Clouds verwendet werden, je nachdem was den aktuellen Anforderungen gerade am besten entspricht.

Auch als Möglichkeit zur Ausfallsicherheit von hochverfügbaren Systemen kann Docker genutzt werden. So können Web-Applikationen samt ihrer Abhängigkeiten in Docker Containern gekapselt werden und lassen sich im Fehlerfall der darunterliegenden Infrastruktur problemlos zu einem anderen Anbieter verschieben.  Ein solches Szenario beschreibt James Thomason sehr gut auf seinem Blog.

Docker vs. Virtual Machines

Im Gegensatz zu einer vollständigen virtuellen Maschine, bringt ein Docker-Container nicht das gesamte Betriebssystem und viele weitere Ressourcen mit, sondern lediglich die eigentliche Anwendung sowie die dazugehörigen Abhängigkeiten. Der Container wird als isolierter Prozess auf dem Host Betriebssystem ausgeführt und teilt sich den Linux-Kernel mit anderen Docker Containern. Für jeden Container lässt sich exakt definieren, wie viele Ressourcen (Prozessor, RAM, Bandbreite) ihm zur Verfügung stehen.

docker_vs_vmware

Bau Dir einen Docker-Container

Um Docker zu testen, kann zunächst einmal ein kurzes Onlinetuturial durchgeführt werden. Dauert nur 10 Minuten und man hat die grundlegenden Konzepte danach schon verstanden 🙂

docker-tutorialIst man davon überzeugt, kann man sich Docker auf dem eigenen Rechner installieren. Da Docker auf die serverseitige Anwendung ausgerichtet ist, funktioniert es am besten mit Linux, es kann aber mit Hilfe von VirtualBox auch auf Mac OS X und Windows verwendet werden. Für den Mac gibt es sogar eine schicke graphische Oberfläche, die allerdings momentan noch in der Beta-Version vorliegt, oder man nimmt das Kommandozeilenprogramm Boot2Docker.

Nach dem Starten des Boot2Docker-Programms (boot2docker start) können docker-Befehle über die Kommandozeile eingegeben werden. Der Docker-Host ist der Rechner auf dem die Container laufen. Bei einer Installation auf dem eigenen Rechner ist das der localhost. Da aber bei Mac und Windows-Rechnern über VirtualBox eine VM benutzt wird, ist die Docker-Host-Adresse die Adresse der Linux VM.

boot2docker ip

Zeigt dir die IP-Adresse der virtuellen Maschine an, in der Docker läuft.

Gebe docker in die Kommandozeile ein und schau dir die Liste aller Befehle an, die von Docker verstanden werden.

Docker ermöglicht es dir, Anwendungen innerhalb von Containern auszuführen. Eine Anwendung wird ausgeführt indem docker run, danach der Imagename und  dann die Anwendungsfunktion angegeben wird.

docker run <Imagename> <auszuführender Befehl>
docker run ubuntu:14.04 /bin/echo 'Hello world'

Wird ein Image lokal nicht gefunden, baut Docker automatisch eine Verbindung zum zentralen Docker-Hub-Repository auf und sucht dort nach dem Image. Im oben genannten Beispiel wird das Image für ubuntu:14.04 heruntergeladen.

Man kann zum Beispiel auch eine Konsole innerhalb des Containers starten:

docker run -t -i ubuntu:14.04 /bin/bash
-t = vergibt ein Terminal an den Container
-i = ermöglicht eine interaktive Verbindung

Jetzt können auf dieser Konsole Befehle eingegeben werden. Man verlässt die Containerkonsole durch die Eingabe von exit.

Nachdem der Prozess beendet ist, wird auch der Container automatisch wieder gestoppt. Will man dies vermeiden, gibt man zusätzlich -d an.

Mit dem folgenden Befehl wird ein Container mit einer Python-Webanwendung gestartet.

docker run -d -P training/webapp python app.py
docker run -d -P --name web training/webapp python app.py
-d = hält den Container am laufen 
-P = veröffentlicht die Containerports auf deinem localhost
--name <name> = eigenen Namen für den Container vergeben, wird sonst automatisch generier

Um Informationen zu dem aktuell laufenden Container anzuzeigen, wird folgender Befehl genutzt:

docker ps
docker ps -a  = zeigt auch alle gestoppten Container an

docker-ps2
image-969
Der Containername wird vom System automatisch vergeben, oder kann mit dem –name flag beim Starten des Containers einen Namen vergeben. Der folgende Befehl liefert den Port, unter welchem die Anwendung zu finden ist:

docker port <containername>
boot2docker ip = liefert die IP-Adress

Mit der IP und dem Port kann die Webanwendung jetzt im Browser aufgerufen werden.

Danach wird der Container wieder gestoppt und kann entfernt werden.

docker stop <containername>
docker rm <containername

Auf diese Weise werden also fertige Anwendungen in fertigen Docker-Containern verwendet. Aber wie kriege ich meine eigene Anwendung in meinen eigenen Container?

Man beginnt immer mit einem Container als Grundlage. Da es im Docker-Repository eigentlich zu fast jedem Anwendungsfall bereits einen Container gibt, lohnt es sich dort nachzuschauen.

Schau dir an, welche Images du bereits lokal auf deinem Rechner hast.

docker images

Um ein Image zu ändern oder anzupassen, kann wie oben beschrieben die Konsole in dem Container geöffnet werden und zum Beispiel neue Software installiert werden. Danach wird eine Kopie des Images abgespeichert mit

docker commit -m "Commit message" -a "Autor" <Quelle: Container ID> <Zieladresse: username/imagename:tag>
docker push <username/imagename:tag> = lädt dein neues Image in das Docker Repository
docker rmi <username/imagename:tag> = entfernt das Image aus dem Repositor

Jetzt kann man ein Datenverzeichnis von dem lokalen Rechner als Datenverzeichnis im Container mit -v mounten. Das bedeutet, daß es vom Container aus zugreifbar ist. Boot2docker teilt automatisch das Verzeichnis /Users (C:\Users für Windows) mit der VM. Dieser Startpunkt kann genutzt werden, um weitere Verzeichnisse zu teilen.

cd $HOME = wechsle in das Homeverzeichnis
mkdir site = erstelle ein neues Verzeichnis
cd site = wechsle in das Verzeichnis
echo "my new site" > index.html = erstelle eine neue Indexseite
echo "This is cool" > cool.html = und eine weitere Seite
docker run -v /Users/<path>:/<container path> 
docker run -d -P -v $HOME/site:/usr/share/nginx/html nginx 
= starte den Docker-Container und tausche das Webverzeichnis gegen das lokale aus.

Jetzt kann die neue Indexseite im Browser unter der VM-IP und dem Containerport aufgerufen werden. Unter der weiteren Angabe von /cool.html findet sich die zweite Seite. Danach nicht vergessen den Container wieder zu stoppen mit docker stop <containername>.

Damit sind die grundlegenden Docker-Befehle getestet. Viel Spaß beim weiteren Rumexperimentieren!

Links:

Schreibe einen Kommentar