Docker — Optimización y Buenas Prácticas¶
Optimizar las imágenes Docker reduce el tiempo de build, el almacenamiento y el overhead en tiempo de ejecución, además de mejorar la seguridad.
Multi-stage Builds¶
Los multi-stage builds permiten usar varias sentencias FROM en un mismo Dockerfile, conservando solo las capas finales en la imagen de producción.
# Build stage
FROM golang:1.20-alpine AS build
WORKDIR /app
COPY . .
RUN go build -o /out/myapp
# Runtime stage
FROM alpine:3.19
COPY --from=build /out/myapp /usr/local/bin/myapp
USER 1000
ENTRYPOINT ["/usr/local/bin/myapp"]
Beneficios: - Reduce el tamaño final de la imagen (100MB+ → 10-20MB en este ejemplo) - Separa las herramientas de build de las dependencias de runtime - Mejora la seguridad al excluir compiladores y paquetes de desarrollo
Recomendaciones Generales¶
Tamaño de Imagen y Capas¶
- Usa imágenes base mínimas: Alpine, Debian Slim o distroless cuando sea aplicable
- Minimiza
COPY/ADD: copia solo los ficheros necesarios; usa.dockerignore - Limpia en la misma capa:
RUN apt-get update && apt-get install -y curl && apt-get clean && rm -rf /var/lib/apt/lists/* - Combina comandos
RUN: cadaRUNcrea una capa; menos capas = imágenes más pequeñas
Seguridad¶
- Nunca ejecutes como root: crea un usuario sin privilegios
RUN useradd -m appuser USER appuser - Escanea vulnerabilidades:
docker scan myimage trivy image myimage - Mantén las imágenes actualizadas: reconstruye regularmente con las últimas imágenes base
Secretos y Configuración¶
- Nunca incluyas secretos en la imagen ni en el Dockerfile
- Usa ficheros de entorno para la configuración:
docker run --env-file .env myimage - Usa herramientas de gestión de secretos: HashiCorp Vault, Docker Secrets (Swarm), Kubernetes Secrets
Persistencia de Datos¶
- Usa volúmenes para datos persistentes:
docker run -v my-volume:/data myimage - Nunca almacenes datos críticos en las capas del contenedor; son efímeras
Consejos de Rendimiento¶
| Optimización | Impacto | Complejidad |
|---|---|---|
| Multi-stage builds | Alto | Bajo |
| Cacheo de capas | Alto | Medio |
| Reducción de tamaño de imagen | Medio | Bajo |
| Escaneo de seguridad | Medio | Bajo |
Ejemplo Práctico: Dockerfile Listo para Producción¶
# Build stage
FROM golang:1.21-alpine AS builder
WORKDIR /build
COPY go.* ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o app
# Runtime stage
FROM alpine:3.19
RUN apk add --no-cache ca-certificates
RUN adduser -D -u 1000 appuser
WORKDIR /app
COPY --from=builder /build/app .
USER appuser
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=5s CMD wget --quiet --tries=1 --spider http://localhost:8080/health || exit 1
CMD ["./app"]