Backup e restauração do volume do Docker

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

Por exemplo, um dos serviços é um aplicativo da web onde os usuários podem fazer upload de arquivos. Para este recipiente, eu tenho um /files volume que eu quero fazer backup. Host montagens parece que eles são um pouco desaprovada, porque tal montagem é de forma alguma portátil & mdash; como dito em esta postagem do blog e o documentação do docker para volumes.

Eu sei pelo mesmo post que eu não precisar uma montagem de host para acessar os arquivos em um volume, posso usar docker inspect para descobrir onde estão os arquivos.

Mas aqui está o meu problema: eu estava pensando em fazer backup apenas dos arquivos dockerfiles necessários para construir os contêineres e os volumes associados a eles. No caso provável de eu ter que restaurar tudo do backup, como eu iria saber qual diretório de volume corresponde a qual contêiner? Reconstruir o contêiner faz com que o id e o caminho do volume mudem, então eu precisaria de algumas informações extras para combiná-las. O que mais, se alguma coisa, devo fazer backup para poder realmente restaurar tudo?

Tens razão. Como você pode ter vários contêineres com volumes por conta própria, você precisa acompanhar qual volume corresponde a qual contêiner.Como fazer isso depende da sua configuração: eu uso o nome-dados para o contêiner de dados, então é óbvio a qual contêiner uma imagem pertence. Dessa forma, pode ser feito backup assim:

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 de volume no contêiner
  • nome do recipiente ao qual o volume pertence

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

No Docker mais recente (testado em 1.9.1, build 9894698) você pode usar o cp comando.

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 tar arquivo:

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.gz arquivo:

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