Em ins­ta­la­ções Docker, dados são dis­tri­buí­dos entre di­fe­ren­tes objetos e arquivos. Jus­ta­mente por isso, in­fe­liz­mente, não existe um método universal para criar backups de dados in­di­vi­du­ais no Docker. Combinar di­fe­ren­tes comandos para a re­a­li­za­ção de um Docker backup é a solução que re­co­men­da­mos. Neste tutorial, ensinamos como salvar e restaurar dados no Docker.

Nosso Digital Guide já explicou o que é backup, apre­sen­tou di­fe­ren­tes es­tra­té­gias de backup e detalhou como criar backups de bancos de dados. Agora, de­mons­tra­re­mos como criar Docker backups.

O que levar em con­si­de­ra­ção ao fazer um Docker backup?

Ao contrário do mysqldump, utilizado em backups do MySQL e do pg_dump, usado em backups do Post­greSQL, não existe uma fer­ra­menta que se dedique ex­clu­si­va­mente a realizar Docker backups. Embora os comandos docker backup volume e docker backup container não consigam obter sucesso, há formas al­ter­na­ti­vas de se incluir com­po­nen­tes in­di­vi­du­ais do Docker em processos de backup. En­tre­tanto, antes de tudo, você deve decidir que com­po­nen­tes gostaria de incluir no backup.

Que com­po­nen­tes devem ser incluídos em um Docker backup?

Via de regra, você deve fazer backup de todos os dados que não podem ser re­cu­pe­ra­dos em caso de perda. Em se tratando de Docker, pelo menos três tipos de dados se encaixam nessa categoria:

  1. Objetos Docker: São ge­ren­ci­a­dos pelo Docker daemon; dados são ar­ma­ze­na­dos em um diretório especial. Não existe cor­res­pon­dên­cia direta entre os arquivos nele lo­ca­li­za­dos e os dados presentes no contêiner Docker. Crie backups para os seguintes objetos Docker:
    • Con­têi­ne­res Docker
    • Volumes Docker
    • Imagens Docker
  2. Arquivos build: São ge­ren­ci­a­dos pelo usuário e podem ser en­con­tra­dos em pastas ar­bi­trá­rias no sistema host. Arquivosbuildpodem ser fa­cil­mente copiados e com­pac­ta­dos. Crie backups para os seguintes arquivosbuild do Docker:
    • Pasta do projeto Docker Compose
    • Doc­ker­fi­les
  3. Bancos de dados em con­têi­ne­res: São ex­por­ta­dos de con­têi­ne­res como arquivos dump. Crie backups para os bancos de dados dos seguintes sistemas:
    • Bancos de dados MySQL
    • Bancos de dados Post­greSQL

A criação de Docker backups envolve a gravação de dados em arquivos com­pac­ta­dos no sistema host. Estes arquivos são, então, copiados do sistema local para o sistema de backup.

Pode ser in­te­res­sante au­to­ma­ti­zar processos se muitos Docker backups estiverem sendo criados ao mesmo tempo. Scripts que sim­pli­fi­cam a criação de Docker backups podem ser en­con­tra­dos no GitHub. O de­sen­vol­ve­dor Andreas Laub, por exemplo, dis­po­ni­bi­liza diversos scripts para Docker backup de código aberto.

Citação

“Com esses scripts, você pode fazer backup do seu ambiente Docker. Existem opções para o projeto Compose, MySQL, MariaDB, Post­greSQL e para volumes normais de Docker”. Tradução livre. Fonte: https://github.com/alaub81/backup_docker_scripts

Nota

Acon­se­lha­mos a re­a­li­za­ção de backups de dados do Portainer pe­ri­o­di­ca­mente, se você usa este software para ad­mi­nis­trar o seu ambiente Docker.

Onde dados de con­têi­ne­res Doc­ker­de­vem ser ar­ma­ze­na­dos?

Passo essencial para a re­a­li­za­ção de backups é a cópia de dados. Antes de tudo, você deve descobrir onde eles ficam ar­ma­ze­na­dos. Volumes Docker nada mais são que locais de ar­ma­ze­na­mento para trans­fe­rên­cias entre con­têi­ne­res Docker e o sistema host, ou entre múltiplos con­têi­ne­res.

Um contêiner Docker é criado a partir de uma imagem Docker do tipo somente leitura. Fazer al­te­ra­ções em um contêiner em execução é arriscado e pode resultar em perdas, caso o contêiner seja excluído. Por isso, realize backups per­ma­nen­tes desses dados antes de exportá-los de um contêiner em execução.

Dados de con­têi­ne­res também podem ser ar­ma­ze­na­dos no contêiner em execução, jun­ta­mente com volumes Docker. Dados estes que per­ma­ne­cem na camada de ar­ma­ze­na­mento gravável do sistema de arquivos do contêiner. Na maioria dos casos, isso não deveria ocorrer. Portanto, configure o seu sistema de forma in­te­li­gente ao usar volumes Docker.

Definir onde, exa­ta­mente, dados de con­têi­ne­res devem ser ar­ma­ze­na­dos é uma tarefa complexa, pois existem di­fe­ren­tes tipos de volumes Docker. As di­fe­ren­ças são sutis, e dizem respeito à lo­ca­li­za­ção e à des­ti­na­ção dos dados quando o contêiner é removido, já que ambas dependem do tipo de volume em questão. Apre­sen­ta­mos, abaixo, os prin­ci­pais com­po­nen­tes de ar­ma­ze­na­mento do Docker:

Com­po­nente de ar­ma­ze­na­mento Docker Lo­ca­li­za­Ã§Ã£o Após remoção do contêiner
Camada gravável do contêiner Sistema de arquivos Union Dados são perdidos
Bind mount Pasta no sistema de arquivos host Dados são mantidos
Volume nomeado Dentro do ambiente Docker Dados são mantidos
Volume anônimo Dentro do ambiente Docker Dados são perdidos

Passo a passo para fazer um Docker backup

Ge­ral­mente, para criar um arquivo tarball durante um Docker backup, usa-se o comando tar. Esta é a estrutura geral dele:

tar -cvf <caminho/para/arquivo compactado>.tar <caminho/para/arquivo ou pasta>

No entanto, o caminho completo para a pasta com­pac­tada é incluído no arquivo, quando ha­bi­li­tado, o que pode causar erros durante o processo de res­tau­ra­ção. Para contornar este problema, há uma abordagem al­ter­na­tiva:

cd <caminho/para/arquivo ou pasta> && tar -cvf <caminho/para/arquivo compatado>.tar .

Primeiro, você precisa modificar a pasta a ser arquivada e aplicar o comando tar à pasta atual, indicada por um ponto ( . ) no terminal. A com­bi­na­ção desses dois passos com o operador && garante que a com­pac­ta­ção seja realizada somente se a alteração da pasta de destino for bem-sucedida.

Os arquivos .tar criados durante o processo de com­pac­ta­ção de dados do Docker podem ser en­con­tra­dos no sistema host. Estes arquivos com­pac­ta­dos devem ser trans­fe­ri­dos para um sistema de backup, para que o backup seja criado. Para isso, faça uso de algum tipo de ar­ma­ze­na­mento externo ou em nuvem. Ainda, utilize fer­ra­men­tas especiais que ajudam com a trans­fe­rên­cia, como Rsync e S3.

Dica

Aprenda como criar backup de servidor com Rsync no nosso artigo es­pe­ci­a­li­zado.

A tabela abaixo esboça os passos ne­ces­sá­rios para a criação de Docker backups, com os res­pec­ti­vos comandos. Em alguns casos, mais de uma abordagem pode ser usada:

Objeto Docker Criação de backup Exemplo de comando
Contêiner Docker Salvar como imagem Docker docker container commit <id contêiner> <nome do backup>
Imagem Docker Exportar como arquivo tarball e enviar ao registro docker image save–output<backup da imagem>.tar <id-imagem>/ docker image push <id imagem>
Volume Docker Montar volume no contêiner e criar arquivos tarball a partir do contêiner docker run --rm --volumes-from <id contêiner> --volume <host:contêiner> <imagem> bash -c "tar -cvf <backup do volume>.tar <caminho/para/dados/volume>"
Pasta do projeto Docker Compose Criar arquivo tarball; ver­si­o­na­mento com Git tar -cvf <backup compose>.tar </caminho/para/diretorio-compose>
Doc­ker­file Salvar arquivo; ver­si­o­na­mento com Git tar -cvf <backup-dockerfile>.tar <caminho/para/dockerfile>

Su­po­nha­mos que seus arquivos de backup sejam ar­ma­ze­na­dos em /backup/ diretório inicial ao serem criados. Neste caso, crie a seguinte pasta, como passo pre­pa­ra­tó­rio:

mkdir -p ~/backup/

Criar backup do Docker contêiner

Dados presentes em con­têi­ne­res Docker são ar­ma­ze­na­dos em camadas do tipo somente leitura, em um sistema de arquivos Union. Um contêiner Docker é baseado em uma imagem somente leitura, contendo, ainda, camada adicional gravável, além de camadas de imagem.

Você deve criar uma nova imagem, a partir do contêiner em execução, para fazer um backup per­ma­nente dos dados da camada gravável. Para tanto, utilize o comando docker commit. Faça backup do conteúdo da imagem como arquivo tarball seguindo os passos descritos abaixo:

  1. Grave o sistema de arquivos Docker como imagem
docker container commit <id contêiner> <nome do backup>
  1. Exporte a imagem re­sul­tante como arquivo com­pac­tado tarball
docker image save --output ~/backup/<nome do backup>.tar <nome do backup>

Al­ter­na­ti­va­mente, envie a imagem re­sul­tante ao re­po­si­tó­rio, uti­li­zando, para tanto, o comando docker image push:

docker image push <nome do backup>
Nota

O comando docker container export também pode ser usado para exportar o sistema de arquivos do contêiner. No entanto, este pro­ce­di­mento reduz todas as camadas a uma só. Por conta disso, não re­co­men­da­mos a uti­li­za­ção do comando para a criação de Docker backups.

Criar backup de imagem Docker

Abordagem se­me­lhante é adotada para fazer backup de uma imagem Docker presente no host local. Da mesma forma, dados de imagem devem ser gravados em um arquivo tarball:

docker image save --output ~/backup/<nome da imagem>.tar <nome da imagem>

Criar backup de volume Docker

Fazer backup de volumes Docker é um processo mais complexo, pois é preciso separá-los entre bind mounts, nomeados e anônimos. O acesso a um volume bind mount pode ser feito di­re­ta­mente, pelo sistema de arquivos host. Exa­ta­mente por isso, a geração do arquivo tarball relativo à pasta é simples:

cd <caminho/para/docker mount/> && tar -cvf ~/backup/<backup do volume>.tar .

Realizar backups de volumes nomeados e anônimos é diferente, pois ambos só podem ser acessados por meio de con­têi­ne­res Docker em execução. O segredo para compactar dados contidos nestes volumes Docker é iniciar um contêiner com acesso aos volumes, portanto. Ao fazer isso, arquive os dados dos volumes por meio do contêiner em execução. O passo a passo esclarece o processo:

  1. In­ter­rompa o contêiner com acesso ao volume
docker stop <id contêiner>
  1. Inicie um contêiner tem­po­rá­rio e extraia os dados do volume

O contêiner tem­po­rá­rio tem acesso aos volumes desejados, bem como à pasta de backup no host.

docker run --rm --volumes-from <id contêiner> --volume ~/backup:/backup ubuntu bash -c "cd <caminho/para/dados/volume> && tar -cvf /backup/<backup-do-volume>.tar ."
  1. Reinicie o contêiner com acesso ao volume
docker start <id-contêiner>

O comando para extrair dados de volumes Docker é complexo. Observe, em detalhes, seus com­po­nen­tes in­di­vi­du­ais:

Com­po­nente do comando Ex­pli­ca­Ã§Ã£o
--rm Instrui o Docker a remover o novo contêiner após fazer backup do volume.
--volumes-from <id contêiner> Monta volumes do contêiner es­pe­ci­fi­cado no novo contêiner e torna os dados nele contidos aces­sí­veis.
--volume ~/backup:/backup Cria bind mount entre a pasta ~/backup/ no sistema host e a pasta /backup/ dentro do contêiner.
ubuntu Es­pe­ci­fica que o novo contêiner deve carregar uma imagem Ubuntu Linux.
bash -c "cd …" Cria arquivo tarball de dados de volume dentro da pasta /backup/ do contêiner recém-iniciado. A conexão dessa pasta com a pasta ~/backup/, no sistema host, torna o arquivo com­pac­tado acessível fora do Docker.

Criar backup da pasta do projeto Docker Compose

Um arquivo tarball também deve ser criado para que o backup da pasta do projeto Docker Compose seja realizado com sucesso:

cd <caminho/para/docker-compose> && tar -cvf ~/backup/<backup do compose>.tar .
Nota

Re­co­men­da­mos que você faça o ver­si­o­na­mento do arquivo docker-compose.yaml com Git. O ar­ma­ze­na­mento de dados sensíveis, como senhas, em arquivos .env separados é im­por­tante. Exclua-os de ve­ri­fi­ca­ções de versões com .gitignore.

Criar backup de Doc­ker­file

Mude a pasta que contém o Doc­ker­file e gere um arquivo tarball do mesmo, para a re­a­li­za­ção de um backup completo. Para tanto, faça uso do código abaixo:

cd <caminho/para/dockerfile> && tar -cvf ~/backup/<backup do dockerfile>.tar ./Dockerfile
Nota

Re­co­men­da­mos que você faça o ver­si­o­na­mento do arquivo Doc­ker­file com Git. O ar­ma­ze­na­mento de dados sensíveis, como senhas, em arquivos .env separados é im­por­tante. Exclua-os de ve­ri­fi­ca­ções de versões com .gitignore.

Criar backups de bancos de dados em con­têi­ne­res Docker

Atu­al­mente, bancos de dados são, em sua grande maioria, baseados em con­têi­ne­res. Assim, fer­ra­men­tas de backup es­pe­cí­fi­cas para bancos de dados são am­pla­mente uti­li­za­das na criação de backups de bancos de dados exe­cu­ta­dos em con­têi­ne­res Docker. Entre elas estão mysqldump e pg_dump. Ambas operam dentro de con­têi­ne­res Docker.

O comando docker exec executa a ação, como mostra o exemplo abaixo, relativo a um banco de dados MySQL. Observe que o comando mysqldump opera dentro do contêiner. O dump re­sul­tante é enviado à saída padrão do shell do host e gravado na pasta de backup do host local, por meio de um re­di­re­ci­o­na­mento:

docker exec <id contêiner> /usr/bin/mysqldump --user=root --password=<senha> <nomedb> > ~/backup/<nomedb>.sql

O backup de um banco de dados Post­greSQL executado em um contêiner Docker é feito de forma similar. Caso o nome de usuário e a senha do banco de dados estejam ar­ma­ze­na­dos no arquivo .pgpass dentro do contêiner, um backup com formato per­so­na­li­zado de dump deve ser criado assim:

docker exec <id contêiner> pg_dump --format=custom --dbname=<nomedb> > ~/backup/<nomedb>.dump

Também é possível criar um clássico SQL dump de texto simples. Basta que você adicione as opções --clean e --if-exists ao comando, com o objetivo de limpar o banco de dados de destino antes da im­por­ta­ção, para que o dump seja importado do sistema de origem sem mensagens de erro:

docker exec <id contêiner> pg_dump --format=plain --clean --if-exists --dbname=<nomedb> > ~/backup/<nomedb>.dump

Passo a passo para restaurar um Docker backup

Agora que você já sabe como criar backups de dados do Docker, deve aprender como restaurar dados a partir de um Docker backup. Su­po­nha­mos que todos os backups que você realizou estejam salvos na pasta ~/backup/ do host local. Pri­mei­ra­mente, copie os backups da mídia de backup para a pasta de backup.

Restaurar con­têi­ne­res Docker a partir de um backup

Lembre-se que geramos uma nova imagem a partir de um contêiner em execução, e a salvamos como arquivo com­pac­tado tarball, para criarmos o backup de um contêiner Docker. Par restaurar uma imagem Docker a partir do arquivo tarball cor­res­pon­dente, use o comando docker image load:

docker image load --input ~/backup/<nome da imagem>.tar

Agora, inicie um novo contêiner a partir da imagem re­sul­tante. Para iniciar um novo contêiner em segundo plano, faça uso da opção -detach:

docker run --detach <id imagem>
Dica

Use o comando docker image ls para obter uma lista das imagens Docker dis­po­ní­veis, bem como dos res­pec­ti­vos nomes e IDs.

Restaurar imagens Docker a partir de um backup

Já ensinamos como recuperar uma imagem Docker a partir de um arquivo tarball: uti­li­zando o comando docker image load:

docker image load --input ~/backup/<nome da imagem>.tar

Restaurar volumes Docker a partir de um backup

Restaurar dados de volumes Docker a partir de backups é um processo complexo, pois os passos exatos a serem re­a­li­za­dos dependem de cada cenário de im­ple­men­ta­ção. Mos­tra­re­mos, neste tutorial, como so­bres­cre­ver dados de volume a partir de um backup, supondo que o sistema seja o mesmo em que o backup foi criado, e que lá estejam presentes con­têi­ne­res, volumes e outros objetos Docker en­vol­vi­dos. Caso o sistema tenha sido con­fi­gu­rado re­cen­te­mente, o pro­ce­di­mento será ainda mais com­pli­cado.

A res­tau­ra­ção de um backup de volume Docker requer um contêiner tem­po­rá­rio com acesso ao volume. O fun­ci­o­na­mento deste comando já foi descrito por nosso tutorial. Siga nosso passo a passo detalhado:

  1. In­ter­rompa os con­têi­ne­res que utilizam o volume
docker stop <id contêiner>
  1. Inicie um contêiner tem­po­rá­rio com acesso ao volume e copie os dados de backup no volume Docker
docker run --rm --volumes-from <id-contêiner> --volume ~/backup:/backup ubuntu bash -c "cd <caminho/para/dados/volume> && tar -xvf /backup/<backup-do-volume>.tar"
  1. Reinicie os con­têi­ne­res que utilizam o volume
docker start <id contêiner>

Restaurar pasta do projeto Docker Compose a partir de um backup

O processo de res­tau­ra­ção da pasta do projeto Docker Compose, a partir de um backup, é bastante direto. Navegue até a pasta do Docker Compose e des­com­pacte o arquivo tarball dentro dela. O processo subs­ti­tuirá os dados exis­ten­tes.

cd <caminho/para/docker-compose> && tar -xvf ~/backup/<backup do compose>.tar

Restaurar Doc­ker­file a partir de um backup

O processo de res­tau­ra­ção de um Doc­ker­file, a partir de um arquivo tarball, é simples. Basta des­com­pac­tar o arquivo tarball dentro da pasta do Doc­ker­file, para que o Doc­ker­file existente seja subs­ti­tuído.

cd <caminho/para/dockerfile> && tar -xvf ~/backup/<backup do dockerfile>.tar

Restaurar bancos de dados de con­têi­ne­res Docker a partir de um backup

Use o comando docker exec para restaurar um banco de dados ar­ma­ze­nado em um contêiner Docker, a partir de um backup. A opção --interactive inicia o contêiner no modo in­te­ra­tivo e mantém a entrada padrão aberta.

Gere o conteúdo do dump MySQL usando o comando cat, ca­na­li­zando a saída para o comando Docker no host local. O comando mysql, executado dentro do contêiner, processa as de­cla­ra­ções SQL que re­cons­troem o banco de dados.

cat ~/backup/<nomedb>.sql | docker exec --interactive < id contêiner> /usr/bin/mysql --user=root --password=<senha> <nomedb>

O processo de res­tau­ra­ção de um banco de dados Post­greSQL é um pouco mais complexo. Para realizá-lo, utilize duas fer­ra­men­tas de auxílio, que podem ser aplicadas de­pen­dendo do formato do dump do banco de dados. Execute a fer­ra­menta pg_restore tool dentro do contêiner para restaurar um banco de dados no formato Post­greSQL per­so­na­li­zado. Use o re­di­re­ci­o­na­mento de entrada para alimentar o arquivo dump como entrada:

docker exec --interactive <id contêiner> pg_restore --dbname=<nomedb> < ~/backup/<nomedb>.dump

A res­tau­ra­ção de um dump de banco de dados Post­greSQL em texto simples é similar à res­tau­ra­ção de um dump MySQL. Gere o arquivo dump com o comando cat e canalize a saída para o comando docker exec com a opção --interactive. O comando psql é executado dentro do contêiner, para processar comandos SQL e re­cons­truir o banco de dados.

cat ~/backup/<nomedb>.sql | docker exec --interactive <id contêiner> psql --user=root --password=<senha> <nomedb>
Ir para o menu principal