Docker transformou a entrega de software, mas usar containers em produção exige disciplina. Imagens grandes aumentam custos de armazenamento e tempo de deploy, enquanto vulnerabilidades podem expor seu ambiente a ataques. Este guia apresenta boas práticas que garantem imagens leves, seguras e versionáveis.
Boas práticas essenciais
- Multi-stage builds, compile o código em um estágio e copie apenas os artefatos finais.
- Imagens base minimalistas, prefira
alpineoudistrolesspara reduzir a superfície de ataque. - Nunca incluir credenciais, arquivos
.env, chaves ou tokens nunca devem ser copiados para a imagem. - Executar como usuário não-root, crie um usuário dedicado e configure o container para usá-lo.
- Versionamento sem
latest, utilize tags semânticas (v1.2.3) para rastreabilidade e rollback.
Exemplo enxuto de Dockerfile multi-stage (Node.js), 9 linhas
FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . RUN npm run build # gera artefatos estáticos FROM gcr.io/distroless/nodejs20 WORKDIR /app COPY /app/dist ./dist COPY /app/node_modules ./node_modules USER nonroot EXPOSE 3000 CMD ["dist/index.js"]
Checklist de segurança de imagem
- Escanear vulnerabilidades com Trivy, Clair ou Snyk.
- Verificar camadas desnecessárias (
docker history). - Definir usuário não-root no Dockerfile.
- Remover arquivos temporários (
npm cache clean --force). - Assinar a imagem usando Docker Content Trust para garantir integridade.
Estratégia de versionamento
| Tag | Quando usar |
|---|---|
v1.2.3 | Release estável, compatível com semver. |
v1.2.3-rc.1 | Release candidate para testes. |
v1.2.3-sha.<commit> | Build automatizada para CI, rastreável. |
Integração CI/CD simplificada (GitHub Actions), 7 linhas
name: Build & Push Docker Image on: push: branches: [main] jobs: docker: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Build image run: docker build -t myapp:$ . - name: Login to Docker Hub uses: docker/login-action@v2 with: username: $ password: $ - name: Push image run: docker push myapp:$
Conclusão
Aplicando essas práticas você obtém imagens menores, mais seguras e facilmente versionáveis, reduzindo custos operacionais e mitigando riscos de vulnerabilidades em produção.
Quais estratégias de Docker você já adotou? Compartilhe nos comentários!
Leia também
- Kubernetes em produção: o que ninguém conta antes de você migrar
- CI/CD Moderno: A Arte de Fazer Deploy com Confiança
- Cloudflare Workers em produção: o que muda depois do hello world
- D1 em produção: performance, limites e o que não escala sozinho
- Durable Objects em produção: o que a conta vai parecer e os limites que surpreendem
- Implementando Feature Flags e Rollouts Graduais em Produção
