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?
docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgz
Dies hängt nicht von den Implementierungsdetails der Volumes ab. Und importieren Sie die Daten mit Teer auf die zweite Maschine.Antworten:
Die offizielle Antwort finden Sie im Abschnitt "Sichern, Wiederherstellen oder Migrieren von Datenmengen" :
SICHERUNG:
--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 schreibenbusybox
: ein kleines, einfacheres Bild - gut für eine schnelle Wartungtar cvf /backup/backup.tar /data
: Erstellt eine unkomprimierte TAR-Datei aller Dateien im Verzeichnis / dataWIEDERHERSTELLEN:
quelle
docker create
nur Datencontainer zu verwenden, damit sie nicht gestartet werden. Siehe Beispiel im Aus. Dokumentation: docs.docker.com/userguide/dockervolumes/…/data
mit/var/lib/postgresql/data
, richtig?docker exec
ihn verwenden), wird ein einfacher Befehl verwendet,tail -f /dev/null
der niemals beendet wird, jedoch nur minimale Ressourcen verwendet. Wenn Sie es nicht mehr zum Laufen brauchen,docker stop data-container
erledigen Sie das für Sie. Die Volumina verbleiben für andere Container.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.
quelle
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.--cidfile=id.txt
als Ausführungsparameter verwenden. Die Container-ID wird in der Datei gespeichertid.txt
. Ich habe die Antwort aktualisiert.docker run --rm
anstelle von verwendendocker run --cidfile ... ; docker rm
.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
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.
quelle
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
centralized
Server übernimmt den MigrationsprozessDer Link zum Projekt ist hier angegeben:
quelle
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 dasdvsync-server
auf einem Computer, von dem Sie Daten kopieren möchten (Sie benötigen das,NGROK_AUTHTOKEN
was Sie über das ngrok-Dashboard erhalten können ):Anschließend können Sie
dvsync-client
auf dem Computer, auf den Sie die Dateien kopieren möchten, dieDVSYNC_TOKEN
vom Server angezeigten Dateien starten :Sobald der Kopiervorgang abgeschlossen ist, wird der Client beendet. Dies funktioniert auch mit Docker CLI, Compose, Swarm und Kubernetes.
quelle