O Problema: Os Containers São Efêmeros

Antes de falar dos volumes, você precisa entender um conceito fundamental: os containers Docker são efêmeros. O que isso significa?

Imagine que você tem um container com um banco de dados. Você insere dados, tudo funciona perfeitamente. Depois você para o container, reinicia e… os dados desapareceram. Puf, volatilizados.

Isso acontece porque cada container tem seu próprio sistema de arquivos isolado que vive e morre com o container. É como escrever na areia: assim que a onda chega, tudo desaparece.

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

As Três Formas de Gerenciar Dados no Docker

Docker oferece três abordagens para a gestão de dados. Vamos vê-las da mais recomendada à menos.

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).

1
2
3
4
5
# Criar um volume
docker volume create meu-volume

# Usar o volume em um container
docker run -v meu-volume:/app/data minha-imagem

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.

1
2
# Conectar uma pasta local ao container
docker run -v /caminho/no/seu/pc:/app/data minha-imagem

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.

1
docker run --tmpfs /app/temp minha-imagem

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 Essenciais para Volumes

Criar um Volume

1
docker volume create nome-volume

Listar Volumes

1
docker volume ls

Inspecionar um Volume

1
docker volume inspect nome-volume

Este comando mostra onde o volume está fisicamente salvo e outras informações úteis.

Eliminar um Volume

1
2
3
4
5
# Eliminar um volume específico
docker volume rm nome-volume

# Eliminar todos os volumes não utilizados
docker volume prune

Atenção: eliminar um volume significa perder todos os dados contidos. Não há lixeira ou recuperação.

Exemplos Práticos

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:

1
2
3
4
5
6
7
8
9
# Criar um volume para os dados do MySQL
docker volume create mysql-data

# Iniciar MySQL usando o volume
docker run -d \
  --name meu-mysql \
  -e MYSQL_ROOT_PASSWORD=password123 \
  -v mysql-data:/var/lib/mysql \
  mysql:8

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:

1
2
3
4
5
docker run -d \
  --name meu-site \
  -p 8080:80 \
  -v $(pwd)/src:/var/www/html \
  php:apache

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Criar o volume compartilhado
docker volume create dados-compartilhados

# Container que escreve
docker run -d --name escritor -v dados-compartilhados:/data alpine \
  sh -c "while true; do date >> /data/log.txt; sleep 5; done"

# Container que lê
docker run -it --name leitor -v dados-compartilhados:/data alpine \
  tail -f /data/log.txt

Volumes no Docker Compose

Quando você usa Docker Compose, definir os volumes é ainda mais simples:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
version: '3.8'

services:
  database:
    image: postgres:15
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: secret

  app:
    image: minha-app
    volumes:
      - ./codigo:/app          # Bind mount para desenvolvimento
      - logs:/app/logs         # Volume para os logs

volumes:
  postgres-data:    # Volume gerenciado pelo Docker
  logs:             # Volume gerenciado pelo Docker

Com um simples docker-compose up, Docker cria automaticamente os volumes necessários.

Backup e Restauração de Volumes

Fazer Backup de um Volume

1
2
3
4
docker run --rm \
  -v nome-volume:/source:ro \
  -v $(pwd):/backup \
  alpine tar czf /backup/backup.tar.gz -C /source .

Este comando:

  1. Monta o volume em modo somente leitura (ro)
  2. Cria um arquivo compactado no diretório atual

Restaurar um Backup

1
2
3
4
docker run --rm \
  -v nome-volume:/target \
  -v $(pwd):/backup \
  alpine tar xzf /backup/backup.tar.gz -C /target

Erros Comuns a 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:

1
docker volume prune

Para eliminar os volumes que não estão mais conectados a nenhum container.

Quando Usar O Quê: Resumo

CenárioSolução
Banco de dados em produçãoVolume Docker
Desenvolvimento localBind mount
Dados sensíveis temporáriostmpfs
Compartilhamento entre containersVolume Docker
Arquivos de configuraçãoBind mount ou Volume
Logs de aplicaçãoVolume Docker

Conclusões

Os volumes Docker resolvem um dos problemas fundamentais dos containers: a persistência de dados. Sem volumes, os containers seriam úteis apenas para aplicações stateless.

Lembre-se das regras de ouro:

  • Use sempre volumes para bancos de dados
  • Use bind mounts para desenvolvimento local
  • Faça backups regulares dos volumes importantes
  • Limpe periodicamente os volumes órfãos

Uma vez entendido o conceito, os volumes se tornam tão naturais quanto salvar um arquivo no disco. E seus dados estarão finalmente seguros, independentemente do que aconteça com os containers.