Zum Hauptinhalt springen
Self-Hosting & Privatsphäre

Docker Compose Volumes und Backups erklärt

Ich führte docker compose down -v aus, um einen Stack aus Gewohnheit sauber neu zu starten. Hier war das Flag nicht harmlos — es löschte ein benanntes Volume samt den Containern.

milanbuha0021. August 20266 Min. LesezeitRead in English
TeilenXin
Docker Compose Volumes und Backups erklärt

Ich führte docker compose down -v aus, um einen Stack aus Gewohnheit sauber neu zu starten — eine Angewohnheit aus einem anderen Projekt, in dem dieses Flag harmlos war. Hier war es das nicht. Das -v löschte das benannte Volume des Stacks zusammen mit den Containern, und für rund dreißig Sekunden, bevor die restic-Wiederherstellung fertig war, wusste ich schlicht nicht, ob ein Jahr an Vaultwarden-Einträgen überhaupt noch irgendwo existierte.

TL;DR

  • Ein einfaches docker compose down entfernt Container und das Standardnetzwerk — benannte Volumes bleiben unangetastet.
  • Wird -v hinzugefügt, löscht Compose zusätzlich jedes benannte Volume, das in dieser Compose-Datei deklariert ist. Es gibt keine Sicherheitsabfrage.
  • Bind Mounts binden einen bestimmten Host-Ordner in einen Container ein; sichern Sie sie, indem Sie ein Backup-Tool direkt auf diesen Ordner zeigen lassen.
  • Benannte Volumes liegen unter Dockers eigenem Speicherpfad; sichern Sie sie über einen Hilfscontainer, und nutzen Sie für laufende Datenbanken deren eigenes Dump-Tool, niemals eine rohe Dateikopie.
  • Die richtige Storage-Art ist eine Entscheidung pro Dienst, kein projektweiter Standard.

KEY-STAT: 30 — Sekunden zwischen dem versehentlichen docker compose down -v und der Gewissheit, ob die restic-Wiederherstellung wirklich funktioniert hatte

Der Beinahe-Unfall: was docker compose down -v wirklich löscht

Ein einfaches docker compose down stoppt und entfernt die Container des Stacks sowie sein Standardnetzwerk — alles, was in einem benannten Volume liegt, bleibt unberührt, weil Docker Speicher nicht einfach mal so löscht. Fügen Sie -v (oder --volumes) hinzu, entfernt Compose zusätzlich jedes benannte Volume, das in dieser Compose-Datei deklariert ist, sofort und ohne Rückfrage. Es fragt nicht, welches Volume gemeint ist, und unterscheidet nicht zwischen "das war Absicht" und "das Flag stammte noch aus einem anderen Terminal-Verlauf". Ich hatte ein restic-Backup, und die Wiederherstellung funktionierte — aber die dreißig Sekunden zwischen dem Ausführen des Befehls und der Bestätigung machten den Unterschied zwischen einer Anekdote und einem echten Datenverlust-Vorfall.

Bind Mounts vs. benannte Volumes in einer Tabelle

Bind MountBenanntes Volume
SpeicherortEin bestimmter, selbst gewählter Ordner auf dem HostVon Docker verwaltet, unter dessen eigenem Speicherpfad
Sichtbarkeit auf dem HostDirekt — jederzeit per ls einsehbarIndirekt — nur über docker volume-Befehle prüfbar
Portabilität zwischen HostsAn genau diesen Host-Pfad gebundenPortabler; die App macht keine Annahmen über das Host-Layout
Backup-MethodeEin Backup-Tool direkt auf den Ordner zeigen lassenBraucht einen Hilfscontainer oder das eigene Export-Tool der App
Typischer Einsatz hierConfigs, Medien, alles direkt gesicherteDatenbank-Engine-Daten (Postgres, MariaDB)

Bind Mounts: ein Host-Ordner als Speicher eines Containers

Ein Bind Mount ist eine direkte Verbindung von einem Host-Pfad zu einem Container-Pfad — ./vw-data:/data bindet den Ordner vw-data, der neben der Compose-Datei liegt, direkt in den Container ein. Weil es ein echter, sichtbarer Ordner auf dem Host ist, funktioniert jedes Backup-Tool, das bereits weiß, wie man ein Verzeichnis sichert — restic, rsync, ein NAS-Sync-Job — ohne jede container-spezifische Logik darauf. Genau deshalb liegen Configs und Medien in diesem Homelab auf Bind Mounts: Der Backup-Schritt muss nicht einmal wissen, dass Docker existiert.

Benannte Volumes: von Docker verwalteter Speicher

Ein benanntes Volume — einmal unter dem obersten volumes:-Schlüssel einer Compose-Datei deklariert und über seinen Namen referenziert — liegt unter Dockers eigenem Speicherpfad (/var/lib/docker/volumes/ unter Linux) statt an einem selbst gewählten Pfad. Diese Indirektion ist ein Feature für alles, das keine Annahmen über den Host machen sollte: Eine Datenbank-Engine verwaltet ihr eigenes Datei-Layout innerhalb dieses Volumes und kümmert sich nicht darum, wo Docker es physisch ablegt. Der Preis dafür ist, dass eine Sicherung keine simple Ordnerkopie ist — sie braucht entweder einen Hilfscontainer oder das eigene Export-Tool der Datenbank.

Die tatsächliche Storage-Wahl dieses Homelabs, Dienst für Dienst

DienstSpeicherartWarum
Vaultwarden (/data)Bind MountDas Backup-Ziel für restic muss ein einfacher Ordner sein, kein von Docker verwalteter Pfad
Caddy-Konfiguration und ZertifikateBind MountWird oft genug von Hand bearbeitet, dass direkter Host-Zugriff zählt
Jellyfin-MedienbibliothekBind Mount auf bestehenden NAS-SpeicherDer Raspberry-Pi-NAS besitzt diesen Speicher bereits; Jellyfin zeigt einfach darauf
Postgres-DatenverzeichnisBenanntes VolumeDatenbankdateien sollten nicht live roh kopiert werden; sichern Sie mit pg_dump, nicht mit einer Ordnerkopie

Vollständige Details zum Bind-Mount-Aufbau von Vaultwarden finden Sie im Vaultwarden-Selbsthosting-Guide.

Einen Bind Mount sichern

Kein Container nötig — das Backup-Tool zeigt direkt auf den Ordner:

restic backup ./vw-data --tag vaultwarden

Ein benanntes Volume korrekt sichern

Für ein benanntes Volume mit reinen Dateien (keine laufende Datenbank) übernimmt ein kurzlebiger Hilfscontainer, der sowohl das Volume als auch einen Host-Ordner einbindet, das Archivieren:

docker run --rm \
  -v vw_internal_data:/source:ro \
  -v "$(pwd)/backup":/backup \
  alpine tar czf /backup/volume-backup.tar.gz -C /source .

Warning

Dieses Muster ist für statische Dateien in Ordnung, aber ein rohes tar-Archiv des benannten Volumes einer laufenden Datenbank kann sie mitten im Schreibvorgang erwischen und ein Backup erzeugen, das gut aussieht, sich aber nicht wiederherstellen lässt. Nutzen Sie für Postgres oder MariaDB das eigene Dump-Tool der Engine gegen den laufenden Container — docker compose exec postgres pg_dump -U user dbname > backup.sql — niemals eine dateibasierte Kopie des Volumes einer laufenden Datenbank.

Tip

Egal welche Methode Sie nutzen, stellen Sie sie mindestens einmal an einem Wegwerf-Ort wieder her und prüfen Sie, ob die Daten wirklich da sind. Ein Backup, das nie wiederhergestellt wurde, ist eine Hoffnung, kein Backup — genau diese Prüfung machte beim down -v-Beinahe-Unfall oben den Unterschied.

Entscheidungshilfe: Bind Mount oder benanntes Volume?

DiensttypEmpfehlungWarum
Konfigurationsdateien, Zertifikate, alles von Hand BearbeiteteBind MountDirekter Host-Zugriff; einfache Ordner-Sicherung
Medienbibliotheken und bereits vorhandener NAS-SpeicherBind MountZeigt auf Speicher, der schon außerhalb von Docker existiert
Datenbank-Engine-Daten (Postgres, MariaDB, Redis-Persistenz)Benanntes Volume + das eigene Dump-Tool der EngineVermeidet das Korruptionsrisiko einer rohen Kopie live laufender Daten
App-Daten ohne laufende Schreibvorgänge (statischer App-Zustand)Beides möglich — Bind Mount für direkte SichtbarkeitEin benanntes Volume geht ebenso gut; das Risiko betrifft speziell laufende Datenbanken

Die Storage-Wahl ist unabhängig von der Restart-Policy des Dienstes — siehe den Restart-Policies-Guide — und unabhängig davon, welchem Netzwerk er beitritt, behandelt im Docker-Compose-Netzwerke-Guide. Alle drei sind separate, pro Dienst getroffene Entscheidungen, kein globaler Standard für den ganzen Stack.

Fazit

Legen Sie Configs und Medien auf Bind Mounts, damit jedes generische Backup-Tool sie direkt erreicht. Legen Sie laufende Datenbankdaten auf benannte Volumes und sichern Sie sie mit dem eigenen Tool der Datenbank, nie mit einer rohen Kopie. Stellen Sie dann tatsächlich einmal ein Backup wieder her, bevor docker compose down -v diese Aufgabe ungefragt für Sie übernimmt.

Häufig gestellte Fragen

Löscht docker compose down Volumes?

Nein, nicht standardmäßig. Ein einfaches docker compose down entfernt Container und das Standardnetzwerk, lässt benannte Volumes aber unangetastet. Erst das zusätzliche Flag -v (oder --volumes) löscht die in dieser Compose-Datei deklarierten benannten Volumes.

Was ist der Unterschied zwischen einem Bind Mount und einem benannten Volume?

Ein Bind Mount bindet einen selbst gewählten Ordner auf dem Host in den Container ein, sodass Sie ihn direkt durchsuchen und sichern können. Ein benanntes Volume ist Speicher, den Docker selbst unter seinem eigenen Pfad verwaltet — besser isoliert von Host-Pfad-Annahmen, aber für die Sicherung auf einen Hilfscontainer oder das eigene Tool der App angewiesen.

Wie sichert man ein benanntes Docker-Volume?

Führen Sie einen kurzlebigen Container aus, der das benannte Volume schreibgeschützt zusammen mit einem Host-Backup-Ordner einbindet, und archivieren Sie den Inhalt des Volumes dann mit tar. Für eine laufende Datenbank nutzen Sie stattdessen das eigene Export-Tool der Engine (pg_dump, mysqldump) statt einer rohen Dateikopie.

Ist es sicher, das Docker-Volume einer Datenbank direkt für ein Backup zu kopieren?

Nicht, während die Datenbank läuft. Eine rohe Kopie der Dateien einer laufenden Datenbank kann sie mitten im Schreibvorgang erwischen und ein Backup erzeugen, das vollständig wirkt, sich aber nicht sauber wiederherstellen lässt. Nutzen Sie stattdessen das eigene Dump-Tool der Datenbank-Engine gegen den laufenden Container.

Ähnliche Artikel

Mehr aus Self-Hosting & Privatsphäre

Bleiben Sie auf dem Laufenden

Erhalten Sie die neuesten Artikel direkt in Ihr Postfach. Kein Spam, jederzeit abbestellbar.

Als Nächstes lesen

Raspberry Pi Server: Was können Sie hosten?

Ein übrig gebliebener Pi und ein Dutzend widersprüchlicher Anleitungen -- hier ist die Übersicht. Getestete Grenzwerte für sechs Pi-Projekte: NAS-Durchsatz, Minecraft-Spielerzahl, Kamera-Speicherbedarf, Retro-Gaming, Cluster-Leistung und Fernzugriff, plus wann sich ein Mini-PC eher lohnt.

Weiterlesen