Backup e ripristino del volume Docker


23

Sto usando Docker per distribuire alcuni servizi su un server CentOS 6.4 e sto cercando di capire come eseguire correttamente il backup dei dati che generano.

Ad esempio, uno dei servizi è un'applicazione Web in cui gli utenti possono caricare file. Per questo contenitore, ho un /filesvolume di cui voglio eseguire il backup. I montaggi host sembrano essere in qualche modo disapprovati, perché tale montaggio non è in alcun modo portatile - come detto in questo post del blog e nella documentazione docker per i volumi .

So dallo stesso post sul blog che non ho bisogno di un mount host per accedere ai file in un volume, che posso usare docker inspectper scoprire dove sono i file.

Ma ecco il mio problema: stavo pensando di eseguire il backup solo dei file docker necessari per costruire i contenitori e i volumi ad essi associati. Nel probabile caso in cui dovessi ripristinare tutto dal backup, come farei per sapere quale directory di volumi corrisponde a quale contenitore? La ricostruzione del contenitore provoca la modifica dell'ID e del percorso del volume, quindi avrei bisogno di alcune informazioni aggiuntive per abbinarli. Cos'altro dovrei fare il backup per poter ripristinare effettivamente tutto?

Risposte:


24

Hai ragione. Dal momento che è possibile avere più contenitori con volumi propri, è necessario tenere traccia di quale volume corrisponde a quale contenitore. Come farlo dipende dalla tua configurazione: io uso il nome -data per il contenitore di dati, quindi è ovvio a quale contenitore appartiene un'immagine. In questo modo è possibile eseguire il backup in questo modo:

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

Ora devi solo ricostruire l'immagine e ricreare il tuo contenitore di dati:

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

Quindi questo significa che devi eseguire il backup:

  • Dockerfile
  • volume
  • percorso del volume nel contenitore
  • nome del contenitore a cui appartiene il volume

Aggiornamento: Nel frattempo ho creato uno strumento per il backup dei container e dei loro volumi (container): https://github.com/discordianfish/docker-backup e un'immagine di backup che può creare backup e spingerli a s3: https://github.com/discordianfish/docker-lloyd


È un giusto compromesso, grazie. Esiste un chiaro vantaggio nell'utilizzare un contenitore separato per i dati?
fcoelho,

Questo dipende ancora dalla configurazione. Ha senso usare un contenitore di dati perché puoi fare facilmente riferimento ad esso usando 'volumi-da' e avere tutti gli interni astratti: basta semplicemente collegare i volumi dal contenitore ad altri contenitori invece di pensare in termini di percorso e punti di montaggio.
Johannes "pesca" Ziemke il

Ho questo errore opzione non valida - z. Sembra che il tar predefinito in busybox non supporti questo.
Dzung Nguyen,

6
JQ è molto cool, ma piuttosto che introdurre una dipendenza, perché non usare docker inspects costruito nel templating in questo modo: VOLUME=$( docker inspect -f '{{index .Volumes "/path/in/container"}}' "${NAME}-data" ). Probabilmente è anche saggio ricordare alle persone di non aspettarsi di eseguire il backup dei file in questo modo mentre sono attivamente in uso (ad esempio database).
MC0e,

2
In Docker 1.8 il formato è cambiato: se ne Volumessono andati e ce ne sono Mountsinvece con strutture diverse. Dobbiamo fare un po 'più di lavoro rangeper trovare il punto di montaggio a cui siamo interessatiVOLUME=$(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/path/in/container" }}{{ .Source }}{{ end }}{{ end }}' "${NAME}-data")
Jarek Przygódzki

5

Nel Docker più recente (testato in 1.9.1, build 9894698) è possibile utilizzare il cpcomando .

Ecco un esempio di come copiare una directory dal contenitore all'host:

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

Ecco un esempio di come copiare una directory dal contenitore in un tarfile:

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

Ultimo ma non meno importante un esempio di come copiare una directory dal contenitore in un tar.gzfile:

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

2
docker cpinvia tutto sulla rete. È qualcosa che vuoi evitare soprattutto se il tuo volume Docker è già un volume btrfs.
Jarek Przygódzki,

2
La domanda menziona il backup e il ripristino . Un esempio di ripristino in questa risposta usando docker cpsarebbe bello.
MadMike
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.