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.