Poupe até 53% em Servidores VPS, escolha agora. Oferta limitada.

Passo a passo para fazer backup e restaurar containers Docker

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:

  1. Identifique os containers em execução e seus volumes com docker ps e docker volume ls.
  2. Crie uma imagem do container com docker commit e exporte com docker save.
  3. Faça backup dos volumes com docker run --rm e tar para arquivos comprimidos.
  4. Transfira os arquivos .tar.gz para armazenamento externo ou outro servidor.
  5. Restaure a imagem com docker load e os volumes extraindo os arquivos .tar.gz.
  6. Recrie os containers com docker run ou docker compose up usando 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 docker no 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 save quanto os volumes com tar via 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.log para 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

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

  • 0 Os usuários acharam isso útil
  • Docker, backup, containers, Linux, AviraHost, volumes, restore
Esta resposta foi útil?

Artigos Relacionados

Guia Completo: Como escolher o melhor plano de hospedagem para o seu site

Escolher o plano de hospedagem ideal para o seu site é fundamental para garantir seu bom...

Lista Prática: 5 Vantagens de ter SSL gratuito no seu site

Ter um certificado SSL no seu site não é apenas uma questão de segurança, mas também uma...

Comparativo: Hospedagem de sites vs. VPS: qual é a melhor opção?

Quando se trata de escolher entre hospedagem compartilhada ou VPS, as opções variam de acordo...

Dicas de Otimização de Servidores Linux

Dicas de Otimização de Servidores Linux Servidores Linux são amplamente utilizados por sua...

Como Implementar Soluções Eficientes para Melhorar a Gestão de Serviços Online

Como Implementar Soluções Eficientes para Melhorar a Gestão de Serviços Online...