Docker | Datenbank Backups

Docker | Datenbank Backups
Photo by mohit suthar / Unsplash

Um von deinem Docker Host aus einen MariaDB-Dump eines Containers zu erstellen, gibt es mehrere Wege – je nachdem, ob du direkt mysqldump im Container ausführen möchtest oder über den Host auf die Datenbank zugreifst.
Hier die gängigsten Methoden:

🧩 Variante 1: Dump über docker exec (empfohlen)

Du führst mysqldump im Container aus, aber der Befehl läuft vom Host aus.

Beispiel:

docker exec -i <container_name_or_id> \
  mysqldump -u<db_user> -p<db_password> <database_name> > dump.sql

Beispiel mit echten Werten:

docker exec -i mariadb-container \
  mysqldump -uroot -psecret mydatabase > /home/user/dumps/mydatabase.sql

💡 Hinweis:

  • Es darf kein Leerzeichen zwischen -p und dem Passwort stehen.
  • Der Dump wird auf dem Host in die Datei dump.sql geschrieben.
  • Der Befehl mysqldump muss im Container installiert sein (bei offiziellen MariaDB-Images ist das standardmäßig so).

🧰 Variante 2: Dump direkt auf dem Host, wenn Port exposed ist

Wenn dein Container z. B. den Port 3306 nach außen mapped (-p 3306:3306), kannst du dich vom Host direkt verbinden:

mysqldump -h 127.0.0.1 -P 3306 -u<db_user> -p<db_password> <database_name> > dump.sql

✅ Vorteil: Kein docker exec nötig.
⚠️ Nachteil: Funktioniert nur, wenn der Port freigegeben ist und Verbindungen erlaubt sind.


🪣 Variante 3: Dump innerhalb des Containers und Datei herauskopieren

Wenn du lieber im Container selbst dumpst und dann die Datei auf den Host kopierst:

docker exec mariadb-container \
  sh -c 'mysqldump -uroot -psecret mydatabase > /tmp/mydump.sql'

Dann:

docker cp mariadb-container:/tmp/mydump.sql ./mydump.sql

und optional:

docker exec mariadb-container rm /tmp/mydump.sql

🧼 Optionale Kompression

Um den Dump gleich zu komprimieren:

docker exec -i mariadb-container \
  mysqldump -uroot -psecret mydatabase | gzip > mydatabase.sql.gz

Hier ist ein robustes Bash-Skript, das du vom Docker-Host aus laufen lassen kannst, um automatisch Dumps aus einem MariaDB-Container zu erstellen — mit Datum, Kompression und optionaler Rotation.

#!/bin/bash
#
# MariaDB Docker Dump Script
# ---------------------------
# Erstellt automatisiert einen Dump aus einem MariaDB-Docker-Container
# und speichert ihn komprimiert auf dem Host.
#
# Autor: Peter Lange // Lange-IT.com
# Datum: 2025-09-22
#

### === Konfiguration ===
CONTAINER_NAME="mariadb-container"     # Name oder ID deines MariaDB-Containers
DB_USER="root"                         # Datenbankbenutzer
DB_PASS="secret"                       # Passwort (ohne Leerzeichen nach -p!)
DB_NAME="mydatabase"                   # Datenbankname, oder --all-databases
BACKUP_DIR="/var/backups/mariadb"      # Lokales Backup-Verzeichnis
DATE=$(date +"%Y-%m-%d_%H-%M")
FILE_NAME="${DB_NAME}_${DATE}.sql.gz"  # Dump-Dateiname
KEEP_DAYS=7                            # Anzahl der Tage, alte Backups zu behalten

### === Sicherstellen, dass Backup-Verzeichnis existiert ===
mkdir -p "$BACKUP_DIR"

### === Dump erstellen ===
echo "📦 Erstelle Dump von '${DB_NAME}' aus Container '${CONTAINER_NAME}'..."

docker exec -i "$CONTAINER_NAME" \
  mysqldump -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" | gzip > "${BACKUP_DIR}/${FILE_NAME}"

if [ $? -eq 0 ]; then
  echo "✅ Dump erfolgreich erstellt: ${BACKUP_DIR}/${FILE_NAME}"
else
  echo "❌ Fehler beim Dump-Erstellen!" >&2
  exit 1
fi

### === Alte Backups löschen ===
echo "🧹 Entferne Backups, die älter als ${KEEP_DAYS} Tage sind..."
find "$BACKUP_DIR" -type f -name "*.sql.gz" -mtime +$KEEP_DAYS -exec rm -f {} \;

echo "🏁 Backup abgeschlossen."

🔧 Nutzung

  1. Speichern:
sudo nano /usr/local/bin/mariadb-dump.sh
  1. Ausführbar machen:
sudo chmod +x /usr/local/bin/mariadb-dump.sh
  1. Manuell testen:
/usr/local/bin/mariadb-dump.sh
  1. (Optional) Cronjob einrichten – z. B. täglich um 2 Uhr:
crontab -e
0 2 * * * /usr/local/bin/mariadb-dump.sh >> /var/log/mariadb-backup.log 2>&1

⚙️ Optionen

  • Wenn du alle Datenbanken sichern willst, ändere:
DB_NAME="--all-databases"
FILE_NAME="all_databases_${DATE}.sql.gz"

Viel Erfolg - Kein Backup? Kein Mitleid! 😄

Read more