Docker | Datenbank Backups
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
-pund dem Passwort stehen. - Der Dump wird auf dem Host in die Datei
dump.sqlgeschrieben. - Der Befehl
mysqldumpmuss 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
- Speichern:
sudo nano /usr/local/bin/mariadb-dump.sh
- Ausführbar machen:
sudo chmod +x /usr/local/bin/mariadb-dump.sh
- Manuell testen:
/usr/local/bin/mariadb-dump.sh
- (Optional) Cronjob einrichten – z. B. täglich um 2 Uhr:
crontab -e0 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! 😄