Backup e restauração do volume do Docker

23

Estou usando o Docker para implantar alguns serviços em um servidor CentOS 6.4 e estou tentando descobrir como fazer backup dos dados que eles geram corretamente.

Por exemplo, um dos serviços é um aplicativo da web em que os usuários podem fazer upload de arquivos. Para este contêiner, tenho um /filesvolume que desejo fazer backup. As montagens de host parecem um pouco desaprovadas, porque essa montagem não é de maneira alguma portátil - como dito nesta postagem no blog e na documentação do docker para volumes .

Sei pela mesma postagem no blog que não preciso de uma montagem de host para acessar os arquivos em um volume, posso usar docker inspectpara descobrir onde estão os arquivos.

Mas aqui está o meu problema: eu estava pensando em fazer backup apenas dos arquivos de encaixe necessários para criar os contêineres e os volumes associados a eles. Na eventualidade de eu precisar restaurar tudo do backup, como saberia qual diretório de volume corresponde a qual contêiner? A reconstrução do contêiner faz com que o ID e o caminho do volume sejam alterados, por isso precisaria de algumas informações extras para correspondê-los. O que mais, se houver, devo fazer backup para poder realmente restaurar tudo?

fcoelho
fonte

Respostas:

24

Você está certo. Como você pode ter vários contêineres com volumes por conta própria, é necessário acompanhar qual volume corresponde a qual contêiner. Como fazer isso depende da sua configuração: eu uso o nome -data para o contêiner de dados; portanto, é óbvio a qual contêiner uma imagem pertence. Dessa forma, pode ser feito o backup dessa maneira:

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

Agora você só precisa reconstruir sua imagem e recriar seu contêiner de dados:

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

Portanto, isso significa que você precisa fazer backup:

  • Dockerfile
  • volume
  • caminho do volume no contêiner
  • nome do contêiner ao qual o volume pertence

Atualização: Enquanto isso, criei uma ferramenta para fazer backup de contêineres e seu (s) volume (s) (contêineres): https://github.com/discordianfish/docker-backup e uma imagem de backup que pode criar backups e enviá-los para s3: https://github.com/discordianfish/docker-lloyd

Ziemke, peixe de Johannes
fonte
É um compromisso justo, obrigado. Existe uma clara vantagem de usar um contêiner separado para dados?
fcoelho 19/02
Isso novamente realmente depende da sua configuração. Faz sentido usar um contêiner de dados porque você pode consultá-lo facilmente usando 'volumes-de' e ter todos os elementos internos abstraídos: basta anexar volumes do contêiner a outros contêineres, em vez de pensar em termos de caminho e pontos de montagem.
Johannes 'fish' Ziemke
Eu tenho esse erro opção inválida - z. Parece que o tar padrão no busybox não suporta isso.
Dzung Nguyen
6
jq é muito legal, mas em vez de introduzir uma dependência, por que não usar docker inspects construído em templates assim: VOLUME=$( docker inspect -f '{{index .Volumes "/path/in/container"}}' "${NAME}-data" ). Provavelmente também é aconselhável lembrar as pessoas para não esperar fazer backup de arquivos dessa maneira enquanto estiverem ativamente em uso (por exemplo, bancos de dados).
Mc0e 29/07
2
No Docker 1.8, o formato mudou - Volumesdesapareceu e existem Mountsestruturas diferentes. Precisamos trabalhar um pouco mais rangepara encontrar o ponto de montagem em que estamos interessadosVOLUME=$(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/path/in/container" }}{{ .Source }}{{ end }}{{ end }}' "${NAME}-data")
Jarek Przygódzki
5

Na mais recente Docker (testado em 1.9.1, build 9894698) você pode usar o cpcomando .

Aqui está um exemplo de como copiar um diretório do contêiner para o host:

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

Aqui está um exemplo de como copiar um diretório do contêiner para um tararquivo:

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

Por último, mas não menos importante, um exemplo de como copiar um diretório do contêiner para um tar.gzarquivo:

docker cp wordpress:/var/www/html - | gzip > backups/wordpress.`date +"%Y%m%d"`.tar.gz
czerasz
fonte
2
docker cpenvia tudo pela rede. É algo que você deseja evitar, especialmente se o volume do Docker já é um volume btrfs.
Jarek Przygódzki
2
A pergunta menciona backup e restauração . Um exemplo de restauração nesta resposta usando docker cpseria bom.
madmike