Como fazer backup de volumes Docker com scripts shell e cron
Aprenda a criar rotinas automatizadas no cron para compactar e exportar dados persistentes de containers Docker sem parar os serviços em execução.
Resumo
- Os volumes do Docker guardam arquivos vitais que precisam de proteção constante contra falhas físicas e corrupção.
- A ferramenta tar compacta o diretório de dados em um arquivo empacotado para economizar espaço de armazenamento.
- O agendador cron executa os scripts de forma autônoma em horários predeterminados sem intervenção humana.
- A exportação de dados sem derrubar o container garante alta disponibilidade para aplicações críticas em produção.
- Manter cópias externas dos backups protege o servidor contra desastres no hardware principal.
Por que automatizar o backup de volumes Docker?
Gerenciar dados persistentes em ambientes de containers exige disciplina operacional. Quando usamos o Docker para rodar bancos de dados, servidores de arquivos ou ferramentas de produtividade como o Obsidian via Git no cron, todo o estado importante da aplicação reside em volumes locais ou mapeados. Se o disco rígido apresentar falhas ou se um comando apagar os arquivos por engano, o prejuízo pode ser irreversível. Na prática, isso significa que confiar apenas na resiliência nativa dos containers é um risco alto demais para qualquer infraestrutura moderna.
A principal vantagem de criar uma rotina própria de cópias de segurança com scripts em shell é a flexibilidade total. Diferente de softwares comerciais fechados, o shell script permite que você decida exatamente quais pastas copiar, qual formato de compactação utilizar e para qual servidor remoto ou nuvem enviar os arquivos gerados. Além disso, essa abordagem se integra perfeitamente a ferramentas robustas de automação e ao ecossistema geral de gerenciamento de containers e recursos de kernel, mantendo o controle total nas mãos do engenheiro responsável.
Como funcionam os dados persistentes no Docker
Para entender o backup, primeiro precisamos compreender onde o Docker guarda as coisas. Os containers são efêmeros, o que significa que tudo o que é gerado dentro do seu sistema de arquivos interno desaparece assim que o container é destruído. Para evitar essa perda, utilizamos volumes nomeados ou bind mounts, que são pastas no sistema operacional hospedeiro conectadas diretamente ao mundo interno do container.
Na prática, o Docker armazena esses volumes em um diretório protegido do host, geralmente localizado em /var/lib/docker/volumes. Acessar essa pasta diretamente exige privilégios de administrador e pode gerar problemas de permissão se os arquivos forem modificados incorretamente enquanto o serviço roda. É exatamente por isso que a criação de um script centralizado que lê esses caminhos e gera arquivos compactados é a estratégia mais limpa e segura para manter o homelab ou o servidor de produção seguro contra imprevistos.
Criando o script shell para compactar e exportar
O coração da nossa rotina de backup é um script simples escrito em Bash. Ele deve localizar o diretório do volume, empacotar os arquivos usando utilitários nativos do Linux e salvar o resultado em um diretório dedicado a cópias de segurança. Para garantir que o processo ocorra sem falhas humanas, podemos estruturar as etapas em um arquivo executável que trata variáveis de data e limpeza de arquivos antigos.
Abaixo está um exemplo funcional de script que você pode adaptar para o seu ambiente. Ele cria um arquivo compactado com carimbo de data e hora, facilitando a identificação cronológica na hora de uma eventual restauração de emergência.
#!/bin/bash
BACKUP_DIR="/mnt/backups/docker"
SOURCE_VOL="/var/lib/docker/volumes/meu_volume/_data"
DATE=$(date +%Y%m%d_%H%M%S)
FILENAME="backup_volume_$DATE.tar.gz"
mkdir -p $BACKUP_DIR
tar -czf $BACKUP_DIR/$FILENAME $SOURCE_VOL
find $BACKUP_DIR -type f -mtime +7 -name "*.tar.gz" -exec rm {} \;
Neste código, a variável DATE garante nomes únicos para cada arquivo gerado, enquanto o comando find localiza e remove arquivos com mais de sete dias de existência, evitando que o disco do servidor fique cheio de versões antigas desnecessárias. Assim como na otimização de pipelines de CI/CD que utilizam cache para acelerar processos, a gestão eficiente do espaço em disco é um pilar fundamental para a estabilidade a longo prazo.
Executando backups sem derrubar os serviços
Uma das maiores preocupações ao criar rotinas de backup em ambientes de produção é a interrupção do serviço. Afinal, se o banco de dados ou a aplicação web sair do ar toda vez que o script rodar, a experiência do usuário será comprometida. A boa notícia é que o utilitário tar consegue ler os arquivos do volume em tempo de execução sem precisar parar o container, embora exista um pequeno risco de inconsistência caso ocorra uma escrita exatamente no milissegundo em que o arquivo está sendo lido.
Para a grande maioria das aplicações de pequeno e médio porte, essa leitura a quente funciona perfeitamente. Caso você utilize bancos de dados relacionais pesados, a recomendação de engenharia é executar um comando de disparo interno, como um dump do banco para dentro do volume, antes de compactar o diretório. Isso garante que os dados estejam consistentes no momento exato em que o arquivo compactado for gerado, unindo a alta disponibilidade à integridade absoluta das informações.
Automatizando a rotina com o agendador Cron
Com o script testado e funcionando de forma isolada, o próximo passo lógico é automatizar sua execução para que você não precise lembrar de rodá-lo manualmente todos os dias. O cron é o agendador de tarefas padrão do Linux, responsável por disparar comandos e scripts em horários e frequências específicos baseados em expressões matemáticas simples.
Para configurar o agendamento, abra o editor de tarefas do usuário administrador digitando o comando correspondente no terminal. O exemplo abaixo mostra como configurar o script para rodar todos os dias à meia-noite:
crontab -e
0 0 * * * /usr/local/bin/docker-backup.sh >> /var/log/docker-backup.log 2>&1
Essa linha diz ao sistema operacional para executar o script no minuto zero da hora zero de todos os dias, registrando tanto as saídas de sucesso quanto os eventuais erros em um arquivo de log dedicado. Monitorar esses logs periodicamente é uma prática excelente para garantir que o sistema de armazenamento continue íntegro e que nenhuma falha silenciosa passe despercebida pela equipe de suporte.
Validando e restaurando dados em caso de falha
Criar backups e nunca testar a restauração é o equivalente a não ter backup nenhum. Quando o pior acontece e o servidor principal sofre danos irreparáveis, você precisa saber exatamente como reverter o processo e colocar a aplicação de pé no menor tempo possível. O procedimento de restauração envolve extrair o arquivo compactado de volta para o diretório de volumes do Docker e reiniciar os containers correspondentes.
Para garantir que o arquivo não esteja corrompido, é recomendável realizar testes periódicos em um ambiente de homologação ou em uma máquina secundária. Validar a integridade dos arquivos compactados através de somas de verificação e simular cenários de desastre garante que, quando um imprevisto real acontecer, a equipe técnica consiga agir com total confiança e agilidade.
Considerações finais
A automação de backups de volumes Docker usando scripts shell é uma habilidade indispensável para qualquer profissional que gerencie servidores, homelabs ou infraestruturas em nuvem. Ao combinar o poder do comando tar com a simplicidade do agendador cron, você constrói uma rede de segurança sólida e independente de soluções proprietárias caras. Manter essa rotina ativa e testada regularmente garante a tranquilidade necessária para focar no desenvolvimento de novas funcionalidades e na evolução dos seus projetos.