In diesem Artikel hatte ich beschrieben, wie ich ein Backup eines Docker-Daten-Volumes erstelle.

Allerdings ist in diesem Fall das Erstellen eines Backups nur die halbe Miete.
Erstelle ich ein Backup meiner Fotosammlung und die Fotosammlung geht verloren...dann greife ich einfach auf das Backup zu.
Aber was fange ich mit dem Backup des Docker-Daten-Volumes an, wenn zum Beispiel der Server den Geist aufgibt, auf dem Docker läuft? Wie bekomme ich meinen Docker Container wieder zum Laufen inklusive der verwendeten Dateien?

Das Folgende habe ich an Hand meines Bitwarden/Vaultwarden-Containers beschrieben, wo alle wichtigen Daten in einer sqlite-Datenbank gespeichert werden, die in einem Docker-Daten-Volume liegt.


Info:

Da ich meinen Container mit docker run -d --name bitwarden gestartet habe, verwende ich im Folgenden Beispiel immer den Containernamen bitwarden

Die folgenden docker-Befehle müssen möglicherweise als su ausgeführt werden.

Docker Container sichern (optional)

Der zu backupende Docker-Container kann als neues Docker-Image gesichert und dann in das Filesystem des Host-Systems übertragen werden.

Dieser Schritt ist optional und wahrscheinlich notwendig, sollte man sich seinen Docker-Container mühsam zusammengebastelt haben.
Hat man den Docker-Container sowieso immer nur direkt aus der Repository bezogen (docker run ... vaultwarden/server:latest) und hält ihn auch immer auf dem neusten Stand, so kann man sich dieses Backup sparen und zieht es sich im Falle des Falles wieder frisch aus der Docker-Repository.

# Container anhalten
# (damit nicht gerade Daten geschrieben werden, während wir unser Backup erstellen)
docker stop bitwarden

# Neues Image aus bestehendem Container erstellen
# und als .tar auf dem Host-System speichern
docker commit bitwarden bitwarden_backup
docker save bitwarden_backup > ~/lokales-backup/container.tar

# Nun können wir den Container wieder starten
docker start bitwarden

Docker Daten-Volume sichern

Ich habe bei meiner Google-Suche immer nur Beispiele gefunden, wie ich mit Hilfe von docker run einen Container starte und innerhalb des Containers auf das Datenvolume zugreife und die Daten von dort dann an das Host-Filesystem übertrage.
Dies hatte aber bei mir – wieso auch immer – nie funktioniert. Im lokalen Dateisystem kamen keine Daten im angegebenen Verzeichnis an.

~/lokales-backup sollte hierbei ein Verzeichnis auf dem Host-System sein und /backup ein Verzeichnis im Docker Container.
Die Daten, die ich sichern möchte, liegen im Verzeichnis /data im Docker Container.
Als zum kopieren missbrauchten Container kann entweder ein neues Image (z.B. ubuntu) oder das vorher erstellte gebackupte Image (bitwarden_backup) verwendet werden.

docker run --rm --volumes-from bitwarden -v ~/lokales-backup:/backup bitwarden_backup tar cvf  backup.tar /data
# ...oder...
docker run --rm --volumes-from bitwarden -v ~/lokales-backup:/backup ubuntu bash -c "cd /data && tar cvf /backup/data.tar ."

Wie gesagt: hatte bei mir nicht funktioniert.

Ich hatte dafür dann auf docker cp zurückgegriffen.
Dieser Befehl findet sich leider in keiner Suche, wenn es darum geht, die Daten eines Containers zu sichern und wieder herzustellen. Vielleicht, weil diese Methode einen Nachteil mit sich bringt:
Auf die Verzeichnisse /proc, /sys, /dev, tmpfs und im Container erstellte mounts kann nicht zugegriffen werden.
Was für mich aber verschmerzbar war.

# Container anhalten
# (damit nicht gerade Daten geschrieben werden, während wir unser Backup erstellen)
docker stop bitwarden

# Inhalt des Pfades /data des Docker-Daten-Volumes ins lokale Filesystem holen
docker cp bitwarden:/data ~/lokales-backup/

# Nun können wir den Container wieder starten
docker start bitwarden

Das Wichtigste: Alles auf einem anderen Server wieder zum Laufen bringen

Zuerst Container und Daten (oder nur die Daten, weil ich den Container nachher frisch aus dem Internet ziehe) auf den neuen Server übertragen.

# Daten auf den Ersatz-Host übertragen
scp ~/lokales-backup/container.tar apfelz@IP-NEUER-SERVER:~/tmp
scp ~/lokales-backup/data apfelz@IP-NEUER-SERVER:~/tmp/data

Und nun auf der Kommandozeile des Ersatz-Hosts und ausgegangen davon, dass dort natürlich auch Docker läuft...

# Optional: Gesicherten Container laden
# (oder alternativ nachher bei docker run neu herunterladen)
docker load < container.tar

# Neues Datenvolume erstellen
docker volume create bitwarden_data

# Daten von lokalem Verzeichnis in das Docker-Daten-Volume kopieren
# (hierzu nehmen wir uns ein Ubuntu-Image zur Hilfe...)
# (...bei mir in dieser Richtung auch endlich mal funktionierte)
docker run --rm -v bitwarden_data:/data -v ~/tmp/data:/backup ubuntu bash -c "cp -r /backup/* /data/"

# Container aus Backup-Container starten
# (und an Port 5002 verfügbar machen)
docker run -d --name bitwarden -v bitwarden_data:/data/ -e DOMAIN_ORIGIN=https://bitwarden.apfel-z.de -e SIGNUPS_ALLOWED=false -e SIGNUPS_DOMAINS_WHITELIST=apfel-z.de -e ADMIN_TOKEN=xyz -p 5002:80 bitwarden_backup:latest
# ODER Container frisch aus dem Internet ziehen und starten
docker run -d --name bitwarden -v bitwarden_data:/data/ -e DOMAIN_ORIGIN=https://bitwarden.apfel-z.de -e SIGNUPS_ALLOWED=false -e SIGNUPS_DOMAINS_WHITELIST=apfel-z.de -e ADMIN_TOKEN=xyz -p 5002:80 vaultwarden/server:latest

Mein Ersatzserver ist ersteinmal nicht vom Internet aus zu erreichen, sondern nur vom lokalen Netzwerk aus.
Dies ist für den Fall der Fälle für's Erste besser als nichts, so dass ich mich immerhin noch mit http://IP-NEUER-SERVER:5002 einloggen und die Passwörter nachschlagen oder exportieren kann.

Leider verweigert Firefox ohne https das Login auf die Web-Oberfläche. Mit Safari klappt das Login.

Schnell zusammengefasst: Daten-Backup in die Docker-Instanz bringen

Als ich die ganze oben beschriebene Geschichte nach einiger Zeit nochmals selbst testen wollte, war ich durch die ganzen Pfade und Backups (sowohl Container wie auch Daten-Volume) etwas verwirrt. Deshalb nochmals kurz und knackig:

Ich habe mein Docker-Volume bitwarden_data gespeichert und möchte es auf meinem Server oder einem anderen Server für eine Bitwarden-Instanz wieder herstellen. Den Container will ich aus keinem Backup übernehmen, der ist entweder schon da oder wird mit docker run dann frisch herutergeladen.

Die Daten vom Docker-Daten-Volume, mit denen ich gleich hantiere, sind ein Verzeichnis mit allen Dateien, wie sie zuvor innerhalb der Docker-Instanz in /data waren, keine tar-File und das Verzeichnis heißt bei mir einfach nur bitwarden-backup

# Nur, falls noch nicht erstellt, weil wir auf einem neuem Server unterwegs sind
# oder unbedingt ein neues Volume möchten
docker volume create bitwarden_data

# Mit Hilfe eines Ubuntu-Containers die Daten kopieren
# Huch...viele Verzeichnisse hier!
# - das lokale bitwarden-backup ist für den Ubuntu-Container /backup
# - der kopiert den Inhalt von /backup nach /data
# - /data ist das bitwarden_data Daten-Volume
docker run --rm -v bitwarden_data:/data -v ~/bitwarden-backup:/backup ubuntu bash -c "cp -r /backup/* /data/"

# Und nun Container starten,
# so dass ich ihn von meinem Computer aus unter http://<IP>:5002 erreiche
docker run -d --name bitwarden -v bitwarden_data:/data/ -e DOMAIN_ORIGIN=https://bitwarden.apfel-z.de -e SIGNUPS_ALLOWED=false -e SIGNUPS_DOMAINS_WHITELIST=apfel-z.de  --restart always -p 5002:80 vaultwarden/server:latest