🐳 Cap 13: Docker Essencial: Dockerfile Multi-Stage, Otimização de Camadas e Redes
🗺️ O Padrão Multi-Stage Build para Imagens Mínimas e Seguras
flowchart LR
subgraph BUILDER ["Estágio 1: Builder (Pesado: ~1.2 GB)"]
SRC["Código-Fonte + Compiladores (GCC / Rust / Go / Node SDK)"]
--> COMP["Compilação do Binário Estático"]
end
subgraph RUNNER ["Estágio 2: Runtime Final (Mínimo: ~15 MB) ⚡"]
DISTRO["Alpine / Distroless / Scratch"]
--> COPY["COPY --from=builder /app/binario /binario"]
--> USER["USER nonroot (Segurança)"]
end
BUILDER -.-> |"Copia Apenas o Binário Puro"| RUNNER
style BUILDER fill:#ffebee,stroke:#d32f2f,stroke-width:2px
style RUNNER fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
📖 Fundamentos e Aplicação
A tecnologia de Containers utiliza primitivas nativas do kernel Linux (Namespaces para isolamento de processos/redes e Cgroups para controle de memória e CPU) para criar ambientes de execução reproduzíveis e imutáveis.
1. Boas Práticas na Construção de Dockerfiles
- Ordenação Estratégica de Camadas (Layer Caching): Copie manifestos de dependências (
package.json,requirements.txt,Cargo.toml) e instale pacotes antes de copiar o código-fonte, reaproveitando o cache em cada build. - Multi-Stage Builds: Separe o ambiente de compilação (com ferramentas pesadas) da imagem final de produção (com apenas o binário estático e zero compiladores).
- Execução Sem Root (Non-Root User): Nunca execute containers como
rootem produção para mitigar vulnerabilidades de escape de container.
2. Redes e Volumes Docker
- Bridge Network: Rede virtual padrão isolada para comunicação entre containers.
- Volumes Nomeados vs Bind Mounts: Volumes nomeados gerenciam a persistência de bancos de dados; bind mounts mapeiam pastas do hospedeiro para desenvolvimento local com hot-reload.