Skip to content

Backups von Docker Containern erstellen mit Ansible

Docker Container legen ihre persistenten Daten in sogenannten Volumes ab. Diese Daten sind in einer containerisierten Umgebung alles, was wir benötigen um einen Zustand zu einem definierten Zeitpunkt eines Containers wiederherzustellen oder um damit zum Beispiel eine Migration auf einen anderen Docker Host durchzuführen. Um das Backup für alle meine Container zu vereinfachen, habe ich ein Ansible Playbook geschrieben, dass alle Volumes zu allen definierten Containern in ein TAR packt und ablegt.

Das angesprochene Playbook könnt ihr in meinem Github Repository finden. Um es benutzen zu können, benötigt ihr eine Ansible Installation in der Version 2.10 oder höher. Grundlegend funktioniert es folgendermaßen. Ihr definiert eine Backup Lokation auf eurem Docker Host und eine Liste an Containern deren Volumes ihr gesichert haben wollt. Es wird je zu sicherndem Container ein “Hilfscontainer” gestartet, der sich die Volumes des originalen Containers einbindet. Dann wird ein komprimiertes Tape Archive (TAR) von allen Inhalten erstellt und in der Backup Lokation abgelegt.

Auf Wunsch wird das Playbook auch alle Sicherungen die älter sind als 14 Tage (konfigurierbar) löschen.

Alle Parameter sind entweder im Playbook oder als Extra-Variable definierbar. Ein simpler Aufruf sieht dann zum Beispiel so aus:

ansible-playbook -i hosts -e "HOSTS=myDockerHost" docker_backup.yml

Die Extra-Variable HOSTS gibt den Docker Host an, auf dem unsere Container laufen. Mit -i hosts verweisen wir auf unser Ansible Inventory. Wenn ihr die Liste der zu sichernden Container nicht im Playbook docker_backup.yml definieren wollt, könnt ihr das auch alternativ in einer separaten Textdatei tun und beim Aufruf darauf verweisen. Die Datei und der Aufruf könnten dann so aussehen:

container_list_to_backup:
- container_name: myShinyContainer1
- container_name: myShinyContainer2
ansible-playbook -i hosts -e "@container_list_to_backup.yml" -e "HOSTS=myDockerHost" docker_backup.yml

Das Ergebnis sieht dann in unserem Backup Ordner ungefähr so aus:

root@vmdocker:/docker/backup#  ls -ltr
-rw-r--r-- 1 root root 42802034 Dez 30 15:41 20211230T154115_backup_Uptime-Kuma__app_data.tar.gz
-rw-r--r-- 1 root root     4103 Dez 30 15:41 20211230T154115_backup_PGWatch__pgwatch2_persistent-config.tar.gz
-rw-r--r-- 1 root root      166 Dez 30 15:41 20211230T154115_backup_PGWatch__var_lib_grafana.tar.gz
-rw-r--r-- 1 root root 14590187 Dez 30 15:41 20211230T154115_backup_Heimdall__config.tar.gz
-rw-r--r-- 1 root root 49228884 Dez 30 15:41 20211230T154115_backup_Guacamole__config.tar.gz
-rw-r--r-- 1 root root      105 Dez 30 15:41 20211230T154115_backup_PGAdmin__pgadmin4_servers.json.tar.gz
-rw-r--r-- 1 root root 59441359 Dez 30 15:41 20211230T154115_backup_PGAdmin__var_lib_pgadmin.tar.gz

Bei jedem Aufruf wird nach erfolgter Sicherung, nach Sicherungen geschaut, die älter sind, als X Tage. Diese werden dann gelöscht.

Achtung: Es ist keine gute Idee, Datenbank-Volumes über dieses Verfahren zu sichern. Die Chance, dass wir damit einen unkonsistenten Zustand sichern und mit der Sicherung nichts anfangen können, sind zu groß.

Philip

Leave a Reply

Your email address will not be published. Required fields are marked *