Docker-Volume sichern und wiederherstellen

23

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

Einer der Dienste ist beispielsweise eine Webanwendung, über die Benutzer Dateien hochladen können. Für diesen Container habe ich ein /filesVolume, das ich sichern möchte. Host-Reittiere scheinen etwas verpönt zu sein, da solche Reittiere in keiner Weise portabel sind - wie in diesem Blog-Beitrag und in der Docker-Dokumentation für Volumes beschrieben .

Ich weiß aus demselben Blog-Beitrag, dass ich keinen Host-Mount benötige , um auf die Dateien in einem Volume zuzugreifen. Mit diesem kann ich docker inspectherausfinden, wo sich die Dateien befinden.

Aber hier ist mein Problem: Ich dachte darüber nach, nur die Dockerdateien zu sichern, die zum Erstellen der Container und der damit verbundenen Volumes erforderlich sind. In dem wahrscheinlichen Fall, dass ich alles von der Sicherung wiederherstellen muss, wie würde ich vorgehen, um zu wissen, welches Volume-Verzeichnis welchem ​​Container entspricht? Beim erneuten Erstellen des Containers ändern sich die ID und der Volume-Pfad. Daher würde ich einige zusätzliche Informationen benötigen, um sie abzugleichen. Was sollte ich sonst noch sichern, um tatsächlich alles wiederherstellen zu können?

fcoelho
quelle

Antworten:

24

Du hast recht. Da Sie mehrere Container mit eigenen Volumes haben können, müssen Sie verfolgen, welches Volume welchem ​​Container entspricht. Wie das geht, hängt von Ihrem Setup ab: Ich benutze den Namen -data für den Datencontainer, damit klar ist, zu welchem ​​Container ein Bild gehört. Auf diese Weise kann es wie folgt 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 noch 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 Folgendes sichern müssen:

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

Update: In der Zwischenzeit habe ich ein Tool zum Sichern von Containern und deren Volume (s) (Container) erstellt: https://github.com/discordianfish/docker-backup und ein Backup-Image, mit dem Sie Backups erstellen und diese verschieben können s3: https://github.com/discordianfish/docker-lloyd

Johannes 'Fisch' Ziemke
quelle
Das ist ein fairer Kompromiss, danke. Gibt es einen klaren Vorteil bei der Verwendung eines separaten Containers für Daten?
fcoelho
Dies hängt wieder wirklich von Ihrem Setup ab. Es ist sinnvoll, einen Datencontainer zu verwenden, da Sie ihn einfach mit 'volume-from' referenzieren und alle Interna abstrahieren können: Sie hängen einfach Volumes vom Container an andere Container an, anstatt in Bezug auf Pfad und Mountpunkte zu denken.
Johannes 'Fisch' Ziemke
Ich habe diesen Fehler mit ungültiger Option - z. Es scheint, dass der Standard-Teer in busybox dies nicht unterstützt.
nXqd
6
jq ist sehr cool, sondern eher als eine Abhängigkeit der Einführung, warum nicht Gebrauch docker inspectin Templating wie so gebaut s: VOLUME=$( docker inspect -f '{{index .Volumes "/path/in/container"}}' "${NAME}-data" ). Es ist wahrscheinlich auch ratsam, die Benutzer daran zu erinnern, dass sie nicht erwarten, Dateien auf diese Weise zu sichern, während sie aktiv verwendet werden (z. B. Datenbanken).
mc0e
2
In Docker 1.8 hat sich das Format geändert - Volumessind weg und gibt es Mountsstattdessen mit unterschiedlicher Struktur. Wir müssen ein bisschen mehr arbeiten range, um den Mount Point zu finden, an dem wir interessiert sindVOLUME=$(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/path/in/container" }}{{ .Source }}{{ end }}{{ end }}' "${NAME}-data")
Jarek Przygódzki
5

In neueren Docker (getestet in 1.9.1, build 9894698) können Sie den cpBefehl verwenden .

Hier ist ein Beispiel, wie ein Verzeichnis vom Container auf den Host kopiert wird:

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

Hier ist ein Beispiel, wie Sie ein Verzeichnis aus dem Container in eine tarDatei kopieren :

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

Last but not least ein Beispiel, wie man ein Verzeichnis aus dem Container in eine tar.gzDatei kopiert :

docker cp wordpress:/var/www/html - | gzip > backups/wordpress.`date +"%Y%m%d"`.tar.gz
czerasz
quelle
2
docker cpsendet alles über das Netzwerk. Dies ist etwas, das Sie vermeiden möchten, insbesondere wenn Ihr Docker-Volume bereits ein BTRFS-Volume ist.
Jarek Przygódzki
2
In der Frage wird das Sichern und Wiederherstellen erwähnt . Ein Wiederherstellungsbeispiel in dieser Antwort mit docker cpwäre schön.
MadMike