Ideia central

Containers Docker são efêmeros: quando um container é removido, todos os dados escritos nele se perdem. Para persistir dados além do ciclo de vida de um container, o Docker oferece três mecanismos: volumes, bind mounts e tmpfs mounts.

Os três tipos

┌─────────────────────────────────────────────────┐
│                    Container                     │
│                                                 │
│   /app/data ──────────────────► Volume          │
│                 Docker managed  /var/lib/docker/  │
│                                 volumes/...      │
│                                                 │
│   /app/config ─────────────────► Bind Mount     │
│                 Host managed    /home/user/conf/ │
│                                                 │
│   /tmp/cache ──────────────────► tmpfs Mount    │
│                 RAM only        (apenas memória) │
└─────────────────────────────────────────────────┘

Volumes (recomendado para produção)

Gerenciados pelo Docker, armazenados em /var/lib/docker/volumes/. Independentes do filesystem do host:

# Criar volume
docker volume create meus-dados
 
# Usar volume em um container
docker run -v meus-dados:/var/lib/postgresql/data postgres:16
 
# Sintaxe --mount (mais explícita e recomendada)
docker run \
  --mount type=volume,source=meus-dados,target=/var/lib/postgresql/data \
  postgres:16
 
# Listar volumes
docker volume ls
 
# Inspecionar volume (ver onde está no host)
docker volume inspect meus-dados
 
# Remover volume
docker volume rm meus-dados
 
# Remover volumes não utilizados
docker volume prune

Vantagens dos volumes:

  • Fácil de fazer backup e migrar
  • Funciona em Linux e Windows
  • Pode ser compartilhado entre múltiplos containers
  • Drivers de volume permitem armazenar em cloud (AWS EFS, Azure Files, etc.)

Bind Mounts (desenvolvimento local)

Mapeia um diretório do host diretamente no container. Mudanças em ambos os lados são refletidas instantaneamente, ideal para desenvolvimento com hot reload:

# Mapear diretório atual para /app no container
docker run -v $(pwd):/app minha-app
 
# Sintaxe --mount
docker run \
  --mount type=bind,source=$(pwd),target=/app \
  minha-app
 
# Read-only (container não pode escrever no host)
docker run -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro nginx

Cuidados:

  • Depende da estrutura de diretórios do host (menos portável)
  • Problemas de permissão entre usuário do host e do container são comuns
  • Não use em produção para dados críticos

tmpfs Mounts (dados temporários em memória)

Dados ficam apenas na RAM: não persistem e não vão para o disco:

docker run --mount type=tmpfs,target=/tmp minha-app

Útil para dados sensíveis temporários (tokens, senhas) que não devem tocar o disco.

Volumes no Docker Compose

services:
  db:
    image: postgres:16
    volumes:
      # Volume nomeado (persistente, gerenciado pelo Docker)
      - postgres_data:/var/lib/postgresql/data
 
      # Bind mount (arquivo de configuração do host)
      - ./postgresql.conf:/etc/postgresql/postgresql.conf:ro
 
      # Bind mount do diretório atual
      - .:/app
 
  redis:
    image: redis:7
    volumes:
      - redis_data:/data
 
# Declarar volumes nomeados usados nos serviços
volumes:
  postgres_data:
  redis_data:

Backup de volumes

# Criar backup de um volume para arquivo tar.gz
docker run --rm \
  -v meus-dados:/data \
  -v $(pwd):/backup \
  alpine tar czf /backup/backup.tar.gz -C /data .
 
# Restaurar backup
docker run --rm \
  -v meus-dados:/data \
  -v $(pwd):/backup \
  alpine tar xzf /backup/backup.tar.gz -C /data

Quando usar cada tipo

SituaçãoTipo recomendado
Banco de dados em produçãoVolume nomeado
Código-fonte em desenvolvimentoBind mount
Arquivos de config (read-only)Bind mount
Dados sensíveis temporáriostmpfs
Compartilhar dados entre containersVolume nomeado

Conexões

Referências