Die unübliche Methode sieht vor, dass Sie einen Container mit einem fertigen Image starten, die gewünschten Änderungen vornehmen und die Daten im Anschluss mit commit speichern. Wie das im Detail funktioniert, erklärt die offizielle Dokumentation [5].
Die aufwendigere, aber besser strukturierte Variante besteht im Anlegen einer Konfiguration in Form eines Dockerfiles, das den Zusammenbau beschreibt. Je nach Bedarf schieben Sie so beim Bau zusätzlich eigene Dateien oder Ordner in den Container. Diese Methode sorgt für bessere Reproduzierbarkeit und erlaubt den Bau von Containern aus einem Git-Repository heraus.
Container kommen häufig bei Webanwendungen zum Einsatz. In diesem Kontext ist eine abgeschottete Umgebung sinnvoll. Zudem sorgt dieser Ansatz für ein gehöriges Maß an Portabilität: Ein Entwickler packt seine Anwendung in einen Container, lädt das Image in eine Registry hoch und auf einem anderen Rechner wieder herunter. Dass Docker mittlerweile über Tricks selbst auf Windows-Maschinen und Macs läuft, macht diese Vorgehensweise zusätzlich attraktiv.
Die spezielle Architektur des RasPi bedingt, dass die selbst gebauten Container in der Regel nur auf anderen RasPi-Geräten laufen. Um ein erstes Image zu bauen, erstellen Sie auf dem Raspberry Pi einen Ordner im Home-Verzeichnis:
$ mkdir ~/simple_website
Wechseln Sie in das Verzeichnis und erstellen Sie dort die Datei index.html, die Sie anschließend mit beliebigem HTML-Code füllen. Erstellen Sie im gleichen Verzeichnis die Datei Dockerfile und übernehmen Sie den Inhalt aus Listing 2. Zeile 1 beschreibt, auf welchem Image der Container basiert. Beim Bau lädt Docker das entsprechende Image herunter und beginnt, alle weiteren Schritte darauf aufzubauen.
Das RUN in Zeile 2 markiert einen Aufruf, der intern via /bin/sh -c Kommandos zur Installation des Nginx-Pakets übergibt. Im Anschluss sorgt die COPY-Anweisung für die Platzierung der Datei index.html im Container, wobei Docker davon ausgeht, dass sich die Datei im selben Verzeichnis befindet wie das Dockerfile.
Listing 2
FROM resin/rpi-raspbian:jessie-20160831 RUN apt-get update; apt-get install -y nginx COPY index.html /var/www/html/ ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"] EXPOSE 80
Existiert das Zielverzeichnis nicht, legt Docker es automatisch an. Damit der Webserver Nginx im Container läuft, definiert ENTRYPOINT den passenden Befehl inklusive Parameter, der den Dienst im Vordergrund startet. Docker ruft dieses Kommando nach dem Start des Containers auf, wobei die Schreibweise mit eckigen Klammern dafür sorgt, dass das Ausführen ohne /bin/sh -c gelingt.
Die Zeile EXPOSE 80 bewirkt, dass der Container den Port 80 öffnet, über den Sie eine Verbindung zu Nginx herzustellen. Übrigens hält der im Vordergrund laufende Webserver den Container offen. Docker killt den Container erst, wenn Nginx stoppt.
Rufen Sie aus dem Verzeichnis ~/simple_website/ heraus nun das Kommando für den Bau des Containers auf (Listing 3, Zeile 1). Die Option build leitet die Aktion ein, der Schalter -t akzeptiert die Angabe eines symbolischen Namens (Tag). Üblicherweise besteht dieser aus einem Benutzernamen und einer kurzen Bezeichnung, zwischen denen ein Schrägstrich steht. Der Punkt am Ende gibt das Build-Verzeichnis an.
Listing 3
$ sudo docker build -t "rpi-geek/simple_website" . $ sudo docker run -d --name simple_website -p 80:8080 "rpi-geek/simple_website"
Wenn Sie das Image zum ersten Mal bauen, führt Docker alle Schritte aus und speichert die Zwischenschritte ab. Leiten Sie den Vorgang erneut ein, läuft er unter Umständen um einiges schneller ab und erzeugt weniger Ausgaben (Abbildung 5).

Abbildung 5: Haben Sie das Image einmal komplett gebaut, speichert Docker die Zwischenschritte und sorgt so dafür, dass ein späterer Build unter Umständen weniger Zeit in Anspruch nimmt.
Mit sudo docker images verifizieren Sie, dass die Software das selbst erstellte Image kennt und in der Lage ist, es als Grundlage für einen Container zu verwenden. Mit dem Kommando aus der zweiten Zeile von Listing 3 bewirken Sie, dass Docker nun eine Umgebung auf Basis des eben gebauten Images bereitstellt.
Durch den Schalter -d läuft der Container im Hintergrund, --name sorgt für eine leicht zu identifizierende Benennung. Vergeben Sie keinen Namen, verwendet Docker beim Start einen Hash als Namen – im Alltag etwas unhandlich. Bei nachträglichen Aktionen am Container suchen Sie immer erst via sudo docker ps den Namen heraus und geben diesen dann in den Kommandos an.
Mit dem Schalter -p 80:8080 schleifen Sie den Container-Port 80 auf Port 8080 des lokalen Systems durch. Sie erreichen den Container im Browser entsprechend unter http://localhost:8080 (Abbildung 6). Beim Aufruf der Adresse erscheint die Ausgabe der zuvor ins Image kopierten Datei index.html.

Abbildung 6: Dank Port Forwarding schleifen Sie die Ausgabe des Webservers im Container auf den lokalen Rechner durch.
Das Kommando sudo docker ps listet alle laufenden Container inklusive der gemappten Ports auf, während sudo docker port simple_website nur die Ports zeigt. Die Tabelle “Docker-Kommandos” fasst die essenziellen Befehle zum Verwalten von Containern zusammen. Wenn Sie nicht als Administrator arbeiten, erfordern diese Kommandos ein vorangestelltes sudo. An die Stelle des Platzhalters Name setzen Sie den Namen des gewünschten Containers.





