Docker-Volumes Verstehen und Einsetzen

Docker-Volumes spielen in Containeranwendungen eine entscheidende Rolle. Sie bieten einen Mechanismus zum Speichern, Verwalten und Zugreifen auf Daten innerhalb von Containern sowie zwischen Containern und dem Host-Computer. Docker-Volumes sind wichtig, um Daten über den Lebenszyklus eines Containers hinaus beizubehalten, Daten zwischen Containern auszutauschen und die Datenintegrität in zustandsbehafteten Anwendungen sicherzustellen.

Erstellen eines Docker-Volumes

Zum Erstellen eines Volumes verwenden wir den Befehl docker volume create oder nutzen dazu die Docker-Desktop UI:

docker volume create jberries_volume

Mit diesem Befehl wird ein neues Volume mit dem Namen jberries_volume erstellt. Der Name ist optional: Ist kein Name angegeben, dann wählt Docker einen zufälligen Namen für das Volume.

Mit docker volume list können wir uns eine Liste der bereits angelegten Volumes anzeigen und mit docker volume inspect die Details zu einem Volume abrufen:

$docker volume inspect jberries_volume
[
    {
        "CreatedAt": "2023-10-02T20:19:47Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/jberries_volume/_data",
        "Name": "jberries_volume",
        "Options": null,
        "Scope": "local"
    }
]

Auch wenn hier ein direkter Pfad unter "Mountpoint" ausgegeben wird: Die Daten des Volumes werden wir hier nicht finden. Zum Zugriff auf die Daten in dem Volume direkt von Host, nutzt man am einfachsten einen temporären Container:

docker run -it --rm -v jberries_volume:/volume_data ubuntu bash

Dieser Befehl startet einen temporären Ubuntu-Container und hängt das Volume /volume_data innerhalb des Containers ein.

Anonyme Volumes

Anonyme Volumes werden von Docker erstellt und bei der Erstellung an einen Container angehängt. Zum Beispiel beim Starten von MariaDB wird für /var/lib/mysql ein anonymes Volume erstellt. Möchte man stattdessen ein "named" Volume verwenden, so kann man das beim Starten des Containers spezifizieren:

docker run -d --name mydb \
  -e MYSQL_ROOT_PASSWORD=mysecretpassword \
  -v mariadb_data:/var/lib/mysql \
  mariadb:latest

Jetzt werden die MariaDB-Daten im benannten Volume mariadb_data gespeichert und sind von dem Lebenszyklus des Containers unabhängig.

Verwenden von Volumes in Containern

Nachdem wir Volumes erstellen können, müssen wir diese noch in einen Container mounten, um auf die Daten zugreifen zu können:

docker run -d --name test_container -v test_volume:/app irgendein_image

Mit -v test_volume:/app hängen wir das test_volume Volume in dem /app Verzeichnis in dem Container ein.

Wir können dasselbe Volume mit mehreren Containern verwenden und so Daten gemeinsam nutzen. Dazu müssen wir das Volume einfach in das gewünschte Verzeichnis in jedem Container mounten, und schon haben die Container Zugriff auf dieselben Daten.

Volumes Aufräumen

Um ein Docker-Volume zu entfernen, wenn es nicht mehr benötigt wird, können wir den folgenden Befehl verwenden:

docker volume rm jberries_volume

Dadurch wird das Volume und alle darauf gespeicherten Daten dauerhaft gelöscht.