Volumes und Mounts

Die Grundidee ist immer gleich: die Daten unserer Container - z.B. Webverzeichnis eines Webservers - müssen außerhalb vom Container gespeichert sein! Diese Ides bezeichnet man als Volumes.

Volumes und Bind Mounts

Volumes und Bind Mounts

Volumes lassen sich unter Docker als Mounts oder Docker Volumes nutzen und können unterschiedlich erstellt und gebunden sein.

Docker Volumes

Eine Übersicht in Kürze: Link docs.docker.com - Storage - Volumes)

Wie der Name schon andeutet kümmert sich hier die Docker Technik um die Verwaltung der gewünschten Datenspeicher.

Die Konfiguration und Verdrahtung der Volumes kennt unterschiedliche Herangehensweisen.

  • Mit dem Docker Befehl docker volume create ... werden Docker Volumes manuell erzeugt und dann über den Schalter -v den Docker Containern mitgeteilt.

  • Mit der Dockerfile Direktive Volume kann man nur Volumes innerhalb des Containers erzeugen!

    Link docs.docker.com Reference Builder Volume

  • Beim create oder run für den Container kann man Mount-Points mit Parameter --mount spezifizieren.

    Link docs.docker.com - Reference run - Volume mounts and Bind mounts

  • Mit der Docker Compose Direktive volumes:

    In der docker-compose.yml werden echte Docker Volumes erzeugt und (persistent) nutzbar gemacht.

Nur echte Docker Volumes lassen sich mit docker volume ls auflisten - die Mounts sind hier nicht aufgelistet!

Die Volumes lassen sich wieder mit docker volume inspect ... analysieren.

Die Volumes werden beim Löschen von Containern nicht mitgelöscht, was ja auch ganz im Sinne der technischen Nutzung ist (siehe Container als Wegwerfware bzw. Aktualisierung von Containern).

Verzeichnis für Volumes (bei Linux): /var/lib/docker/volumes

Hinweis zu Docker Compose

Wenn man mit docker-compose Container genutzt hat und dann beim docker-compose down noch den Schalter -v anhängt werden automatisch alle Volumes der docker-compose.yml gelöscht.

Backup für Volumes

Am Besten nutzen wir Docker Technik mit einem sehr einfachen Image in dessen Container wir das zu sichernde Volume und einen lokalen Ordner für das Sicherungsarchiv verdrahten.

Man sollte zuvor die Zugriffe auf das Volume stoppen.

docker run --rm \
   -v "$VOLUME_NAME":/backup-volume \
   -v "$(pwd)":/backup \
   busybox \
   tar -zcvf /backup/my-backup.tar.gz /backup-volume

Und dafür - und die Restores - haben sich diverse Skripte im Netz angesammelt.

Beispiel: GitHub Repo BretFischer/docker-vackup

Volumes beim Docker Desktop für Windows

Die Analyse von Docker Volumes bei Nutzung von Docker Desktop für Windows ist nach ganz so einfach, da die Verdrahtung der Docker Volumes im Windows WSL2 Subsystem manchmal mehr Analyse verlangt um die Ordnerstruktur für die Volumes zu finden.

Beispiel eines Standard Docker Volume für eine Portainer Datenstruktur unter Linux:

/var/lib/docker/volumes/portainer_data/_data/ (Volume: portainer_data)

Dasselbe Portainer Volume portainer_data auf einem Docker Desktop für Windows Volume:

\\wsl.localhost\docker-desktop-data\data\docker\volumes\portainer_data\_data

Trick für Docker Desktop für Windows mit WSL2:

Einhängen (hier Debian WSL2 Machine) mit einem Docker Container basierend auf Debian Image: (nsenter ruft Shell sh in anderem Namensraum auf)

docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -i sh

Jetzt lässt sich eine Volume Technik direkt mit dem Standardpfad /val/lib/docker/volumes/... aufrufen!

Bind Mounts

Eine Übersicht in Kürze: Bind Mounts (Link docs.docker.com - Storage - Bind Mounts)

Die Daten liegen außerhalb des Container in der Verzeichnisstruktur des Docker Hosts - z.B. -v /var/dc-test-www:/var/www/html.

Der Parameter -v kündigt die Zuweisung an. Links vom : ist das lokale Verzeichnis /var/dc-test-www und rechts der Standardordner /var/www/html des Containerservice (hier Webserver Apache2) zu finden.