Docker-Workshop (2): Volumes

Docker-Workshop (2): Volumes

Die letzte Folge unseres Docker-Workshops hat beschrieben, wie Sie Docker instalieren und Container starten. Um größeren Nutzen aus Docker zu ziehen, fehlen noch zwei Dinge: eine Netzwerkverbindung und eine Möglichkeit, Nutzdaten dauerhaft zu speichern.

Um Volumes und Port-Weiterleitung zu demonstrieren, wollen wir zuerst das im letzten Teil angefertige Docker-Image weiterentwickeln. In dem Alpine-Image »alpine-nginx:0.1« befindet sich nun der Nginx-Webserver, der aber bisher noch nicht konfiguriert ist. Außerdem muss dem Container beigebracht werden, den Server zu starten. Nun wäre es möglich, wie beschrieben, im laufenden Container eine Shell zu starten, dort die Webserver-Konfiguration zu editieren und den Container wieder als neues Image zu committen (Bad Practice!).

Stattdessen soll hier ein Docker-Feature eingeführt werden, das wesentlich für sinnvolle Anwendungen ist: Docker-Volumes sind im einfachsten Fall "Fenster" aus dem Container in das Host-Dateisystem, die es ermöglichen, Konfigurations- und Anwendungsdaten außerhalb flüchtiger Container zu speichern. Dazu rufen Sie Docker mit der Option »-v« auf, die als Parameter ein Host-Verzeichnis und das entsprechende Container-Verzeichnis enthält. Zuerst legen Sie die Verzeichnisse auf dem Host an:

mkdir -p nginx/etc
mkdir -p nginx/html
mkdir -p nginx/log

Im HTML-Verzeichnis legen Sie die Datei »index.html« an, in die Sie ihren HTML-Text schreiben. Nun fehlt noch die Nginx-Konfigurationsdatei, die etwa so aussieht und die Sie in »nginx/etc/nginx.conf« speichern:

pid        /var/run/nginx.pid;

events {
   worker_connections  1024;
}

http {
   access_log  /var/log/nginx/access.log  combined;

   server {
       listen       80;
       location / {
           root   /var/www;
           index  index.html;
       }
   
   }
}

Nun starten Sie den Container so:

docker container run -ti --name nginx-test --rm -v /home/oliver/nginx/etc:/etc/nginx -v /home/oliver/nginx/html:/var/www -v /home/oliver/nginx/log/:/var/log/nginx -p 8080:80 alpine-nginx:0.1 /usr/sbin/nginx -g "daemon off;"

Die Syntax für die Volumes sieht so aus, dass nach dem Schalter »-v« zuerst das Host-Verzeichnis folgt und dann, mit einem Mittelpunkt getrennt, das entsprechende Verzeichnis im Container. Genauso funktioniert das mit der Port-Weiterleitung, die hier mit dem Schalter »-p« festlegt wird: Der Container-Port 80 wird auf den Host-Port 8080 weitergeleitet. Natürlich bietet Docker auch ausgefeiltere Methoden zum Netzwerken, auf die wir noch zu sprechen kommen werden. Der Nginx-Server im Container ist damit unter der Host-IP-Adresse und dem Port 8080 erreichbar.

Hier wird auch der im ersten Teil angesprochene Schalter »--rm« verwendet, der dazu führt, dass von dem Container nichts mehr übrig bleibt, wenn er einmal beendet wird. Weil der Container nicht über ein Init-System oder Ähnliches verfügt, haben wir den Nginx-Server einfach als auszuführendes Kommando angegeben und ihn im Vordergrund gestartet, da der Conaienr sonst gleich wieder beendet wird. Um ihn zu stoppen, genügt es also, im Terminal, in dem Sie den Container gestartet haben, [Strg]+[c] zu drücken. Alternativ können Sie auch einmal ausprobieren, in einem anderen Fenster »docker container stop nginx-test« einzugeben.

Wenn ein Verzeichnis, das Sie auf dem Host als Docker-Volume nutzen wollen, noch nicht existiert, legt Docker es an. Allerdings kann es sein, dass Docker danach nicht in das Verzeichnis schreiben kann, weil das Verzeichnis dem Root-User gehört und der Container mit den Berechtigungen des Users abläuft, der ihn startet.
Statt ein Host-Verzeichnis zu mounten, können Sie auch von Docker ein Volume anlegen lassen, wenn Sie das Host-Verzeichnis beim Start weglassen, etwa so:

docker container run ... -v /var/log/nginx --name nginx-test ... 

Nun legt Docker für das Container-Verzeichnis ein eigenes Volume an, über das Sie mehr herausfinden, wenn Sie »docker container inspect nginx-test« eingeben. Die Ausgabe im JSON-Format ist etwas unübersichtlich, deshalb suchen Sie am besten nach dem String "volumes", der sich im Pfad befindet: »«

$ docker container inspect nginx-test | grep volumes
                "Source": "/var/lib/docker/volumes/c63ebdac27e29015f624975705a18267f95aa4785210326cf49a49fc2ac0131c/_data",

Über das Volume können Sie mit folgendem Aufruf mehr erfahren:

docker volume inspect c63ebdac27e29015f624975705a18267f95aa4785210326cf49a49fc2ac0131c

Jedenfalls theoretisch, denn praktisch steht da auch nicht viel mehr als der Pfad des Volumes.
Da auch das Volume nach dem Ende des Containers verschwindet, ist diese Methode nur eingeschränkt sinnvoll. Praktischer ist es, etwa mit »docker volume create weblog« ein Volume anzulegen, das auch nach dem Beenden erhalten bleibt. Sie verwenden es dann ähnlich wie ein normales Host-Directory, aber es genügt, den Volume-Namen anzugeben:

docker container run ... -v weblog:/var/log/nginx --name nginx-test ... 

Nun ist der Aufruf »docker volume inspect« auch sinnvoll, denn er verrät den Pfad zu dem aussagekräftigeren Namen. Analog zum Anlegen löschen Sie ein Volume wieder mit »docker volume rm« . Praktisch ist auch der Befehl »docker volume prune« , der alle nicht mehr von einem Container verwendeten Volumes löscht. Hier ist natürlich Vorsicht geboten, denn wenn man etwa wie in unserem Beispiel flüchtige Container verwendet, denkt das Docker-Tool zwar, die Volumes würden nicht mehr verwendet, aber eventuell werden sie doch noch gebraucht, etwa zur Auswertung der Logfiles.

Für den "Enterprise"-Einsatz arbeiten diverse Hersteller daran, über Plugins Backends für Docker bereizustellen, die direkt als Volumes verwendet werden können, etwa über iSCSI, NFS oder Fibre Channel. Unter dem Namen Flocker hat die Firma ClusterHQ außerdem einen "Data Volume Orchestrator" entwickelt, der das Volume-Management mit verschiedenen Backends wie Amazon EBS, Google, NetApp, EMC usw. ermöglicht. Die Firma hat mittlerweile den Betrieb eingestellt , aber Flocker gibt es weiterhin unter einer Open-Source-Lizenz. Unser Artikel " Dauerhaft gesichert " beschreibt, wie Sie etwa das verteilte Dateisystem GlusterFS als Docker-Storage verwenden.

Zum Abschluss nun noch ein etwas nützlicheres Beispiel, das zeigt, wie man einen Container des Continuous-Integration-Servers Jenkins installiert, der ebenfalls ein Docker-Volume zur Speicherung der Anwendungsdaten und Plugins verwendet. Zuerst holen Sie das Jenkins-Image aus dem Docker-Repository ("Docker Hub"): » «

docker pull jenkins

Legen Sie ein Verzeichnis wie »/var/lib/jenkins_data« an und übereignen Sie es an die User-ID 1000 (unter der Jenkins im Container läuft): »chown -R 1000 /var/lib/jenkins_data« .

Nun starten Sie den Container mit

docker run --rm --name jenkins -p 8080:8080 -v /var/lib/jenkins_data:/var/jenkins_home jenkins

Nun sehen Sie auf der Console, wie die Java-Anwendung entpackt und gestartet wird. Dort finden Sie auch das Admin-Passwort, mit dem Sie sich über den Webbrowser beim Jenkins-Frontend anmelden können. Wenn Sie nun dort neue Plugins und User anmelden, sind diese auch noch vorhanden, wenn Sie den Container beenden, löschen und einen neue starten, denn alle Daten werden im Host-Verzeichnis gespeichert. Mehr Informationen über die Verwendung des Jenkins-Image gibt die entsprechende Seite im Docker-Hub .

Die nächste Folge unseres Workshops erklärt, wie Sie selber Docker-Images herstellen und einsetzen.

comments powered by Disqus
Mehr zum Thema

Docker-Workshop (1): Installation, erste Schritte

Dies ist der erste Teil eines mehrteiligen Docker-Workshops. Wir erklären, was Docker ist, wofür es sich sinnvoll einsetzen lässt und wie Sie es verwenden. Außerdem erfahren Sie, was sich in der neuen Docker-Version 1.13 geändert hat.
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023