16 min de leitura · Guia técnico
Backup e restauração de containers Docker é o processo de salvar o estado de imagens e volumes para recuperação em caso de falha, migração ou atualização de ambiente. Para fazer backup e restaurar containers Docker, siga estes passos:
- Identifique os containers em execução e seus volumes com
docker psedocker volume ls. - Crie uma imagem do container com
docker commite exporte comdocker save. - Faça backup dos volumes com
docker run --rmetarpara arquivos comprimidos. - Transfira os arquivos
.tar.gzpara armazenamento externo ou outro servidor. - Restaure a imagem com
docker loade os volumes extraindo os arquivos.tar.gz. - Recrie os containers com
docker runoudocker compose upusando os dados restaurados.
Pré-requisitos para fazer backup de containers Docker
- Docker Engine instalado (versão 20.10 ou superior recomendada) em Ubuntu 24.04 LTS, Debian 12 ou Rocky Linux 9.
- Acesso root ou usuário no grupo
dockerno servidor. - Espaço em disco suficiente para armazenar os arquivos de backup (verifique com
df -h). - Conhecimento básico de linha de comando Linux e SSH ativo no servidor.
- Opcional: Docker Compose instalado se os containers forem gerenciados por arquivos
docker-compose.yml. - Destino de backup definido: diretório local, armazenamento remoto via rsync ou bucket S3.
Se você ainda não configurou o Docker no seu servidor, consulte o artigo Dicas de Otimização de Servidores Linux para preparar o ambiente antes de prosseguir.
Como fazer backup de imagens Docker com docker save
O backup de imagens Docker preserva todas as camadas do sistema de arquivos do container, permitindo recriar o ambiente exato em outro host. Este método é ideal para salvar aplicações configuradas antes de atualizações ou migrações.
Primeiro, liste todos os containers em execução para identificar quais precisam de backup:
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}"
CONTAINER ID NAMES IMAGE STATUS
a1b2c3d4e5f6 app_web nginx:1.26 Up 3 hours
b2c3d4e5f6a1 app_db mysql:8.0 Up 3 hours
Para criar uma imagem a partir de um container em execução (capturando alterações feitas após o start), use docker commit:
docker commit app_web meu_backup/nginx_web:$(date +%Y%m%d)
sha256:7f3a9b2c1d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0
Agora exporte a imagem para um arquivo .tar comprimido:
docker save meu_backup/nginx_web:20241215 | gzip > /backup/nginx_web_20241215.tar.gz
Para verificar a integridade do arquivo gerado:
ls -lh /backup/nginx_web_20241215.tar.gz
-rw-r--r-- 1 root root 47M dez 15 02:00 /backup/nginx_web_20241215.tar.gz
Se você tiver múltiplas imagens para salvar em um único arquivo, passe todas como argumentos:
docker save meu_backup/nginx_web:20241215 meu_backup/mysql_db:20241215 | gzip > /backup/stack_completa_20241215.tar.gz
Como fazer backup de volumes Docker com dados persistentes
O backup de volumes Docker é a etapa mais crítica, pois é onde ficam os dados reais da aplicação — bancos de dados, uploads de usuários, configurações dinâmicas. Diferente das imagens, os volumes existem fora do ciclo de vida do container.
Liste todos os volumes existentes no host:
docker volume ls
DRIVER VOLUME NAME
local app_db_data
local app_uploads
local nginx_conf
Para fazer backup de um volume sem parar o container principal, use um container auxiliar Alpine com acesso ao volume:
docker run --rm \
-v app_db_data:/data \
-v /backup:/backup \
alpine \
tar czf /backup/app_db_data_$(date +%Y%m%d).tar.gz /data
tar: Removing leading '/' from member names
Esse aviso do tar é esperado e não indica erro. O arquivo será criado corretamente em /backup/. Repita o processo para cada volume crítico:
docker run --rm \
-v app_uploads:/data \
-v /backup:/backup \
alpine \
tar czf /backup/app_uploads_$(date +%Y%m%d).tar.gz /data
Para verificar o conteúdo do backup sem extrair:
docker run --rm \
-v /backup:/backup \
alpine \
tar tzf /backup/app_db_data_20241215.tar.gz | head -20
data/
data/mysql/
data/mysql/ibdata1
data/mysql/ib_logfile0
data/mysql/ib_logfile1
data/mysql/app_database/
Atenção: Para bancos de dados MySQL ou PostgreSQL em execução, o backup direto do volume pode gerar arquivos inconsistentes. Prefira usar mysqldump ou pg_dump dentro do container antes de copiar os dados.
docker exec app_db mysqldump -u root -p'SuaSenha' --all-databases > /backup/mysql_dump_$(date +%Y%m%d).sql
Como automatizar o backup de containers Docker com cron
A automação do backup Docker com cron garante que os dados sejam salvos regularmente sem intervenção manual, reduzindo o risco de perda de dados em caso de falha inesperada.
Crie um script de backup completo em /usr/local/bin/docker-backup.sh:
#!/bin/bash
BACKUP_DIR="/backup/docker"
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/var/log/docker-backup.log"
mkdir -p "$BACKUP_DIR"
echo "[$DATE] Iniciando backup Docker..." >> "$LOG_FILE"
# Backup das imagens
docker save meu_backup/nginx_web:latest | gzip > "$BACKUP_DIR/nginx_web_$DATE.tar.gz"
docker save meu_backup/mysql_db:latest | gzip > "$BACKUP_DIR/mysql_db_$DATE.tar.gz"
# Backup dos volumes
for VOLUME in app_db_data app_uploads nginx_conf; do
docker run --rm \
-v "$VOLUME":/data \
-v "$BACKUP_DIR":/backup \
alpine \
tar czf "/backup/${VOLUME}_${DATE}.tar.gz" /data
echo "[$DATE] Volume $VOLUME salvo." >> "$LOG_FILE"
done
# Remover backups com mais de 7 dias
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -delete
echo "[$DATE] Backup concluído." >> "$LOG_FILE"
Torne o script executável:
chmod +x /usr/local/bin/docker-backup.sh
Adicione ao crontab para execução diária às 2h da manhã:
crontab -e
0 2 * * * /usr/local/bin/docker-backup.sh
Para verificar se o cron está executando corretamente, monitore o log:
tail -f /var/log/docker-backup.log
[20241215_020001] Iniciando backup Docker...
[20241215_020045] Volume app_db_data salvo.
[20241215_020052] Volume app_uploads salvo.
[20241215_020053] Volume nginx_conf salvo.
[20241215_020053] Backup concluído.
Se você usa Docker Compose, inclua também a cópia do arquivo docker-compose.yml no script, pois ele é essencial para recriar toda a infraestrutura:
cp /opt/minha_app/docker-compose.yml "$BACKUP_DIR/docker-compose_$DATE.yml"
Como restaurar containers Docker a partir de backup
A restauração de containers Docker envolve dois processos distintos: carregar a imagem salva e restaurar os volumes com os dados persistentes. Execute sempre a restauração de volumes antes de iniciar os containers.
Para restaurar uma imagem a partir do arquivo .tar.gz:
docker load -i /backup/docker/nginx_web_20241215_020001.tar.gz
Loaded image: meu_backup/nginx_web:latest
Verifique se a imagem foi carregada corretamente:
docker images | grep nginx_web
meu_backup/nginx_web latest 7f3a9b2c1d4e 2 hours ago 187MB
Agora restaure os volumes. Primeiro crie o volume de destino se ele não existir:
docker volume create app_db_data
Atenção: Se o volume já existir com dados, o comando abaixo irá sobrescrever o conteúdo. Certifique-se de que o container que usa este volume está parado antes de restaurar.
docker stop app_db
docker run --rm \
-v app_db_data:/data \
-v /backup/docker:/backup \
alpine \
tar xzf /backup/app_db_data_20241215_020001.tar.gz -C /
Repita para cada volume necessário:
docker volume create app_uploads
docker run --rm \
-v app_uploads:/data \
-v /backup/docker:/backup \
alpine \
tar xzf /backup/app_uploads_20241215_020001.tar.gz -C /
Após restaurar todos os volumes, recrie os containers. Se usar Docker Compose:
cd /opt/minha_app
docker compose up -d
[+] Running 2/2
✔ Container app_db Started 0.8s
✔ Container app_web Started 1.2s
Verifique se os containers estão saudáveis após a restauração:
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
NAMES STATUS PORTS
app_web Up 30 seconds 0.0.0.0:80->80/tcp
app_db Up 30 seconds 3306/tcp
Para ambientes com múltiplos containers e serviços interdependentes, consulte também o artigo Configuração e Implantação Fácil de Servidores VPS na AviraHost para garantir que o ambiente base esteja corretamente configurado antes da restauração.
Como transferir backups Docker para armazenamento remoto
Manter backups apenas no mesmo servidor é uma prática arriscada — uma falha de disco ou comprometimento do host pode destruir tanto os dados originais quanto os backups. Transfira os arquivos para um destino externo usando rsync ou scp.
Para enviar os backups para outro servidor via rsync com SSH:
rsync -avz --progress /backup/docker/ usuario@servidor-remoto:/backup/docker-backups/
sending incremental file list
nginx_web_20241215_020001.tar.gz
49,283,072 100% 12.45MB/s 0:00:03 (xfr#1, to-chk=4/6)
app_db_data_20241215_020001.tar.gz
102,400,000 100% 11.23MB/s 0:00:08 (xfr#2, to-chk=3/6)
Para transferir via scp de forma simples:
scp /backup/docker/*.tar.gz usuario@servidor-remoto:/backup/docker-backups/
Adicione o comando rsync ao script de backup para automatizar a transferência remota junto com o backup local. Inclua autenticação por chave SSH para evitar a necessidade de senha no cron.
Problemas comuns e como resolver
Sintoma: docker save gera arquivo vazio ou com erro de permissão
Causa: O diretório de destino não existe ou o usuário não tem permissão de escrita. Também pode ocorrer quando a imagem especificada não existe localmente.
Solução: Verifique se o diretório existe com ls -la /backup/ e crie-o com mkdir -p /backup/docker. Confirme que a imagem existe com docker images | grep nome_imagem. Se o usuário não for root, adicione-o ao grupo docker com usermod -aG docker $USER e faça logout/login.
Sintoma: Backup do volume gera dados inconsistentes no banco de dados
Causa: O banco de dados (MySQL, PostgreSQL) estava em execução durante o backup do volume, resultando em arquivos de dados em estado intermediário de transação.
Solução: Para MySQL, use docker exec app_db mysqldump -u root -p'senha' --all-databases --single-transaction > /backup/dump.sql em vez de copiar o volume diretamente. A flag --single-transaction garante consistência sem bloquear o banco. Para PostgreSQL, use docker exec app_db pg_dumpall -U postgres > /backup/pg_dump.sql.
Sintoma: docker load falha com "invalid tar header"
Causa: O arquivo .tar.gz está corrompido, incompleto ou foi transferido com erro (por exemplo, via FTP em modo binário incorreto).
Solução: Verifique a integridade do arquivo com gzip -t /backup/imagem.tar.gz. Se retornar erro, o arquivo está corrompido e precisa ser gerado novamente. Sempre transfira arquivos de backup via rsync ou scp, que verificam integridade automaticamente. Evite FTP para transferência de backups binários.
Sintoma: Container restaurado não encontra os dados do volume
Causa: O volume foi restaurado com o caminho interno incorreto ou o container foi iniciado antes da restauração do volume ser concluída.
Solução: Verifique o conteúdo do volume restaurado com docker run --rm -v nome_volume:/data alpine ls -la /data. Se o diretório estiver vazio, a extração do tar pode ter usado um caminho incorreto. Ao extrair, use sempre -C / para restaurar a partir da raiz, pois o tar foi criado com o caminho /data/ incluído.
Sintoma: Cron não executa o script de backup
Causa: O script não tem permissão de execução, o caminho do Docker não está no PATH do cron, ou há erro de sintaxe no script.
Solução: Confirme a permissão com ls -la /usr/local/bin/docker-backup.sh e aplique chmod +x se necessário. Adicione o PATH explicitamente no início do script: export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin. Teste o script manualmente como root antes de confiar no cron: bash /usr/local/bin/docker-backup.sh.
Perguntas frequentes sobre backup e restauração de containers Docker
Como fazer backup de um container Docker sem parar o serviço?
Use o comando docker commit para criar uma imagem a partir do container em execução, depois exporte com docker save. Para volumes, utilize docker run --rm -v nome_volume:/data -v $(pwd):/backup alpine tar czf /backup/volume.tar.gz /data sem precisar parar o container principal. Essa abordagem mantém o serviço disponível durante o backup, embora para bancos de dados seja recomendado usar ferramentas nativas como mysqldump para garantir consistência dos dados.
Qual a diferença entre backup de imagem Docker e backup de volume?
O backup de imagem captura o sistema de arquivos do container — camadas de imagem e alterações feitas via docker commit — mas não inclui dados persistentes gravados em volumes externos. O backup de volume salva os dados persistentes como bancos de dados, uploads e configurações que existem fora do ciclo de vida do container. Para um backup completo e funcional, é necessário realizar os dois processos: salvar a imagem com docker save e os volumes com tar via container auxiliar.
Como restaurar um container Docker a partir de um arquivo .tar?
Para restaurar uma imagem, execute docker load -i imagem.tar e depois docker run com os parâmetros originais. Para restaurar um volume, crie o volume com docker volume create nome_volume e extraia o arquivo com docker run --rm -v nome_volume:/data -v $(pwd):/backup alpine tar xzf /backup/volume.tar.gz -C /. Sempre restaure os volumes antes de iniciar os containers para garantir que os dados estejam disponíveis no momento em que a aplicação inicializa.
É possível automatizar o backup de containers Docker com cron?
Sim. Crie um script shell que execute os comandos de docker save e backup de volumes, depois adicione uma entrada no crontab com crontab -e. Por exemplo, 0 2 * * * /usr/local/bin/docker-backup.sh executa o backup diariamente às 2h. Redirecione a saída para um arquivo de log para monitorar execuções e detectar falhas. Inclua também a limpeza automática de backups antigos com find para evitar esgotamento do disco.
O Docker Compose salva os dados dos containers automaticamente?
O Docker Compose não faz backup automático de dados. Ele gerencia a criação e orquestração dos containers, mas os dados persistentes ficam em volumes que precisam ser copiados separadamente. Salvar o arquivo docker-compose.yml é essencial para recriar a infraestrutura — ele define imagens, redes, variáveis de ambiente e mapeamentos de volumes — mas os dados dos volumes devem ser copiados com comandos específicos de backup como demonstrado neste guia.
Conclusão
- Faça backup em duas camadas: sempre salve tanto a imagem Docker com
docker savequanto os volumes comtarvia container Alpine — um sem o outro resulta em backup incompleto. - Automatize com cron e monitore os logs: configure o script de backup para rodar diariamente, incluir limpeza de arquivos antigos e registrar cada execução em
/var/log/docker-backup.logpara detectar falhas silenciosas. - Armazene backups fora do servidor de origem: use rsync com SSH para transferir os arquivos para um servidor remoto ou armazenamento externo, garantindo recuperação mesmo em caso de falha total do host.
Leia também
- Guia de Backup, Snapshot e Restore: diferenças práticas e quando usar
- Automatize Backup MySQL/MariaDB no Linux com Cron
- Checklist de Segurança para Servidor Linux em Produção 2026
Precisa de ajuda com Docker no seu servidor?
Gerenciar containers Docker com segurança exige um ambiente de servidor estável, com recursos adequados de CPU, memória e disco. Um VPS Linux bem configurado é a base para rodar containers em produção com confiabilidade.
Conheça os planos de VPS Linux da AviraHost e comece a hospedar seus containers com segurança