Wie portiere ich nur Datenvolumes von einem Host auf einen anderen?


121

Wie in der Docker-Dokumentation zum Arbeiten mit Volumes beschrieben, gibt es das Konzept sogenannter Nur - Daten- Container, die ein Volume bereitstellen, das in mehrere andere Container eingebunden werden kann, unabhängig davon, ob der Nur-Daten-Container tatsächlich ausgeführt wird oder nicht.

Im Grunde klingt das fantastisch. Aber eines verstehe ich nicht.

Diese Volumes (die aus Portabilitätsgründen nicht explizit einem Ordner auf dem Host zugeordnet sind, wie in der Dokumentation angegeben) werden von Docker in einem internen Ordner auf dem Host erstellt und verwaltet ( /var/docker/volumes/…).

Angenommen, ich verwende ein solches Volume und muss es dann von einem Host auf einen anderen migrieren. Wie portiere ich das Volume? AFAICS hat eine eindeutige ID - kann ich einfach das Volume und den entsprechenden Nur-Daten-Container auf einen neuen Host kopieren? Wie finde ich heraus, welche Dateien kopiert werden sollen? Oder ist in Docker eine Unterstützung integriert, die ich noch nicht entdeckt habe?


12
Sie können ein Datencontainerverzeichnis exportieren: docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgzDies hängt nicht von den Implementierungsdetails der Volumes ab. Und importieren Sie die Daten mit Teer auf die zweite Maschine.
Jiri

1
Wow, das ist großartig, danke :-)))! Wenn Sie diesen Kommentar als Antwort schreiben, werde ich ihn gerne annehmen!
Golo Roden

Antworten:


136

Die offizielle Antwort finden Sie im Abschnitt "Sichern, Wiederherstellen oder Migrieren von Datenmengen" :

SICHERUNG:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
  • --rm: Entfernen Sie den Behälter beim Verlassen
  • --volumes-from DATA: An die vom DATA-Container gemeinsam genutzten Volumes anhängen
  • -v $(pwd):/backup: bind mounte das aktuelle Verzeichnis in den Container; um die tar-Datei zu schreiben
  • busybox: ein kleines, einfacheres Bild - gut für eine schnelle Wartung
  • tar cvf /backup/backup.tar /data: Erstellt eine unkomprimierte TAR-Datei aller Dateien im Verzeichnis / data

WIEDERHERSTELLEN:

# create a new data container
$ sudo docker create -v /data --name DATA2 busybox true
# untar the backup files into the new container᾿s data volume
$ sudo docker run --rm --volumes-from DATA2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
data/
data/sven.txt
# compare to the original container
$ sudo docker run --rm --volumes-from DATA -v `pwd`:/backup busybox ls /data
sven.txt

3
Im Moment ist es besser, docker createnur Datencontainer zu verwenden, damit sie nicht gestartet werden. Siehe Beispiel im Aus. Dokumentation: docs.docker.com/userguide/dockervolumes/…
FelikZ

1
So ... Wenn ich ein Backup ist versucht , eine Postgres - Datenbank, was würde ich ersetzen /datamit /var/lib/postgresql/data, richtig?
425nesp

6
Der Abschnitt "Sichern, Wiederherstellen oder Migrieren von Datenvolumes" scheint aus der Docker-Dokumentation entfernt worden zu sein :-(
SteveC

2
@Datz Es ist nur ein Befehl, der aufgerufen wird, um den Datencontainer zu erstellen. Es kann sich um einen beliebigen Befehl handeln, der eigentlich nichts bewirkt. Der Container wird gestartet und sofort beendet, wird jedoch zum Speichern von Daten verwendet.
Tommasop

1
@rszalski Wenn der Container aus irgendeinem Grund weiterhin ausgeführt werden muss (z. B. möchten Sie docker execihn verwenden), wird ein einfacher Befehl verwendet, tail -f /dev/nullder niemals beendet wird, jedoch nur minimale Ressourcen verwendet. Wenn Sie es nicht mehr zum Laufen brauchen, docker stop data-containererledigen Sie das für Sie. Die Volumina verbleiben für andere Container.
Jesse Chisholm

16

Sie können das Volume in tar exportieren und auf einen anderen Computer übertragen. Und importieren Sie die Daten mit Teer auf die zweite Maschine. Dies hängt nicht von den Implementierungsdetails der Volumes ab.

# you can list shared directories of the data container
docker inspect <data container> | grep "/vfs/dir/"

# you can export data container directory to tgz
docker run --cidfile=id.tmp --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgz

# clean up: remove exited container used for export and temporary file
docker rm `cat id.tmp` && rm -f id.tmp

Danke für deine Antwort. Wie kann ich den Datencontainer von einem Host auf einen anderen verschieben?
Dzung Nguyen

1
@nXqd Datencontainer wird erstellt von docker run -v /data-volume -name datacointainer busybox true- Sie können dies überall ausführen. Nachdem Sie den Datencontainer erstellt haben, können Sie das Teerarchiv wie in der Antwort erläutert importieren.
Jiri

Danke für deine Antwort. Aber ich bin auf ein anderes Problem gestoßen, dass wir den Zombie-Container entfernen müssen, der später für die Sicherung verwendet wird. Da dies keine ID zurückgibt. Haben Sie einen guten Weg: D
Dzung Nguyen

@nXqd Sicher - Sie müssen --cidfile=id.txtals Ausführungsparameter verwenden. Die Container-ID wird in der Datei gespeichert id.txt. Ich habe die Antwort aktualisiert.
Jiri

9
Sie könnten einfach docker run --rmanstelle von verwenden docker run --cidfile ... ; docker rm.
Felix Rabe

16

Wenn Sie die offizielle Antwort aus den Docker-Dokumenten und die oberste Antwort hier erweitern , können Sie folgende Aliase in Ihrer .bashrc oder .zshrc haben

# backup files from a docker volume into /tmp/backup.tar.gz
function docker-volume-backup-compressed() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie tar -czvf /backup/backup.tar.gz "${@:2}"
}
# restore files from /tmp/backup.tar.gz into a docker volume
function docker-volume-restore-compressed() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie tar -xzvf /backup/backup.tar.gz "${@:2}"
  echo "Double checking files..."
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie ls -lh "${@:2}"
}
# backup files from a docker volume into /tmp/backup.tar
function docker-volume-backup() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox tar -cvf /backup/backup.tar "${@:2}"
}
# restore files from /tmp/backup.tar into a docker volume
function docker-volume-restore() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox tar -xvf /backup/backup.tar "${@:2}"
  echo "Double checking files..."
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox ls -lh "${@:2}"
}

Beachten Sie, dass die Sicherung in gespeichert ist /tmp, sodass Sie die dort gespeicherte Sicherungsdatei zwischen Docker-Hosts verschieben können.

Es gibt auch zwei Paare von Sicherungs- / Wiederherstellungs-Aliasen. Eine mit Komprimierung und Debian: Jessie und andere ohne Komprimierung, aber mit Busybox. Bevorzugen Sie die Komprimierung, wenn die zu sichernden Dateien groß sind.


3

Ich werde hier ein weiteres aktuelles Tool von IBM hinzufügen, das tatsächlich für die Volume-Migration von einem Container-Host auf einen anderen entwickelt wurde. Dies ist ein derzeit laufendes Projekt. Möglicherweise finden Sie in Zukunft eine andere Version mit zusätzlichen Funktionen.

Cargo wurde entwickelt, um Container mit ihren Daten mit minimalen Ausfallzeiten von einem Host auf einen anderen Host zu migrieren. Cargo verwendet die Datenverbundfunktionen des Union-Dateisystems , um eine einheitliche Ansicht der Daten (hauptsächlich des Root-Dateisystems) auf den Quell- und Zielhosts zu erstellen. Auf diese Weise kann Cargo einen Container fast sofort (innerhalb von Millisekunden) auf dem Zielhost starten, da die Daten aus dem Quellstammdateisystem entweder bei Bedarf (mithilfe einer COW- Partition ( Copy-on-Write) ) oder träge auf die Zielhosts kopiert werden im Hintergrund (mit rsync) .

Wichtige Punkte sind: - Ein centralizedServer übernimmt den Migrationsprozess

Der Link zum Projekt ist hier angegeben:

https://github.com/nadgowdas/cargo

3

Wenn sich Ihre Computer in verschiedenen VPCs befinden oder Sie (wie in meinem Fall) von / auf einen lokalen Computer kopieren möchten, können Sie das von mir erstellte dvsync verwenden . Es ist im Grunde ngrok kombiniert mit rsyncüber SSH, verpackt in zwei kleine (beide ~ 25 MB) Bilder. Zuerst starten Sie das dvsync-serverauf einem Computer, von dem Sie Daten kopieren möchten (Sie benötigen das, NGROK_AUTHTOKENwas Sie über das ngrok-Dashboard erhalten können ):

$ docker run --rm -e NGROK_AUTHTOKEN="$NGROK_AUTHTOKEN" \
  --mount source=MY_VOLUME,target=/data,readonly \
  quay.io/suda/dvsync-server

Anschließend können Sie dvsync-clientauf dem Computer, auf den Sie die Dateien kopieren möchten, die DVSYNC_TOKENvom Server angezeigten Dateien starten :

docker run -e DVSYNC_TOKEN="$DVSYNC_TOKEN" \
  --mount source=MY_TARGET_VOLUME,target=/data \
  quay.io/suda/dvsync-client 

Sobald der Kopiervorgang abgeschlossen ist, wird der Client beendet. Dies funktioniert auch mit Docker CLI, Compose, Swarm und Kubernetes.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.