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.