Por que um container perde os dados quando reinicia
Escreva uma linha em um banco de dados rodando em um container Docker, pare o container, suba de novo: a linha sumiu.
Todo container recebe o sistema de arquivos novo, a partir da imagem, cada vez que inicia. Tudo o que o próprio container escreve — arquivos do banco, uploads, logs — vai para uma camada gravável que é descartada quando o container é removido. Um volume Docker é como você mantém esses dados fora do container, onde eles sobrevivem.
O Que é um Volume Docker?
Um volume Docker é um mecanismo para salvar os dados fora do container, de forma que persistam mesmo quando o container é parado, reiniciado ou eliminado.
Pense nos volumes como um disco rígido externo que você conecta ao seu container. Os dados são escritos nesse “disco externo” e permanecem seguros independentemente do que aconteça com o container.
Por Que Usar Volumes?
- Persistência: os dados sobrevivem ao ciclo de vida do container
- Compartilhamento: vários containers podem acessar os mesmos dados
- Backup: é mais fácil fazer backup dos dados
- Performance: os volumes são otimizados para operações I/O
- Portabilidade: você pode mover os dados entre hosts diferentes
Volumes, bind mounts e tmpfs: qual usar
Há três formas de persistir dados, na ordem em que você deve recorrer a elas: volumes, bind mounts, tmpfs.
1. Volumes - A Escolha Recomendada
Os volumes são gerenciados completamente pelo Docker e salvos em um diretório especial no host (/var/lib/docker/volumes/ no Linux).
| |
Vantagens:
- Gerenciados pelo Docker (fáceis de criar, eliminar, inspecionar)
- Funcionam em Linux, Windows e Mac
- Podem ser compartilhados entre vários containers
- Suportam drivers para armazenamento remoto (cloud, NFS, etc.)
2. Bind Mounts - Conexão Direta
Os bind mounts conectam uma pasta específica do seu computador diretamente ao container.
| |
Quando usá-los:
- Durante o desenvolvimento, para ver as mudanças no código em tempo real
- Quando você precisa acessar arquivos específicos do sistema host
- Para compartilhar configurações entre host e container
Atenção: os bind mounts dependem da estrutura do sistema de arquivos do host, então são menos portáveis.
3. tmpfs Mounts - Dados Temporários na Memória
Os tmpfs mounts salvam os dados na RAM do host, não no disco.
| |
Quando usá-los:
- Para dados sensíveis que não devem ser escritos no disco
- Para caches temporários de alta performance
- Os dados são perdidos quando o container para (e é exatamente isso que você quer)
Comandos de volume Docker: create, list, inspect, remove
Criar um Volume
| |
Listar Volumes
| |
Inspecionar um Volume
| |
Este comando mostra onde o volume está fisicamente salvo e outras informações úteis.
Eliminar um Volume
| |
Atenção: eliminar um volume significa perder todos os dados contidos. Não há lixeira ou recuperação.
Exemplos de volume Docker: banco de dados, dev com live reload, compartilhamento
Exemplo 1: Banco de Dados MySQL com Dados Persistentes
Sem volume, cada vez que você reinicia o container MySQL perde todos os dados. Veja como resolver:
| |
Agora você pode parar, reiniciar ou até eliminar e recriar o container: os dados do banco de dados permanecerão intactos no volume mysql-data.
Exemplo 2: Desenvolvimento Web com Bind Mount
Durante o desenvolvimento, você quer que as modificações no código sejam imediatamente visíveis no container:
| |
Cada modificação nos arquivos na pasta src estará imediatamente disponível no container.
Exemplo 3: Compartilhar Dados entre Containers
Dois containers que precisam acessar os mesmos arquivos:
| |
Volumes no Docker Compose
No Docker Compose você declara os volumes uma vez e cada serviço que precisa deles se refere pelo nome:
| |
Com um simples docker-compose up, Docker cria automaticamente os volumes necessários.
Backup e Restauração de Volumes
Fazer Backup de um Volume
| |
Este comando:
- Monta o volume em modo somente leitura (
ro) - Cria um arquivo compactado no diretório atual
Restaurar um Backup
| |
Erros com volumes Docker que você deve evitar
1. Esquecer de Usar Volumes para Bancos de Dados
Se você usa um banco de dados no Docker sem volume, vai perder todos os dados. Sempre.
2. Usar Bind Mounts em Produção
Os bind mounts são ótimos para desenvolvimento, mas em produção use volumes Docker para maior portabilidade e segurança.
3. Não Fazer Backup dos Volumes
Os volumes não são incluídos automaticamente nos backups do sistema. Planeje backups regulares.
4. Acumular Volumes Órfãos
Quando você elimina containers, os volumes permanecem. Use periodicamente:
| |
Para eliminar os volumes que não estão mais conectados a nenhum container.
Qual opção de armazenamento para cada caso
| Cenário | Solução |
|---|---|
| Banco de dados em produção | Volume Docker |
| Desenvolvimento local | Bind mount |
| Dados sensíveis temporários | tmpfs |
| Compartilhamento entre containers | Volume Docker |
| Arquivos de configuração | Bind mount ou Volume |
| Logs de aplicação | Volume Docker |
A regra que cobre a maioria dos casos
Use um volume nomeado para tudo o que um container escreve e você quer manter, bancos de dados antes de mais nada. Use um bind mount quando quiser que o container veja uma pasta da sua máquina enquanto você a edita, o que é quase sempre desenvolvimento local. Deixe o tmpfs para dados que nunca podem tocar o disco.
Depois que um banco de dados tem um volume, você pode apagar e recriar o container dele quantas vezes quiser e os dados continuam lá. É esse o ponto.