Meine Güte ist die Containertechnologie verbreitet und besonders Docker, doch was ist mit dem Thema Backup? Bei den Heimanwendern glaube ich Applikation Nr. 1 geworden. Doch was ist mit unseren Daten welche die Container produzieren. Wir wissen ja bereits das Container flüchtig sind und Ihre Daten zunächst nur Lokal in Docker Volumes oder in Mount Pfaden ablegen.
Selbst dann sind die Daten erstmal nur auf dem Host System, aber gesichert sind diese noch lange nicht. Also was sollte man tun? Bestenfalls sollten diese Daten auf ein weiteres System kopiert werden, welches fern ab von diesem Host ist.
Das Script was ich euch nun zeige könnt Ihr selber mit euren Variablen einstellen und konfigurieren. Es erstellt auf dem Docker Host System von dem Ordner /var/lib/docker/volumes ein gepacketes tar.gz file. Kopiert anschließend mittels SCP das frisch erstelle Backup auf ein zweites Zielsystem. Zur Sicherheit werden direkt über das Script alle Docker Container gestoppt und anschließend wieder gestartet.
Die Docker Container werden kurzzeitig gestoppt um eine saubere Datenkonsistenz zu schaffen. Zum Beispiel Datenbanken werden so sauberer gespeichert.
Docker Volume Backup Script – #BASH
SSH-Key Kopieren auf Zielsystem
Damit das Script auch ohne Benutzereingaben läuft, muss der Public Key vom Hauptsystem auf das Zielsystem kopiert werden. Damit ist dann auch eine Passwortlose-Anmeldung möglich. Also zunächst ein Keypärchen erstellen und dann den Public Key kopieren.
## Auf dem Hauptsystem ausführen, nicht dem Backup Ziel ## ssh-keygen -t rsa ssh-copy-id root@<IP-ZIELSYSTEM>
Wenn du den Passwortlosen-Login testen möchtest gebe folgendes in die CLI ein
ssh root@<IP-ZIELSYSTEM>
Das Docker Volume Backup Script
Passe die oben stehenden Variablen an deine Umgebung an und teste das Script mit nachstehenden Befehlen.
#!/bin/bash # # # # # # # # # # # # # # # # # # # # # # # # # Konfiguration # # # # # # # # # # # # # # # # # # # # # # # # # # Verzeichnis, das gesichert werden soll source_dir="/var/lib/docker/volumes" # Verzeichnis, in dem die Backups gespeichert werden sollen backup_dir="/opt/docker_backups" # Anzahl der zu behaltenden Backups keep_backups=10 # Aktuelles Datum und Uhrzeit current_datetime=$(date +"%Y-%m-%d_%H-%M-%S") # Name für das Backup-Archiv backup_filename="${current_datetime}-backup.tar" # Zielserver-Informationen remote_user="root" remote_server="192.168.40.50" remote_dir="/opt/docker_backups" # # # # # # # # # # # # # # # # # # # # # # # # # Ende der Konfiguration # # # # # # # # # # # # # # # # # # # # # # # # # remote_target="${remote_user}@${remote_server}" backup_fullpath="${backup_dir}/${backup_filename}" # Docker-Container herunterfahren docker stop $(docker ps -q) # Erstelle das Backup-Archiv tar -cpf "${backup_fullpath}" "${source_dir}" # Docker-Container wieder starten docker start $(docker ps -a -q) # Komprimiere das Backup-Archiv gzip "${backup_fullpath}" backup_fullpath="${backup_fullpath}.gz" # Kopiere das Backup auf den Zielserver mit SCP ohne Passwort scp "${backup_fullpath}" "${remote_target}:$remote_dir/" # Lösche ältere lokale Backups mit `find` find "$backup_dir" -type f -name "*-backup.tar.gz" -mtime +$keep_backups -exec rm {} \; # Lösche ältere remote Backups mit `find` ssh "${remote_target}" "find ${remote_dir} -type f -name '*-backup.tar.gz' -mtime +$keep_backups -exec rm {} \;" echo "Backup wurde erstellt: ${backup_fullpath} und auf ${remote_target} kopiert."
mkdir /opt/docker_backups chmod +x backup_script_name.sh ./backup_script_name.sh
Wohin mit den Daten? Was als Backup Ziel?
Ich empfehle da ganz klar ein NAS-System. Das NAS ist Universal einsetzbar und bietet gleichzeitig Schutz vor dem Ausfall einer Festplatte. Ich empfehle euch hier mal was..
Wenn noch Fragen offen sein sollte, gerne hier in die Kommentare oder in das Community Forum. Community Forum ist HIER.
# | Vorschau | Produkt | Bewertung | Preis | |
---|---|---|---|---|---|
1 | Synology DS223J 2 Bay Desktop NAS, weiß | 185,90 EUR | Bei Amazon ansehen | ||
2 | Synology DiskStation DS224+ 2 Bay Dekstop NAS | 329,00 EUR | Bei Amazon ansehen | ||
3 | QNAP NAS, no HDD/SSD, ARM processor, NPU | TS-233, 2-bay, 2GB RAM, 1GbE | 169,00 EUR | Bei Amazon ansehen | ||
4 | Synology DiskStation DS223J Netzwerkspeicherlaufwerk (weiß) | 192,00 EUR | Bei Amazon ansehen |
20. September 2023 um 12:20 Uhr
Danke für das Script, allerdings ohne Anleitung wie man die Container dann wieder ans Laufen bekommt nur die halbe Miete 🙂
21. September 2023 um 10:34 Uhr
Das Video dazu folgt heute.
29. September 2023 um 15:46 Uhr
Gibt es eigentlich einen Grund, warum erst mit tar gepackt und danach komprimiert wird? Könnte ja alles in einem Schritt gemacht werden (tar cpzf).
Zusätzlich gibt es ein Problem. Wenn man nicht alle Container/Stacks am laufen hat, werden diese gestoppten container durch das Backupskript wieder gestartet.
3. Oktober 2023 um 15:05 Uhr
Speicher dir einfach eine Liste der aktuell laufenden Container in eine Variable und benutz diese dann im Anschluss wieder zum Starten dieser Container:
7. Oktober 2023 um 20:27 Uhr
Danke für das Skript.
Wie kann ich definierte Ordner ausschließen?
Zum Beispiel die Metadaten der Filme/Serien in Jellyfin sind nicht gerade klein und müssen auch nicht gesichert werden.
28. Oktober 2023 um 11:18 Uhr
Hallo, ich hoffe es ist richtig.
source_dir=“/var/lib/docker/volumes“ –exclude „/Verzeichnis“
5. November 2023 um 11:38 Uhr
Hallo Dennis, es macht einfach immer wieder Spaß deine Videos zu schauen!
Danke dafür!
Was mich freuen würde wäre, wenn du das ganze in einem Video mit BorgBackup mittels Append-only (wichtig!) machen würdest.
Gleichzeitg auch noch – als Erweiterung – eingehen könntest wie man die Configs von einem per CLI gestarteten Container (wie in deinem Video „Docker Volume Daten“ mittels Portainer und mit nginx ) mitsichert.
Dies könnte aber auch getrennt in einem zweiten Script geschehen.
Somit hätte man einmal ein Script mit allen Volumes als Sicherung und einmal ein Script mir allen Configs als Sicherung.
Danke auch schon dafür!
PS: Wäre mein Geburtstagswunsch an dich. 😉
5. November 2023 um 11:41 Uhr
Vergessen:
Du scheinst mit Docker rootful zu arbeiten… Kannst du das alles auch mit Docker rootless machen und zeigen?
Bzw. auch auf die Unterschiede eingehen?
24. April 2024 um 15:52 Uhr
Hallo Dennis,
genau was ich suchte, möglichst einfaches Backup Script. Viele andere lösen das über einen Backup Container, der dann die jeweiligen Volumes der anderen Container montiert. Welche Vorteile hätte das aus Deiner Sicht?
Ich habe ein paar Modifikationen vorgenommen und nutze im wesentlichen Deine Lösung mit ein paar Ergänzungen:
– Ein übergeordnetes Skript stopt jeden einzelnen Container und startet Ihn nach dem Backup wieder. Damit ist am Ende der gleiche Zustand hergestellt wie vor dem Backup und die Unterbrechungszeit beschränkt sich auf den jeweiligen Container.
– Dein Skript wird über eine For- Schleife gestartet, die das Skript für jeden Container einzeln ausführt (das erhöht die Flexibilität, wenn mal was Container spezifisches ins Script muss). Den Nebeneffekt, ein Backup Tar File pro Container fand ich auch ganz gut ….
– Die Variable „Keep_backups“ ist die Zeit in Tagen, die die Backups aufgehoben werden, bis sie dann gelöscht werden. Falls Backups fehlschlagen sind damit nach 10 Tagen keine mehr da. Dies habe ich über einen Zähler „Anzahl Files“ abgesichert.
– ein rudimentäres Logging der Aktivitäten, zur Fehlersuche / oder Beruhigung bezgl. der gelaufenen / Fehlgeschlagenen Backups
– Scripts, Logs und Backupdaten haben Ihr eigenes Verzeichnis
Nur als Anregung gedacht, falls es jemanden Interessiert …..
VG
Peter
18. Juni 2024 um 13:29 Uhr
Hi Peter,
ich interessiere mich für deine Verbesserungen.
Könntest du die zur Verfügung stellen?
LG lolman
9. September 2024 um 19:28 Uhr
Hallo,
ich würde gerne einen Ordner nicht mit sichern, leider klappt das nicht. Hätte jemand vielleicht einen heißen Tipp für mich?
# Erstelle das Backup-Archiv
tar -cpf „${backup_fullpath}“ –exclude=“./volume2/docker/lancachenet_monolithic/data_cache“ „${source_dir}“
Viele Grüße und Danke
20. Oktober 2024 um 23:42 Uhr
Hallo Roman,
ich könnte das Skript um die Möglichkeit erweitern.
EXCLUDE_DIR=“–exclude=tmp/path –exclude=tmp/path2″
tar $EXCLUDE_DIR -cpzf „$BACKUP_FILE“ „$SOURCE_DATA“
Ich hoffe es hillft.