# MANUAL TÉCNICO - VOLUMES E PERSISTÊNCIA DE DADOS NO DOCKER **Código:** ITGINF 0010/26 | **Classificação:** RESTRITO **Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}} ## 1. HISTÓRICO DE REVISÃO > ⚠️ **REGRA DE OURO:** > 1. **Autor:** João Pedro Toledo Gonçalves. > 2. **Descrição:** Criação do documento. | Data | Versão | Descrição | Autor | | :--- | :--- | :--- | :--- | | {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves | ## 2. OBJETIVO Definir estratégias de persistência de dados em conteineres (Stateful), diferenciando Volumes gerenciados de Bind Mounts e garantindo backup e permissões corretas. ## 3. PRÉ-REQUISITOS - [ ] Docker Engine instalado. - [ ] Entendimento básico de permissões Linux (chmod/chown). ## 4. PASSO A PASSO (EXECUÇÃO) **Etapa 1: Volumes Gerenciados (Recomendado)** > ℹ️ **NOTA:** Volumes são gerenciados pelo Docker em `/var/lib/docker/volumes`. São mais fáceis de fazer backup e migrar. 1. Crie um volume explícito. ```bash docker volume create dados-postgres ``` 2. Use o volume em um container. ```bash docker run -d --name db-prod -v dados-postgres:/var/lib/postgresql/data postgres:15 ``` **Etapa 2: Bind Mounts (Caminhos do Host)** > ⚠️ **IMPORTANTE:** Use Bind Mounts para arquivos de configuração (`nginx.conf`) ou código fonte em desenvolvimento. 1. Mapeie um diretório local absoluto para dentro do container. ```bash docker run -d \ --name web-server \ -v /home/user/meu-site:/usr/share/nginx/html:ro \ nginx ``` > `:ro` = Read Only (O container não pode alterar os arquivos do host). **Etapa 3: Inspecionando Volumes** 1. Descubra onde os dados estão realmente salvos no disco. ```bash docker volume inspect dados-postgres ``` **Etapa 4: Backup de Volume** 1. Use um container temporário para tar/zipar o conteúdo de um volume. ```bash docker run --rm \ -v dados-postgres:/volume \ -v $(pwd):/backup \ alpine tar cvf /backup/backup.tar /volume ``` ## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING) **Problema 1: "Permission Denied" ao escrever no volume** * **Causa:** O UID do processo dentro do container é diferente do UID do dono da pasta no host (Bind Mount). * **Solução:** 1. Descubra o UID interno: `docker exec container id`. 2. Ajuste o dono no host: `sudo chown -R 1000:1000 /pasta/local`. **Problema 2: Volume órfão (Dados "perdidos")** * **Causa:** Remover container sem remover volume mantém os dados (o que é bom), mas pode confundir. * **Solução:** 1. Liste volumes: `docker volume ls`. 2. Remova não usados: `docker volume prune`. ## 6. DADOS TÉCNICOS | Campo | Valor | Descrição | | :--- | :--- | :--- | | **Path Linux** | `/var/lib/docker/volumes` | Local padrão dos volumes | | **Driver** | `local` | Driver padrão | ## 7. VALIDAÇÃO FINAL - [ ] O comando `docker volume ls` lista o volume criado? - [ ] Se remover o container (`docker rm -f`), os dados persistem? - [ ] O container consegue ler/escrever no diretório mapeado?