Backup-Strategie für Docker-Volumes - Daten sichern die im Container leben
Backup-Strategie für Docker-Volumes - Daten sichern die im Container leben
Container sind ephemer — die Daten darin sollten es nicht sein. Wer auf Backups von Docker-Volumes verzichtet, verliert bei einem Fehler alles.
Wo liegen Volume-Daten?
Named Volumes werden von Docker unter /var/lib/docker/volumes/ gespeichert:
# Volumes auflisten
docker volume ls
# Speicherort eines Volumes anzeigen
docker volume inspect mein-volume
# "Mountpoint": "/var/lib/docker/volumes/mein-volume/_data"
Man könnte dieses Verzeichnis direkt kopieren — aber nur wenn der Container gestoppt ist, sonst riskiert man inkonsistente Daten.
Methode 1: Backup-Container (laufend)
Das klassische Docker-Muster: einen temporären Container starten, der Volumes vom Quell-Container einbindet und ein Archiv erstellt.
# Backup erstellen (Container muss nicht gestoppt sein, aber konsistente Daten sind nicht garantiert)
docker run --rm \
--volumes-from mein-container \
-v $(pwd)/backups:/backup \
alpine \
tar czf /backup/backup-$(date +%Y%m%d-%H%M%S).tar.gz /data
--volumes-from bindet alle Volumes des genannten Containers ein. /data durch den tatsächlichen Datenpfad im Container ersetzen.
Für Datenbanken gilt: Nie rohe Dateien sichern während die DB läuft — immer einen Dump verwenden:
# PostgreSQL-Dump
docker exec mein-postgres pg_dumpall -U postgres | \
gzip > backups/postgres-$(date +%Y%m%d-%H%M%S).sql.gz
# MySQL-Dump
docker exec mein-mysql mysqldump -u root -p"$MYSQL_ROOT_PASSWORD" --all-databases | \
gzip > backups/mysql-$(date +%Y%m%d-%H%M%S).sql.gz
Methode 2: Stoppen, kopieren, starten
Für unkritische Systeme oder kurze Wartungsfenster:
docker stop mein-container
cp -r /var/lib/docker/volumes/mein-volume/_data /backup/mein-volume-$(date +%Y%m%d)
docker start mein-container
Einfach und zuverlässig — die Daten sind konsistent, weil kein Prozess darauf schreibt.
Methode 3: Restic oder BorgBackup
Für regelmäßige, deduplizierte Backups mit Retention-Policy bieten sich Tools wie Restic an:
# Backup des Volume-Verzeichnisses mit Restic
restic -r sftp:user@backupserver:/backups backup \
/var/lib/docker/volumes/mein-volume/_data \
--tag docker-volume
Restic dedupliziert, verschlüsselt und unterstützt S3, SFTP, B2 und mehr als Backup-Ziele.
Automatisierung mit Cron
# /etc/cron.d/docker-backup
0 2 * * * root docker exec mein-postgres pg_dumpall -U postgres | \
gzip > /backups/postgres-$(date +\%Y\%m\%d).sql.gz
Was zu beachten ist
- Backup testen: Ein nicht wiederherstellbares Backup ist kein Backup
- Backups off-site lagern: lokale Backups schützen nicht bei Festplattenausfall
- Für Datenbanken immer Dumps statt Raw-Dateien
- Retention-Policy definieren: wie lange werden Backups aufbewahrt?
Weiterführend
Die Backup-Skripte mit rsync, cron und tar die dahinterstecken sind klassische Linux-Themen — Hintergrundartikel dazu gibt es auf nolr.nexon.cyou.