6 prácticas Docker para imágenes listas para producción

Clase 15 de 34Curso de Docker Avanzado

Resumen

Construye imágenes de Docker listas para producción con pasos claros y seguros. Aquí encontrarás las mejores prácticas esenciales para asegurar estabilidad, rendimiento y equipos más felices, con ejemplos de Dockerfile y comandos prácticos.

¿Qué prácticas de Docker aseguran imágenes listas para producción?

Adopta un enfoque profesional desde el inicio. Las siguientes prácticas priorizan estabilidad, rendimiento y seguridad, minimizando sorpresas en despliegues y facilitando la colaboración del equipo.

¿Por qué elegir imágenes oficiales del Docker Hub?

Usa imágenes oficiales como base. Son mantenidas, documentadas y auditadas por la comunidad y proveedores, lo que reduce riesgos.

  • Evita imágenes de origen desconocido.
  • Gana actualizaciones y parches confiables.
  • Mejora la trazabilidad del origen.

Ejemplo de pull seguro.

docker pull ubuntu:22.04

¿Cómo fijar etiquetas y evitar latest en la imagen base?

Evita latest. Fija una versión estable para prevenir cambios inesperados que rompan tu build. Elige etiquetas como ubuntu:20.04, 22.04 o 24.04.

Ejemplo con versiones fijas.

# Evita: FROM ubuntu:latest
FROM ubuntu:22.04

¿Cómo optimizar tamaño y rendimiento sin sacrificar estabilidad?

Reduce el tamaño cuando ayude, pero prioriza el rendimiento. Imágenes como Alpine son famosas por su tamaño (~5 MB), útiles para acelerar descargas y despliegues, siempre considerando el desempeño de tu app.

¿Cuándo usar Alpine y qué considerar del rendimiento?

Al usar Alpine, evalúa si tus dependencias funcionan bien y sin penalizaciones de performance. Si tu carga es intensiva, prioriza el desempeño antes que el tamaño.

Ejemplo mínimo con Alpine.

FROM alpine:3.19
RUN apk add --no-cache ca-certificates
CMD ["sh", "-c", "echo imagen ligera lista"]

¿Cómo aplicar builds multi stage para imágenes pequeñas y legibles?

Un Dockerfile multi stage mantiene el build ordenado y produce imágenes finales más pequeñas, separando la fase de compilación de la de ejecución. Facilita la lectura y evita arrastrar herramientas innecesarias.

Ejemplo multi stage genérico.

# Etapa de build
FROM ubuntu:22.04 AS build
RUN apt-get update && apt-get install -y build-essential
WORKDIR /app
# Copia y compila tu código aquí
# RUN make build

# Etapa final mínima
FROM ubuntu:22.04
WORKDIR /app
# COPY --from=build /app/bin/app ./app
CMD ["sh", "-c", "echo imagen final optimizada"]

¿Qué mantenimientos y seguridad refuerzan tu Dockerfile?

La limpieza periódica y el principio de mínimos privilegios fortalecen tu flujo de trabajo. Además, excluye archivos innecesarios del build context para acelerar y reducir capas.

¿Cómo limpiar caché y liberar espacio con prune?

Usa prune con regularidad para recuperar espacio en disco y limpiar cachés que se acumulan por uso cotidiano.

Comandos útiles.

# Limpia recursos no usados: contenedores detenidos, redes, imágenes dangling y caché.
docker system prune -f

# Limpia caché de build.
docker builder prune -f

¿Cómo crear y usar un usuario no root en el Dockerfile?

Evita ejecutar como root. Crea un usuario con privilegios mínimos y úsalo en tiempo de ejecución para elevar la seguridad.

Ejemplo con usuario no root.

FROM ubuntu:22.04
RUN useradd -m -u 10001 appuser
USER appuser
WORKDIR /app
CMD ["sh", "-c", "echo ejecutando como usuario no root"]

¿Cómo excluir archivos innecesarios con .dockerignore?

Complementa el tamaño reducido evitando enviar archivos irrelevantes al build context. Así disminuyes tiempo de compilación y el riesgo de filtrar datos.

Ejemplo de .dockerignore.

.git
node_modules
*.log
.DS_Store

¿Tienes otras prácticas que te funcionen mejor en tu equipo o dudas sobre su aplicación en tu entorno? Comparte tu experiencia y preguntas en los comentarios.