kalafoto - stock.adobe.com
Containersicherung mit Skripten und Tools
Bei Containerinfrastrukturen ist es notwendig besonders Sorgfalt bei der Sicherung einzuhalten, ansonsten besteht die Gefahr von Datenverlust. Der Beitrag zeigt was wichtig ist.
Im Gegensatz zu herkömmlichen physischen oder virtuellen Servern bleiben die Daten von Containern bei einem Neustart nicht automatisch erhalten. Daher sollten sich Admins umfassende Gedanken machen, wie sie die Daten von Containern sichern, damit sich diese jederzeit wiederherstellen lassen. In Docker gibt es kein Bordmittel, um Daten von Containern zu sichern. Um Backups von Daten in Container-Umgebungen durchzuführen, sind daher Zusatz-Tools oder Skripte notwendig.
Container sichern und danach in das Server-Backup einbinden
Container werden auf virtuellen oder physischen Container-Hosts betrieben. Neben der Sicherung dieser Hosts, sollte auch darauf geachtet werden, dass die Daten der Container gesichert sind. Startet der Host neu, gilt das auch für die darauf betriebenen Container. Dabei kommt es zu Datenverlust, wenn keine Sicherungsinfrastruktur dafür hinterlegt ist. Mit Skripten und Zusatz-Tools ist es zum Beispiel möglich die Daten von Containern auf dem Host zu archivieren, oder auch auf Speicherplätze in Netzwerken zu kopieren. Danach erfolgt die Sicherung dieser Daten mit einer herkömmlichen Server-Sicherung.
Beim Backup von Daten in Docker-Umgebungen kommen häufig Skripte zum Einsatz. Beispiele für solche Skripte sind auf GitHub zu finden. In dem Repository gibt es verschiedene Skripte, mit denen sich Daten von Docker-Volumes, aus Datenbanken oder auch andere Container-Dateien sichern lassen. Der Entwickler bietet für jedes Skript eine kleine Hilfe. In komplexeren Umgebungen ist es sinnvoll, die Skripte an die eigenen Anforderungen anzupassen. Auf der Seite sind auch Skripte zu finden, mit denen sich Daten aus Datenbanken sichern lassen, die wiederum in Containern laufen.
Diese Daten sollten in Containern gesichert werden
Neben der obligatorischen Datensicherung von Docker-Volumes, sollten Admins natürlich auch die anderen Daten von Containern sichern. Besonders wichtig sind an dieser Stelle zum Beispiel die Datei docker-compose.yml, also die Docker-Compose-Datei. Auch die *.ENV-Dateien sollten ins Backup integriert werden, um den Container selbst jederzeit wiederherstellen zu können. Werden in einem Container weitere, individuelle Konfigurationsdateien bereitgestellt, sollten diese ebenfalls in die Sicherung eingebunden sein.
Selbstverständlich sollte der Docker-Container selbst und auch dessen Image ein Backup erfahren. Diese Daten sollten außerdem jederzeit wiederhergestellt werden können. Es ist sinnvoll die Wiederherstellung regelmäßig zu testen, da diese nicht genauso abläuft, wie auf Servern oder herkömmlichen Workloads. Hier ist etwas Übung notwendig, um schnell und effektiv Container wiederherzustellen und auch die Daten der Container jederzeit wiederherstellen zu können.
Kommen mit Docker weitere Lösungen zum Einsatz, zum Beispiel das Open-Source-Verwaltungs-Tool Portainer, dann sollten diese Daten natürlich ebenfalls gesichert werden.
Zu sichernde Daten auf Container-Hosts anzeigen
Die persistenten Daten von Containern liegen im Fall von Docker in den bereits erwähnten Docker-Volumes. Diese stellen die Schnittstelle zwischen dem laufenden Container und dem Host-System dar. Während die Daten innerhalb des Containers flüchtig sind, stellt das Docker-Volume sicher, dass die Daten auf dem Host-System gespeichert bleiben, wenn der Container neu startet.
Welche Volumes es auf einem Container-Host gibt, lässt sich mit dem Befehl docker volume ls feststellen. Diese Daten sollten in jedem Fall gesichert werden, um Datenverlust in den Containern zu verhindern. Welche Container auf einem Host laufen, lässt sich wiederum mit docker ps in Erfahrung bringen.
Diese beiden Befehle zeigen auf die Schnelle, welche Daten auf einem Container mindestens gesichert werden sollten. Sind die Container-Images nicht ohnehin bereits gesichert, sollte auch das manuell durchgeführt werden. Die gespeicherten Images der Container können mit docker images ls angezeigt werden.
Um einen Container selbst zu sichern, also die Konfiguration und weitere Einstellungen, kann es sinnvoll sein diesen als Image zu sichern und danach die Image-Datei in die herkömmliche Datensicherung einzubinden. Ein Beispiel dafür ist:
docker container commit <Container-ID> <Backup-Bezeichnung>
Die Images selbst lassen sich wiederum mit TAR exportieren:
docker image save <Docker-Image-Name> --output <TAR-Datei>
Diese TAR-Dateien lasen sich jetzt in die Sicherung mit einbinden. eine Alternative ist das direkte Pushen von Container-Images in eigene Backup-Repositories, zum Beispiel mit docker image push. Um einen Container wiederherzustellen, kommt docker image load zum Einsatz. Damit lassen sich als TAR-Datei erstellte Images einlesen, zum Beispiel mit:
docker image load --input cabot-image-backup.tar
Das Image ist auf dem Host jetzt verfügbar und der Container kann mit diesem Image über docker run gestartet werden, wie bei der Neuerstellung auch.
Daten auf Container-Hosts mit Skript sichern
Auf Linux-Hosts lassen sich die Daten zum Beispiel mit tar oder gzip sichern. Ein Beispiel für TAR sieht folgendermaßen aus:
tar -cvf <Pfad>.tar <Pfad>
Die TAR-Dateien sollten danach mit einer herkömmlichen Sicherungslösung erfasst werden, damit bei Ausfall eines Hosts die gesicherten Container-Daten erhalten bleiben.
Allerdings sind hier eigene Skripte notwendig, oder es kommen vorgefertigte Skripte zum Einsatz, die in den meisten Fällen aber noch angepasst werden sollten. Ein Beispiel für die Sicherung von Volumes sieht folgendermaßen aus:
mkdir -p /backup/volumes/
docker run --rm \
-v /backup/volumes:/backup \
-v test-data:/data:ro \
debian:stretch-slim bash -c "cd /data && /bin/tar -czvf /backup/test-data.tar.gz ."
Wiederherstellen lassen sich die Daten dann wieder mit:
docker run --rm \
-v /backup/volumes:/backup \
-v test-data:/data \
debian:stretch-slim bash -c "cd /data && /bin/tar -xzvf /backup/test-data.tar.gz"
Beispiele für die Sicherung von Datenbanken und andere Daten sind auf der Seite des Entwicklers der Sicherungs-Skripte für Docker zu finden. Ein Skript, das zunächst alle Container und Images einliest und dann sichert, kann folgendermaßen aussehen:
#!/bin/bash
# Setzt den Pfad für das Backup-Verzeichnis
backup_dir="./Backup"
# Erstellt das Backup-Verzeichnis, falls es nicht existiert
mkdir -p "$backup_dir"
# Auslesen und Sichern aller Docker-Container
docker ps -a --format '{{.Names}}' | while read container; do
docker export "$container" > "$backup_dir/$container.tar"
done
# Auslesen und Sichern aller Docker-Images
docker images -a --format '{{.Repository}}:{{.Tag}}' | while read image; do
image_file=$(echo "$image" | sed 's/[^a-zA-Z0-9]/_/g')
docker save "$image" > "$backup_dir/$image_file.tar"
done
# Auslesen und Sichern aller Docker-Volumes
docker volume ls -q | while read volume; do
docker run --rm -v "$volume:/data" -v "$backup_dir:/backup" busybox tar cvf "/backup/$volume.tar" /data
done