Come trasferire volumi di soli dati da un host a un altro?


121

Come descritto nella documentazione di Docker su Working with Volumes, esiste il concetto di cosiddetti contenitori di soli dati , che forniscono un volume che può essere montato in più altri contenitori, indipendentemente dal fatto che il contenitore di soli dati sia effettivamente in esecuzione o meno.

Fondamentalmente, questo suona fantastico. Ma c'è una cosa che non capisco.

Questi volumi (che non vengono mappati esplicitamente a una cartella sull'host per motivi di portabilità, come afferma la documentazione) vengono creati e gestiti da Docker in una cartella interna sull'host ( /var/docker/volumes/…).

Supponiamo di utilizzare un volume di questo tipo e quindi di doverlo migrare da un host a un altro: come si esegue il porting del volume? AFAICS ha un ID univoco: posso semplicemente copiare il volume e il relativo contenitore di soli dati su un nuovo host? Come faccio a sapere quali file copiare? O c'è qualche supporto integrato in Docker che non ho ancora scoperto?


12
È possibile esportare la directory del contenitore di dati: docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgznon si basa sui dettagli di implementazione dei volumi. E importa i dati con tar sulla seconda macchina.
Jiri

1
Wow, è fantastico, grazie :-)))! Se scrivi questo commento come risposta, lo accetterò volentieri!
Golo Roden

Risposte:


136

La risposta ufficiale è disponibile nella sezione "Backup, ripristino o migrazione di volumi di dati" :

BACKUP:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
  • --rm: rimuovere il contenitore quando esce
  • --volumes-from DATA: allegare ai volumi condivisi dal contenitore DATA
  • -v $(pwd):/backup: bind monta la directory corrente nel container; in cui scrivere il file tar
  • busybox: una piccola immagine più semplice - buona per una rapida manutenzione
  • tar cvf /backup/backup.tar /data: crea un file tar non compresso di tutti i file nella directory / data

RISTABILIRE:

# 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
Per ora è meglio utilizzare docker createcontenitori di soli dati in modo che non vengano avviati. Vedi esempio in off. documentazione: docs.docker.com/userguide/dockervolumes/…
FelikZ

1
Quindi ... se sto cercando di backup di un database Postgres, cosa avrei sostituirlo /datacon /var/lib/postgresql/data, giusto?
425nesp

6
La sezione "Backup, ripristino o migrazione dei volumi di dati" sembra essere stata rimossa dalla documentazione Docker :-(
SteveC

2
@Datz è solo un comando chiamato per creare il contenitore di dati, potrebbe essere qualsiasi comando che in realtà non fa nulla. Il contenitore si avvia ed esce immediatamente, ma viene utilizzato per rendere persistenti i dati.
tommasop

1
@rszalski Se per qualche motivo è necessario che il contenitore rimanga in esecuzione (ad esempio, lo si desidera docker exec), allora un semplice comando è tail -f /dev/nullche non uscirà mai, ma utilizza risorse minime. Quando non ne avrai più bisogno, docker stop data-containerlo farà per te. I volumi rimangono per altri contenitori.
Jesse Chisholm

16

È possibile esportare il volume in tar e trasferirlo su un'altra macchina. E importa i dati con tar sulla seconda macchina. Ciò non si basa sui dettagli di implementazione dei volumi.

# 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

grazie per la tua risposta. Come posso spostare il contenitore di dati da un host a un altro?
Dzung Nguyen

1
@nXqd Il contenitore dati viene creato da docker run -v /data-volume -name datacointainer busybox true: puoi eseguirlo ovunque. Dopo aver creato il contenitore di dati, puoi importare l'archivio tar come spiegato nella risposta.
Jiri

Grazie per la tua risposta. Ma ho incontrato un altro problema che dobbiamo rimuovere il contenitore zombi che viene utilizzato per il backup in seguito. Poiché questo non restituisce id. Hai qualche buon modo: D
Dzung Nguyen

@nXqd Certo, devi usare --cidfile=id.txtcome parametro di esecuzione. L'ID contenitore verrà archiviato nel file id.txt. Ho aggiornato la risposta.
Jiri

9
Potresti semplicemente usare al docker run --rmposto di docker run --cidfile ... ; docker rm.
Felix Rabe

16

Estendendo la risposta ufficiale dai documenti Docker e la risposta principale qui , puoi avere i seguenti alias nel tuo .bashrc o .zshrc

# 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}"
}

Nota che il backup viene salvato in /tmp, quindi puoi spostare il file di backup salvato lì tra gli host Docker.

Esistono anche due coppie di alias di backup / ripristino. Uno che usa compressione e debian: jessie e altri senza compressione ma con busybox. Preferisci l'uso della compressione se i file di cui eseguire il backup sono grandi.


3

Aggiungerò qui un altro strumento recente di IBM che è effettivamente realizzato per la migrazione del volume da un host contenitore a un altro. Questo è un progetto attualmente in corso. Quindi, potresti trovare una versione diversa con funzionalità aggiuntive in futuro.

Cargo è stato sviluppato per migrare i container da un host a un altro insieme ai loro dati con tempi di inattività minimi. Cargo utilizza le funzionalità di federazione dei dati del file system union per creare una vista unificata dei dati (principalmente il file system radice) tra gli host di origine e di destinazione. Ciò consente a Cargo di avviare un container quasi immediatamente (entro millisecondi) sull'host di destinazione poiché i dati dal file system radice di origine vengono copiati negli host di destinazione su richiesta (utilizzando una partizione copy-on-write (COW) ) o pigramente in background (usando rsync) .

I punti importanti sono: - un centralizedserver gestisce il processo di migrazione

Il link al progetto è fornito qui:

https://github.com/nadgowdas/cargo

3

Nel caso in cui le tue macchine siano in VPC diversi o desideri copiare da / su una macchina locale (come nel mio caso) puoi usare dvsync che ho creato. È fondamentalmente ngrok combinato con rsyncover SSH impacchettato in due piccole immagini (entrambe ~ 25 MB). Per prima cosa, avvii dvsync-serversu una macchina da cui desideri copiare i dati (avrai bisogno del NGROK_AUTHTOKENche può essere ottenuto dalla dashboard di ngrok ):

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

Quindi è possibile avviare dvsync-clientsulla macchina in cui si desidera copiare i file, passando il DVSYNC_TOKENmostrato dal server:

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

Una volta completata la copia, il client uscirà. Funziona anche con Docker CLI, Compose, Swarm e Kubernetes.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.