Imagens Docker são a base da conteinerização. No entanto, imagens não otimizadas podem ser grandes demais, inseguras e lentas para construir. Isso afeta a velocidade de deployment, o consumo de recursos e a segurança da infraestrutura. Neste artigo, vamos explorar as melhores práticas para otimizar imagens Docker — para que seus aplicativos iniciem mais rapidamente, ocupem menos espaço e sejam mais fáceis de manter.
Por que otimizar imagens Docker?
- Acelerar a construção e o deployment
- Reduzir o tamanho da imagem
- Aumentar a segurança (menos pacotes = menos vulnerabilidades)
- Economizar espaço em disco e tráfego de rede
- Garantir repetibilidade e cache eficiente dos layers
1. Use imagens base mínimas
Quanto menor a imagem base, menor o tamanho final.
Ruim:
FROM ubuntu:22.04
Melhor:
FROM debian:bullseye-slim
Melhor ainda:
FROM alpine:3.19
Alpine tem apenas ~5 MB, mas pode ter problemas de compatibilidade com algumas bibliotecas.
2. Limpe arquivos temporários após instalação
Exemplo:
RUN apt-get update && apt-get install -y \
curl \
&& rm -rf /var/lib/apt/lists/*
Isso reduz o tamanho do layer ao remover caches e arquivos temporários.
3. Use multi-stage builds
A construção em múltiplas etapas permite compilar em uma fase e copiar apenas o necessário para a imagem final.
Exemplo:
# Etapa de build
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o main .
# Imagem final
FROM alpine:3.19
COPY --from=builder /app/main /app/
ENTRYPOINT ["/app/main"]
Resultado: uma imagem leve, enxuta e segura.
4. Use .dockerignore
O arquivo .dockerignore funciona como .gitignore, excluindo arquivos desnecessários do contexto de build.
Exemplo:
.git
node_modules
tests
Dockerfile
README.md
Isso acelera a construção e reduz o tamanho da imagem.
5. Combine comandos RUN
Cada comando RUN cria um novo layer. Prefira encadeá-los com &&.
Ruim:
RUN apt update
RUN apt install -y curl
Melhor:
RUN apt update && apt install -y curl
6. Instale apenas o que for necessário
Evite pacotes "por precaução". Menos software = mais segurança + menor imagem.
7. Minimize o número de layers
Cada RUN, COPY, ADD gera um novo layer. Combine ações quando possível.
8. Analise suas imagens
Verifique o tamanho e estrutura:
docker image inspect <nome_da_imagem>
Ou use a ferramenta Dive:
dive <nome_da_imagem>
9. Use versões fixas
Evite usar latest — isso dificulta o cache e gera builds instáveis:
FROM node:18.17.0
FAQ
🔸 O tamanho da imagem afeta a performance?
Sim, especialmente em pipelines CI/CD ou ao transferir entre servidores. Imagens menores resultam em deploys mais rápidos.
🔸 Devo sempre usar Alpine?
Não necessariamente. Alpine pode ter problemas de compatibilidade com glibc. Teste bem antes de usar em produção.
🔸 Como saber quais arquivos ocupam mais espaço?
Use o dive,docker image inspect ou docker history>.
Conclusão
A otimização de imagens Docker não é apenas um “bônus”, mas uma prática essencial para times que buscam estabilidade, escalabilidade e segurança. Cada megabyte importa: quanto mais leve e limpa a imagem, mais rápido o deploy, menos vulnerabilidades e mais fácil o suporte.
Reveja seus Dockerfiles regularmente, reduza o número de layers, elimine dependências desnecessárias e use .dockerignore para excluir arquivos inúteis do build. Não se esqueça do multi-stage build — uma das formas mais eficazes de criar imagens enxutas e produtivas.
Aplicando essas práticas você alcança:
- Pipelines CI/CD mais rápidos e confiáveis
- Melhor uso de recursos (menos I/O e espaço em disco)
- Mais segurança (menos superfície de ataque)
- Escalabilidade eficiente (inicializações mais rápidas no Kubernetes)
- Manutenção simplificada (builds previsíveis e transparentes)
Lembre-se: uma imagem Docker bem otimizada é o cartão de visitas do seu app em produção. Mantenha-a limpa, rápida e segura — e colha os frutos de uma operação estável.