Datenbank-Backups aus Docker-Containern automatisieren
Datenbank-Backups aus Docker-Containern automatisieren
Datenbank-Dumps aus laufenden Containern zu erstellen ist einfach — die Herausforderung ist, es zuverlässig zu automatisieren und die Backups sicher aufzubewahren.
Manueller Dump
PostgreSQL
# Einfacher SQL-Dump
docker exec postgres pg_dump -U postgres mydb > backup_$(date +%Y%m%d_%H%M).sql
# Komprimiert (empfohlen für große Datenbanken)
docker exec postgres pg_dump -U postgres mydb | gzip > backup_$(date +%Y%m%d_%H%M).sql.gz
# Alle Datenbanken
docker exec postgres pg_dumpall -U postgres | gzip > all_dbs_$(date +%Y%m%d_%H%M).sql.gz
MySQL / MariaDB
# Einzelne Datenbank
docker exec mysql mysqldump -u root -p"$MYSQL_ROOT_PASSWORD" mydb > backup_$(date +%Y%m%d_%H%M).sql
# Alle Datenbanken
docker exec mysql mysqldump -u root -p"$MYSQL_ROOT_PASSWORD" --all-databases > all_dbs_$(date +%Y%m%d_%H%M).sql
Automatisierung via Cron auf dem Host
# /etc/cron.d/docker-db-backup
0 2 * * * root docker exec postgres pg_dump -U postgres mydb | gzip > /backups/postgres/$(date +\%Y\%m\%d_\%H\%M).sql.gz
Dedizierter Backup-Container
Sauberer als Host-Cron: ein Container übernimmt das Backup-Management.
PostgreSQL mit prodrigestivill/postgres-backup-local
services:
postgres:
image: postgres:15
environment:
POSTGRES_PASSWORD: secret
volumes:
- postgres-data:/var/lib/postgresql/data
postgres-backup:
image: prodrigestivill/postgres-backup-local
restart: unless-stopped
environment:
POSTGRES_HOST: postgres
POSTGRES_DB: mydb
POSTGRES_USER: postgres
POSTGRES_PASSWORD: secret
SCHEDULE: "@daily"
BACKUP_KEEP_DAYS: 7
BACKUP_KEEP_WEEKS: 4
BACKUP_KEEP_MONTHS: 6
volumes:
- ./backups:/backups
depends_on:
- postgres
Der Container erstellt täglich einen Dump und löscht alte Backups nach konfigurierbarer Retention.
Backups off-site speichern
Lokale Backups schützen nicht vor Festplattenausfall oder Serververlust. Rclone kann Backups automatisch in die Cloud kopieren:
# Rclone konfigurieren (einmalig)
rclone config # → S3, Backblaze B2, Hetzner Storage Box, etc.
# Backup-Skript
#!/bin/bash
BACKUP_FILE="/backups/postgres_$(date +%Y%m%d_%H%M).sql.gz"
docker exec postgres pg_dump -U postgres mydb | gzip > "$BACKUP_FILE"
rclone copy "$BACKUP_FILE" remote:my-bucket/postgres/
# Lokale Datei nach Upload löschen (optional)
find /backups -name "*.sql.gz" -mtime +7 -delete
Restore testen
Ein Backup das sich nicht restoren lässt, ist wertlos:
# PostgreSQL Restore
gunzip -c backup_20240225.sql.gz | docker exec -i postgres psql -U postgres mydb
# MySQL Restore
gunzip -c backup_20240225.sql.gz | docker exec -i mysql mysql -u root -p"$MYSQL_ROOT_PASSWORD" mydb
Restore regelmäßig testen — mindestens monatlich in eine Test-Datenbank, und prüfen, ob die Daten konsistent sind.
Backup-Strategie (3-2-1-Regel)
- 3 Kopien der Daten
- 2 unterschiedliche Medien/Speicherorte
- 1 off-site Kopie
Für Docker-Umgebungen: lokaler Dump + Kopie auf Storage Box/S3 + monatlicher Restore-Test.
Zusammenfassung
Der einfachste Weg: docker exec + pg_dump/mysqldump per Cron auf dem Host. Der sauberste Weg: Backup-Container der sich selbst um Scheduling, Retention und Fehlerbehandlung kümmert. Das Wichtigste: Restores regelmäßig testen.