Frage Docker Volume Backup und Restore


Ich verwende Docker, um einige Dienste auf einem CentOS 6.4-Server bereitzustellen, und ich versuche herauszufinden, wie die von ihnen generierten Daten ordnungsgemäß gesichert werden können.

Zum Beispiel ist einer der Dienste eine Webanwendung, in der Benutzer Dateien hochladen können. Für diesen Container habe ich eine /files Volume, das ich sichern möchte. Host-Halterungen sehen aus, als wären sie etwas verpönt, weil eine solche Halterung in keiner Weise tragbar ist - wie in dieser Blogbeitrag und das Docker-Dokumentation für Volumes.

Ich weiß aus dem gleichen Blogpost, dass ich nicht weiß brauchen Ein Host-Mount für den Zugriff auf die Dateien in einem Volume kann ich verwenden docker inspect um herauszufinden, wo sich die Dateien befinden.

Aber hier ist mein Problem: Ich habe darüber nachgedacht, nur die Dockerdateien zu sichern, die benötigt werden, um die Container und die damit verbundenen Volumes zu erstellen. In dem wahrscheinlichsten Fall, dass ich alles aus dem Backup wiederherstellen muss, wie würde ich wissen, welches Volume-Verzeichnis welchem ​​Container entspricht? Durch den Neuaufbau des Containers ändern sich die ID und der Volume-Pfad. Daher benötige ich zusätzliche Informationen, um sie zu vergleichen. Was sollte ich sonst noch sichern, um alles wiederherstellen zu können?


22
2018-02-18 15:59


Ursprung




Antworten:


Du hast recht. Da Sie mehrere Container mit Volumes allein haben können, müssen Sie verfolgen, welches Volume welchem ​​Container entspricht. Wie das geht, hängt von Ihrer Konfiguration ab: Ich verwende den Namen -data für den Datencontainer, so dass es offensichtlich ist, zu welchem ​​Container ein Bild gehört. So kann es so gesichert werden:

VOLUME=`docker inspect $NAME-data | jq '.[0].Volumes["/path/in/container"]'`
tar -C $VOLUME . -czvf $NAME.tar.gz

Jetzt müssen Sie nur Ihr Image neu erstellen und Ihren Datencontainer neu erstellen:

cat $NAME.tar.gz | docker run -name $NAME-data -v /path/in/container \
                              -i busybox tar -C /path/int/container -xzf -

Das bedeutet, dass Sie Backups benötigen:

  • Dockerfile
  • Volumen
  • Datenträgerpfad im Container
  • Name des Containers, zu dem das Volume gehört

Aktualisieren: In der Zwischenzeit habe ich ein Tool erstellt, um Container und deren Volumen (Container) zu sichern: https://github.com/discordianfish/docker-backup und ein Backup-Image, das Backups erstellen und an s3 senden kann: https://github.com/discordianfish/docker-lloyd


23
2018-02-19 10:33



Das ist ein fairer Kompromiss, danke. Gibt es einen klaren Vorteil, einen separaten Container für Daten zu verwenden? - fcoelho
Dies hängt wiederum von Ihrer Einrichtung ab. Es ist sinnvoll, einen Datencontainer zu verwenden, da Sie mit 'volumes-from' leicht darauf verweisen können und alle internen Elemente weg abstrahieren können: Sie fügen einfach Volumes aus Containern anderen Containern hinzu, anstatt in Pfad- und Bereitstellungspunkten zu denken. - Johannes 'fish' Ziemke
Ich habe diesen Fehler ungültige Option - z. Es scheint, dass der Standard-tar in busybox dies nicht unterstützt. - nXqd
jq ist sehr cool, aber anstatt eine Abhängigkeit einzuführen, warum nicht verwenden docker inspects in Templating wie folgt gebaut: VOLUME=$( docker inspect -f '{{index .Volumes "/path/in/container"}}' "${NAME}-data" ). Es ist wahrscheinlich auch ratsam, Leute daran zu erinnern, Dateien nicht auf diese Weise zu sichern, während sie aktiv verwendet werden (z. B. Datenbanken). - mc0e
In Docker 1.8 hat sich das Format geändert - Volumes sind weg und da sind Mounts stattdessen mit unterschiedlicher Struktur. Wir müssen ein bisschen mehr arbeiten mit range um den Mountpoint zu finden, an dem wir interessiert sind VOLUME=$(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/path/in/container" }}{{ .Source }}{{ end }}{{ end }}' "${NAME}-data") - Jarek Przygódzki


In neueren Docker (getestet in 1.9.1, build 9894698) du kannst den ... benutzen cp Befehl.

Hier ist ein Beispiel, wie man ein Verzeichnis vom Container zum Host kopiert:

docker cp wordpress:/var/www/html backups/wordpress.`date +"%Y%m%d"`/

Hier ist ein Beispiel, wie man ein Verzeichnis vom Container in ein tar Datei:

docker cp wordpress:/var/www/html - > backups/wordpress.`date +"%Y%m%d"`.tar

Last but not least ein Beispiel, wie man ein Verzeichnis vom Container in ein tar.gz Datei:

docker cp wordpress:/var/www/html - | gzip > backups/wordpress.`date +"%Y%m%d"`.tar.gz

5
2018-04-29 14:48



docker cp sendet alles über das Netzwerk. Es ist etwas, das Sie vermeiden möchten, besonders wenn Ihr Docker-Volume bereits ein Btrfs-Volume ist. - Jarek Przygódzki
Die Frage erwähnt Backup und wiederherstellen. Ein Wiederherstellungsbeispiel in dieser Antwort mit docker cp wäre nett. - MadMike