🗺️ 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 root em 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.