91 lines
3.0 KiB
Markdown
91 lines
3.0 KiB
Markdown
# 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?
|