Betreibt man MySQL als Docker Container, hat man zwar alle Daten in einem persistenten Ordner, jedoch ist es keine gute Idee diese im laufenden Betrieb zu sichern. Ein Backup-Skript erledigt diesen Job zuverlässig.

Backup aller MySQL-Datenbanken von außerhalb des Docker Containers

Das folgende MySQL Backup-Skript läuft ausserhalb des Docker Containers und steuert die Datensicherung über Aufrufe der entsprechenden Befehle im Docker-Container. Alle Datenbanken werden einzeln komprimiert gesichert. Jede tägliche Sicherung hat einen eigenen Ordner. Nach 7 Tagen werden ältere Sicherungen automatisch gelöscht:

Die Konfiguration wird über folgende Variablen gesteuert:

  • HOLD_DAYS: Die Haltezeit der Datensicherung in Tagen
  • BACKUP_DIR: Der Zielordner für alle Sicherungen
  • MYSQL_USR, MYSQL_PWD: Der MySQL Root-User und dessen Passwort
  • CONTAINER: Der Name des Docker Containers
  • MYSQL_CMD, _DMP und _CHECK: Die Systembefehle zum Überprüfen und Sichern der Datenbanken

Nach Aufruf des Skripts befindet sich die aktuelle Datensicherung im Pfad ./backup.

MySQL-Backup direkt aus dem Docker-Container heraus

Betreibt man Docker unter Windows, lässt sich das Bash-Script leider nur umständlich über WSL oder andere Unix-Umgebungen aufrufen. Viel eleganter ist es, das MySQL Backup-Script in den Docker-Container zu packen und in dessen Linux-Umgebung zu integrieren. Das folgende Beispiel basiert auf dem Bitnami MySQL Image und Docker Compose.

Zuerst modifizieren wir das MySQL Backup-Skript, indem wir die Setup-Sequenz durch diesen Code austauschen:

Ausser HOLD_DAYS sollte keine der Variablen angepasst werden. BACKUP_DIR zeigt auf einen Ordner, der später auf einen persistenten Ordner ausserhalb des Containers gemapped wird. MYSQL_PWD holt sich das aktuelle Root-Passwort direkt aus den Umgebungsvariablen des Containers. Die zum Backup benötigten System-Kommandos sind auf die Pfade des Bitnami Docker Images angepasst.

Das Skript speichern wir im folgenden Pfad: ./resources/bin/backup-mysql.sh.

Das neue Image wird dann über das folgende Dockerfile zusammengebaut:

Danach starten wir den Build mit

Nun ergänzen wir unseren Eintrag in der Datei docker-compose.yml mit dem Pfad-Mapping auf /backup (letzte Zeile). Die Zeile mit „build:“ verweist auf den Ordner mit unserem modifizierten Dockerfile.

./docker/mysql/backup ist hierbei unser lokaler Pfad, außerhalb des Docker-Containers und frei wählbar. In diesem Ordner werden dann alle Backups erzeugt.

Die Datensicherung der MySQL-Datenbanken wird dann von außerhalb des Docker Containers über den folgenden Befehl angestossen:

dstack-mysql ist der Name des Containers. Der Pfad zum Backup-Script darf hier nicht geändert werden, da er container-intern ist.

Nach Aufruf des Skripts befindet sich die aktuelle Datensicherung im Pfad ./docker/mysql/backup:/backup.