promovaweb-devops-docker-volumes

Installation
SKILL.md

Skill de Docker Volumes

Domine o armazenamento persistente do Docker, incluindo volumes nomeados, bind mounts, tmpfs e procedimentos de backup/restauração de dados.

Propósito

Implementar persistência de dados confiável para containers com gerenciamento adequado de volume, estratégias de backup e manipulação de permissões.

Parâmetros

Parâmetro Tipo Obrigatório Padrão Descrição
volume_name string Não - Nome para o volume
mount_type enum Não volume volume/bind/tmpfs
backup boolean Não false Incluir comandos de backup

Tipos de Armazenamento

Tipo Persistência Caso de Uso Gerenciado Por
Named Volume Sim Dados de Produção Docker
Bind Mount Sim Desenvolvimento, configs Host
tmpfs Não (memória) Secrets, arquivos temporários Docker
Anonymous Ciclo de vida do container Espaço temporário (scratch space) Docker

Operações de Volume

Named Volumes

# Criar volume
docker volume create app_data

# Usar no container
docker run -d \
  -v app_data:/var/lib/postgresql/data \
  postgres:16-alpine

# Inspecionar volume
docker volume inspect app_data

# Listar volumes
docker volume ls

# Remover volumes não utilizados
docker volume prune

Bind Mounts

# Desenvolvimento - montar código-fonte
docker run -d \
  -v $(pwd)/src:/app/src \
  node:20-alpine

# Configuração apenas leitura (read-only)
docker run -d \
  -v /etc/app/config.yaml:/app/config.yaml:ro \
  myapp

tmpfs Mounts

# Dados sensíveis em memória
docker run -d \
  --tmpfs /app/secrets:rw,noexec,nosuid,size=64m \
  myapp

# Sintaxe do Compose
services:
  app:
    volumes:
      - type: tmpfs
        target: /app/tmp
        tmpfs:
          size: 100m

Docker Compose Volumes

services:
  database:
    image: postgres:16-alpine
    volumes:
      - db_data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}

  app:
    image: myapp
    volumes:
      - uploads:/app/uploads
      - ./config:/app/config:ro

volumes:
  db_data:
    driver: local
  uploads:
    external: true  # Pré-criado

Backup & Restauração

Backup de Volume

# Backup para arquivo tar
docker run --rm \
  -v app_data:/source:ro \
  -v $(pwd)/backups:/backup \
  alpine tar cvf /backup/app_data_$(date +%Y%m%d).tar -C /source .

# Backup compactado
docker run --rm \
  -v app_data:/source:ro \
  -v $(pwd)/backups:/backup \
  alpine tar czvf /backup/app_data_$(date +%Y%m%d).tar.gz -C /source .

Restaurar Volume

# Restaurar de um tar
docker run --rm \
  -v app_data:/dest \
  -v $(pwd)/backups:/backup:ro \
  alpine tar xvf /backup/app_data_20240101.tar -C /dest

Clonar Volume

docker run --rm \
  -v source_volume:/from:ro \
  -v target_volume:/to \
  alpine cp -av /from/. /to/

Tratamento de Erros

Erros Comuns

Erro Causa Solução
volume in use Container em execução Pare o container primeiro
permission denied Incompatibilidade de UID Corrija a propriedade (ownership)
no space left Disco cheio Limpe ou expanda
path not found Bind mount ausente Crie o diretório

Correções de Permissão

# Verificar propriedade (ownership)
docker run --rm -v app_data:/data alpine ls -la /data

# Corrigir propriedade (deve corresponder ao usuário do container)
docker run --rm -v app_data:/data alpine chown -R 1000:1000 /data

# SELinux (RHEL/CentOS)
docker run -v /host/path:/container/path:Z myimage

Solução de Problemas (Troubleshooting)

Checklist de Depuração

  • O volume existe? docker volume ls
  • O mount está visível? docker exec <c> df -h
  • As permissões estão corretas? ls -la no container
  • Os dados estão persistindo? Pare/inicie o container

Comandos de Diagnóstico

# Verificar localização do volume
docker volume inspect app_data --format '{{.Mountpoint}}'

# Verificar mounts do container
docker inspect <container> --format '{{json .Mounts}}'

# Verificar uso de disco
docker system df -v
Related skills
Installs
9
GitHub Stars
4
First Seen
Mar 28, 2026