Auto-Backup für Docker Volumes

Ein Backup für meine Docker Volumes. Eigentlich keine große Sache – ich kopiere einfach die zugehörigen Files auf dem Docker Host. Oder? Ist es wirklich geschickt, „durch die Hintertür“ an die Dateien zu gelangen? Docker Volumes werden komplett von Docker verwaltet – hat ein Fremdzugriff eventuell Nebenwirkungen? Könnten sich Ablageort und Struktur in kommenden Dockerversionen verändern? Und wie verträgt sich das mit Docker volume plugins?

Volumes: Created and managed by Docker. […] A given volume can be mounted into multiple containers simultaneously. When no running container is using a volume, the volume is still available to Docker and is not removed automatically.

Docker Volumes können von verschiedenen Containern gleichzeitig genutzt werden. Während ein Container fleißig Dateien erstellt, könnte ein zweiter Container auf diese Daten zugreifen und ein Backup anfertigen.

 
Schaubild

 
Parallel zu Container A wird ein zweiter Container B gestartet und mit dem „Data Volume“ verbunden. Über Container B wird das Backup erstellt und auf dem „Backup Volume“ abgelegt. Durch das „bind mount“ landet das Archiv automatisch im „File System“ des Servers.

 

Volume Backup mit TAR

Für Container B starte ich ein Alpine Linux. Der Inhalt von data_volume wird mit tar in das File /backup_path/archiv.tar archiviert:

$ docker run -it -v data_volume:/data_path -v /backup_volume:/backup_path alpine tar -cf /backup_path/archiv.tar -C /data_path ./

Zum Wiederherstellen des Backups werden zunächst die Inhalte des data_volume gelöscht. Im Anschluss werden die Files aus dem Archiv /backup_path/archiv.tar auf das data_volume extrahiert:

$ docker run -it -v data_volume:/data_path -v /backup_volume:/backup_path alpine sh -c "rm -rf /volume/* /volume/..?* /volume/.[!.]* ; tar -C /data_path/ -xf /backup_path/archiv.tar"

Vorsicht: Container A sollte währenddessen besser gestoppt werden.

 

Docker Image für Backup / Restore

Nicht besonders handlich aber mit wenig Aufwand läßt sich daraus ein Docker-Image basteln => hier liegen die Sourcen. Jetzt ist die Bedienung schon etwas komfortabler.

Backup:

$ docker run -v [volume-name]:/volume -v [output-dir]:/backup --rm scorb/docker-volume-backup backup [archive-name]

Restore:

$ docker run -v [volume-name]:/volume -v [input-dir]:/backup --rm scorb/docker-volume-backup restore [archive-name]

 

Auto-Backup mit Cronjob

Damit lässt sich auf einem Linux System schnell ein automatisches Backup einrichten. Über einen Cronjob könnte z.B. regelmäßig ein Skript aufgerufen werden. Das Skript startet den Backup-Container, der Container erzeugt das Backup:

#!/usr/bin/env bash
timestamp="$(date +"%Y%m%d_%H%M%S")"
docker run -v data_volume:/volume -v /backup:/backup --rm scorb/docker-volume-backup backup $timestamp"_data_volume_backup"

 


 

Quellen

“Docker docs – Manage application data: Storage overview”, v17.12
“Jarek Lipski – Backup & Restore Docker Named Volumes”, 15.01.2017