Home > Blog de Apoio e Recuperação > Como fazer backup dos contêineres do Docker? Métodos de backup de contêineres do Docker.

Como fazer backup dos contêineres do Docker? Métodos de backup de contêineres do Docker.

Atualizado 6th dezembro 2023, Rob Morrison

Embora o Docker – e todos os contêineres – normalmente sejam um pouco mais recentes em um ambiente de TI de produção do que a maioria das outras tecnologias, ainda é necessário fazer backup desses contêineres, de seus aplicativos e de seus dados persistentes. Se um sistema de TI de produção produzir dados persistentes, esses dados provavelmente terão algum valor. Podem até ser de importância crítica. Portanto, é provável que seja necessário proteger esses dados caso ocorra algum tipo de desastre, por exemplo, como resultado de uma violação de dados ou erro humano.

Este tópico aborda a capacidade do Docker de criar backups por si só, bem como a capacidade de várias soluções de terceiros de criar backups abrangentes do Docker, como o Bacula Enterprise.

Backup e restauração do contêiner do Docker

Isso geralmente começa com o commit do contêiner em questão como uma imagem, usando o seguinte comando:


# docker commit -p [container-id] backup01
sha256:89682d4xxxxxx

Essa imagem pode ser salva como um arquivo .tar com outro comando:


# docker save -o backup01.tar backup01
# ls -al | grep back
-rw——- 1 root root 178697728 Mar 31 23:35 backup01.tar

O arquivo .tar também pode ser salvo no ponto de montagem NFS. Uma alternativa para isso é enviar a imagem em questão (backup01) diretamente para o seu registro local. Para fazer isso, primeiro teremos que marcar a imagem de forma apropriada:


# docker tag backup01 localhost:5000/backup-image:v1

Nesse caso, localhost é o nome do local e 5000 é o número da porta. Ambos podem ser alterados, se necessário. Também é importante lembrar que tanto o nome da tag quanto o repositório devem estar em letras minúsculas para que a tag seja aplicada corretamente. O processo é concluído com o início do comando push:


# docker push backup-image:v1

Como discutimos dois métodos de backup, também haverá dois métodos de restauração. Para restaurar a imagem de backup a partir de um arquivo .tar, o senhor terá que iniciar o seguinte comando:


# docker load -i /tmp/backup01.tar

A linha de comando deve mostrar ao senhor as linhas de status subsequentes se o comando tiver sido inserido corretamente:


ff91b8b5abb1: Loading layer [======================>] 2.56 kB/2.56 kB
Loaded image: backup01:latest

Outro comando chamado docker run pode ser usado para criar um contêiner a partir dessa imagem.

Uma imagem enviada pode ser puxada diretamente com um comando relativamente simples:


# docker pull localhost:5000/backup-image:v1

Como no exemplo anterior, tanto o nome do localhost quanto o número da porta estão sujeitos a alterações, se necessário.

Backup e restauração de volumes do Docker

Outro tipo de backup do Docker é por meio de volumes – provedores de armazenamento persistente para contêineres do Docker. É necessário fazer o backup desses volumes para a continuidade dos dados.

Quando se trata de gerenciamento de dados persistentes dentro dos contêineres do Docker em execução, os volumes do Docker são a maneira mais recomendada de gerenciar tudo isso. Esse tipo de abordagem oferece várias vantagens diferentes. Por exemplo, os dados armazenados no contêiner do Docker por meio de volumes são efetivamente isolados do restante do sistema de arquivos, o que torna muito mais difícil serem afetados por ataques cibernéticos em todo o sistema. No entanto, esse tipo de isolamento também dificulta a criação de volumes de backup do Docker.

Além disso, os volumes eliminam a necessidade de se preocupar com a GUI e o UID entre o sistema de contêineres do Docker e o sistema operacional. Os próprios volumes são portáteis quando se trata de diferentes instalações do Docker, o que significa que não há necessidade de se preocupar com o sistema operacional do host. Ao mesmo tempo, essa abordagem portátil possibilita o gerenciamento de volumes do Docker com várias ferramentas externas, como armazenamento baseado em bucket, nfs etc.

Como os volumes do Docker são quase necessários para criar realisticamente diferentes contêineres do Docker com dados persistentes, é natural garantir que o senhor também tenha volumes de backup do Docker – esse tipo de dado é pelo menos tão importante quanto qualquer outro dado dentro do seu sistema, se não for mais importante.

É claro que o uso de volumes do Docker para armazenar dados de contêineres pode não ser exatamente conveniente e há alguns problemas de crescimento aqui e ali. Por exemplo, o senhor teria que aprender vários comandos diferentes para fazer algo tão simples como copiar informações para fora do contêiner. O senhor também teria que conhecer vários comandos para conseguir acessar um shell em um Docker em execução e ver o status atual.

Pode ser mais difícil tornar visível a totalidade dos dados do volume do Docker dentro do seu sistema de arquivos centralizado, pois ele funciona de uma maneira ligeiramente diferente dos locais de armazenamento tradicionais – e o senhor teria que criar volumes de backup do Docker com a mesma finalidade com que costuma criar backups dos seus dados regulares.

Normalmente, os volumes do Docker são gerenciados pelo daemon do Docker; no entanto, não vamos interagir com ele de forma alguma. A ideia de um volume de backup do Docker é obter uma cópia do volume como um arquivo compactado em um dos diretórios locais. Essa cópia é o backup que estamos procurando.

Neste exemplo, nosso contêiner em questão chama-se dckr-site com o volume chamado dckr-volume, é montado em /var/lib/dckr/content/ e armazena todos os dados lá.

A primeira etapa é parar o contêiner usando o seguinte comando:


$ docker stop dckr-site

A próxima se concentra tanto na montagem do contêiner quanto no backup do conteúdo do volume:


$ mkdir ~/backup
$ docker run –rm –volumes-from dckr-site -v ~/backup:/backup ubuntu bash -c “cd /var/lib/dckr/content && tar cvf /backup/dckr-site.tar .”

Nesse cenário:

  • docker run é usado para criar um novo contêiner,
  • –rm O comando informa ao sistema para remover o contêiner assim que a operação for concluída;
  • –volumes-from dckr-site está montando os volumes do contêiner em nosso novo contêiner temporário;
  • bash -c “cd /var/lib/dckr/content && tar cvf /backup/dckr-site.tar” cria um backup de todo o conteúdo do diretório /backup/

O processo de recuperação desses backups não é muito complicado. Ele começa com a criação de um novo volume com o seguinte comando:


$ docker volume create dckr-volume-2

Em seguida, o senhor pode usar o seguinte comando para restaurar o volume de um contêiner temporário em um arquivo .tar:


$ docker run –rm -v dckr-volume-2:/recover -v ~/backup:/backup ubuntu bash -c “cd /recover && tar xvf /backup/dckr-site.tar”

É claro que o senhor terá que montar esse novo volume no novo contêiner para que ele funcione corretamente:


$ docker run -d -v dckr-volume-2:/var/lib/dckr/content -p 80:2368 dckr:latest

Se o procedimento for feito corretamente, todo o estado do aplicativo deverá ser restaurado. É importante mencionar que não se deve confiar nesse método como uma única fonte de backup, pois os dados de backup ainda estão armazenados no host e, portanto, seriam perdidos em caso de perda de dados ou desastre que afete o host também.

Abordagem alternativa para backup e restauração de volumes do Docker

É natural que todos os sistemas modernos evoluam e mudem com o tempo, e o Docker não é exceção, especialmente com uma comunidade tão grande de usuários e desenvolvedores. Como exemplo, há uma abordagem alternativa para fazer o backup de volumes do Docker que alguns usuários podem preferir à primeira opção por um motivo ou outro.

A primeira etapa aqui seria definir o nome do volume. O comando em questão é diferente para os usuários do Windows (PowerShell) e do Linux/macOS; os primeiros precisam do comando $VOLUME=”name_volume”, enquanto os últimos contam com o comando VOLUME=”name_volume”.

Quando isso for concluído, a primeira opção é executar um comando de backup:


docker run –rm \
-v “${VOLUME}:/data” \
-v “${PWD}:/backup-dir” \
ubuntu \
tar cvzf /backup-dir/backup.tar.gz /data

A parte /data representa o destino de destino e pode ser modificada, se necessário.

O comando Restore seria diferente disso, é claro, e o exemplo abaixo mostra isso muito bem:


docker run –rm \
-v “${VOLUME}:/data” \
-v “${PWD}:/backup-dir” \
ubuntu \
bash -c “rm -rf /data/{*,.*}; cd /data && tar xvzf /backup-dir/backup.tar.gz –strip 1”

Deve-se observar que a parte rm -rf /data/{*,.*} existe para excluir todos os arquivos existentes antes da restauração do backup, mas a natureza do Docker significa que ele inclui dois comandos diferentes – um para excluir todos os arquivos e pastas que começam com um ponto e outro para arquivos que não começam com um ponto. No entanto, há dois “arquivos” invisíveis em cada contêiner chamados “.” e “..” que não são tecnicamente arquivos em primeiro lugar, e é por isso que eles não podem ser excluídos.

Dessa forma, as duas primeiras mensagens de saída após a execução do comando Restore seriam sobre a incapacidade de remover esses arquivos – isso é normal e não afeta o restante do processo de forma alguma.

Existem algumas diferenças importantes entre esse método e os que oferecemos anteriormente:

  • Os três argumentos tar existentes anteriormente (c, v e f, como em cvf) agora são incluídos como cvzf – para que o arquivo de backup seja compactado automaticamente após sua criação.
  • Os caminhos de destino do volume de backup são especificados em cada comando de backup, facilitando a localização posterior. Essa é uma abordagem diferente do uso do comando –volumes-from, uma vez que o último não mostra os nomes dos volumes ou seus caminhos de destino para o usuário em questão.
  • O processo de restauração inclui o comando para excluir todos os dados de volume existentes antes de executar uma operação de restauração para garantir o processo de restauração adequado. Além disso, há uma razão para que o ponto e vírgula seja usado entre os comandos tar xvzf e rm, já que o uso de && (semelhante ao funcionamento do nosso primeiro método) significa que toda a cadeia de comandos para completamente depois de enfrentar a primeira falha de comando.

Obviamente, esse comando específico só é adequado como exemplo manual para backups de volume do Docker, pois cada execução de comando produz um backup full – algo que seria altamente ineficiente em termos de tempo e espaço de armazenamento se esse comando fosse automatizado e executado regularmente (e nem mesmo a compactação pode resolver esse problema).

Práticas recomendadas de gerenciamento de volumes do Docker

Trabalhar com volumes do Docker pode ser um grande desafio – é uma ferramenta muito útil, mas tem suas próprias nuances com as quais a maioria dos usuários precisa se acostumar mais cedo ou mais tarde. Para tornar esse processo um pouco mais fácil, podemos examinar alguns conselhos e práticas recomendadas para o gerenciamento de volumes do Docker:

  • Implementar métodos consistentes para anexar e desanexar volumes aos contêineres.
  • Empregue convenções de nomenclatura consistentes e significativas para facilitar a identificação e o gerenciamento de volumes.
  • Evite criar volumes desnecessários, pois cada volume consome recursos.
  • Verifique regularmente os volumes para identificar e resolver problemas de capacidade ou armazenamento excessivo de dados.
  • Evite o acesso simultâneo de gravação à mesma unidade por vários contêineres para evitar a corrupção de dados.
  • Implemente medidas de segurança adequadas para proteger dados confidenciais armazenados em volumes.
  • Atribua nomes claros e descritivos aos volumes para melhor organização e gerenciamento.

Scripts personalizados e imagens do Docker

Como o Docker tem uma comunidade bastante grande de indivíduos altamente qualificados, não deve ser tão surpreendente saber que há muitos scripts e imagens personalizados para fins de backup do Docker.

Uma imagem do Docker de Offen é um bom exemplo disso. É um contêiner complementar leve que pode executar backups de volume individuais ou regulares do Docker em um diretório de destino específico – diretório local, Azure Blob, S3, Dropbox, WebDAV etc. Ele também tem a capacidade de eliminar backups antigos, pode criptografar backups com GPG e as tarefas de backup com falha fornecem notificações ao usuário.

O processo de configuração inicial é bastante fácil (todas as informações podem ser encontradas no link acima) e o exemplo de linha de comando para uma única operação de backup deve ser parecido com este:


docker run –rm -v data:/backup/data 
  –env AWS_ACCESS_KEY_ID=”<key_id>” \
  –env AWS_SECRET_ACCESS_KEY=”<access_key>” \
  –env AWS_S3_BUCKET_NAME=”<bucket_name>” \
  –entrypoint backup \
  offen/docker-volume-backup:v2

É claro que esse é apenas um exemplo, mas há muitas outras opções disponíveis no mercado para usuários que estejam dispostos a dedicar tempo e esforço para aprender a usá-las.

Volumes Backup & Share

Os usuários que não estão tão familiarizados com a lógica de uma interface de linha de comando usada para executar todas as tarefas mencionadas acima podem estar procurando uma maneira mais fácil de trabalhar com os contêineres do Docker como um todo. Felizmente, há uma solução para esse problema: um aplicativo oficial do Docker Desktop que oferece uma GUI simples para gerenciamento de aplicativos, gerenciamento de contêineres e muito mais.

Esse mesmo aplicativo também tem um mercado de extensões, que oferece muitas extensões diferentes para expandir ou modificar a funcionalidade da solução em alguma capacidade. As extensões podem ser oficiais ou geradas pelo usuário, mas a que nos interessa é fornecida pelo próprio Docker.

O Volumes Backup & amp; Share é a extensão oficial de gerenciamento de volumes do Docker para o Docker Desktop, oferecendo uma maneira perfeita de trabalhar com volumes, incluindo suas operações de backup e restauração, bem como clonagem, compartilhamento e muito mais.

A solução em questão oferece quatro tipos diferentes de backup:

  • Uma nova imagem.
  • Um backup de arquivo (um tarball compactado com gzip, semelhante ao que discutimos anteriormente).
  • Um registro de imagem.
  • Uma imagem existente.

Outros recursos incluem a capacidade de importar ou restaurar volumes, a capacidade de transferir volumes de um host para outro, e tudo isso pode ser feito sem nenhum comando CLI envolvido – uma ótima opção para um público-alvo específico.

SnapShooter da Digital Ocean

Mudando nosso foco para opções de backup de terceiros para o Docker, podemos começar com SnapShooter. O SnapShooter é uma solução de backup relativamente nova que costumava ter como alvo específico as ofertas da DigitalOcean. Ela foi expandida para outros provedores alguns anos depois e foi adquirida pela DigitalOcean no início de 2023.

Como o próprio nome sugere, a principal oferta do SnapShooter é a capacidade de realizar snapshots, embora tenha sido expandido para incluir também backups de arquivos, backups de bancos de dados, backups de aplicativos etc. Quanto aos recursos do Docker, o SnapShooter pode oferecer suporte para backup de volume do Docker, bem como cobertura de backup de banco de dados para MongoDB, MySQL e Postgres executados no Docker.

O SnapShooter também pode oferecer uma interface bastante amigável que ajuda seus usuários a realizar uma variedade de tarefas diferentes. Isso inclui a criação de backup e processos de restauração de dados para volumes do Docker.

Duplicati

Outra opção de backup de terceiros para volumes do Docker que é um pouco diferente é o Duplicati. O Duplicati é uma solução de backup gratuita bastante conhecida, com uma estrutura de código aberto, que oferece a capacidade de criar backups de dados e movê-los para uma variedade de locais de destino de armazenamento, sejam eles servidores remotos, NAS ou serviços de nuvem.

Como o Duplicati é uma oferta gratuita e de código aberto, é um pouco mais difícil trabalhar com ele para um usuário comum. No entanto, ele ainda pode ser usado para configurar backups regulares de volumes do Docker usando uma sequência específica de comandos. Deve-se observar que este exemplo usa um contêiner Docker específico – linuxserver/duplicati.

A primeira etapa aqui seria executar o comando chamado id $user para garantir que o host atual tenha permissões de raiz para todas as tarefas futuras. O comando em questão, bem como a resposta, deve ter a seguinte aparência:


root@debian:~# id $user
uid=0(root) gid=0(root) groups=0(root)

O número zero nos campos gid e uid representa o status de um usuário root.

O próximo comando executa o contêiner do Docker mencionado anteriormente linuxserver/duplicati dentro do seu sistema:


docker run -d \
  –name=duplicati \
  -e PUID=0 \
  -e PGID=0 \
  -e TZ=Etc/UTC \
  -p 8200:8200 \
  -v duplicati-config:/config \
  -v /tmp/backups:/backups \
  -v /:/source \
  –restart unless-stopped \
  lscr.io/linuxserver/duplicati:latest

Assim que esse comando for inserido, o senhor poderá acessar a UI da Web do Duplicati visitando http://<server_ip>:8200 na barra de pesquisa do seu navegador da Web.

Depois que a execução inicial for concluída, é importante que o contêiner em questão seja interrompido com o comando docker stop <id_cont> , no qual o usuário digita o ID exclusivo do contêiner.

A maioria dos tipos de interface gráfica para o gerenciamento de contêineres do Docker também deve ser capaz de executar essa próxima etapa, mas, para este exemplo, vamos analisar a versão da CLI. Aqui, temos que modificar o comando de lançamento de contêiner do Docker usado anteriormente, substituindo o campo /source pelo local exato de cada volume do qual o senhor deseja fazer backup.


docker run -d \
  –name=duplicati \
  -e PUID=0 \
  -e PGID=0 \
  -e TZ=Etc/UTC \
  -p 8200:8200 \
  -v duplicati-config:/config \
  -v /tmp/backups:/backups \
  -v volume1:/source/volume1 \
  -v volume2:/source/volume2 \
  –restart unless-stopped \
  lscr.io/linuxserver/duplicati:latest

Quando esse processo for concluído, é recomendável reiniciar o contêiner do Duplicati antes de continuar. Nossa última etapa aqui é começar a usar a UI da Web do Duplicati para iniciar os trabalhos de backup. Use o botão Add backup e siga o assistente de backup para fazer exatamente isso. O senhor teria que apontar para os dados exatos dos quais deseja fazer backup – os volumes do Docker que mapeou devem estar localizados na categoria Source data no assistente de backup. Os próprios backups são salvos no diretório /tmp/backups (pode ser modificado).

Analisamos uma solução de backup do Docker em pequena escala e uma opção gratuita de backup de volume do Docker. Agora é hora de ver como as soluções de backup corporativo em grande escala funcionam com a mesma tarefa.

Backup e restauração do Docker com o Bacula Enterprise

Bacula Enterprise utiliza sua capacidade modular para permitir a integração nativa de vários sistemas e serviços, incluindo o Docker. O Bacula é um software de backup e recuperação abrangente e em rede, projetado para suportar as cargas de trabalho pesadas de empresas de médio e grande porte. Ele também tem níveis de segurança especialmente altos em comparação com outras soluções de fornecedores de backup e, como tal, é utilizado pela grande maioria das organizações militares, de defesa e governamentais ocidentais. O módulo Docker do Bacula oferece muitos recursos adicionais úteis, além dos principais recursos de backup e recuperação.

O backup do Docker com o Bacula Enterprise consiste em três etapas simples:

  1. O estado atual do contêiner é salvo na nova imagem
  2. O utilitário do Docker é executado e os dados são salvos
  3. O snapshot em questão é removido para liberar espaço

O backup em questão pode ser realizado em um contêiner em todos os estados, e o software Bacula mostra o status do processo de backup em cada etapa. Cada backup de imagem de contêiner significa mais um arquivo .tar salvo. Os backups de imagens são mantidos no diretório /@docker/image//.tar, e os backups de contêineres são mantidos no diretório /@docker/container//.tar.

O processo de restauração de backups do Docker com o Bacula Enterprise é um pouco mais complicado e pode ser feito de duas maneiras diferentes:

  • Restore to local directory que utiliza o parâmetro where=/some/path Bacula para indicar o caminho completo para o backup a ser restaurado como um arquivo ou arquivos;
  • E Restore to Docker service, o que significa que os dados de backup seriam restaurados com o comando where= como o novo contêiner, sem arquivá-lo em primeiro lugar.

A personalização do processo de restauração também está disponível por meio de vários parâmetros diferentes, como container_create, container_run e outros.

No momento em que este artigo foi escrito, o Bacula é uma das poucas (ou a única) soluções de backup e recuperação de nível empresarial capaz de realizar backup completo e abrangente de um ambiente Docker. Ele também protege uma ampla gama de outras tecnologias de contêineres e é recomendado para ambientes de TI exigentes e de missão crítica devido à sua escalabilidade, confiabilidade e resiliência.

De modo geral, a disponibilidade de outras soluções especializadas em backup do Docker, combinada com a própria solução incorporada do Docker, juntamente com o módulo Docker do Bacula, significa que há uma gama de opções disponíveis para os gerentes de TI que buscam uma maneira de proteger sua implantação do Docker em produção.

Sobre o autor
Rob Morrison
Rob Morrison é o diretor de marketing da Bacula Systems. Ele começou sua carreira de marketing de TI na Silicon Graphics, na Suíça, e desempenhou intensamente várias funções de administração de marketing por quase 10 anos. Nos 10 anos seguintes, Rob também ocupou vários cargos de administração de marketing na JBoss, Red Hat e Pentaho, assegurando o crescimento da participação no mercado dessas empresas reconhecidas. Ele é formado pela Universidade de Plymouth e tem um diploma de honras em mídia digital e comunicação, além de ter feito um programa de estudos no exterior.
Deixe um comentário

Seu e-mail não será publicado. Os campos obrigatórios estão marcados com *