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.
.gitnode_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.
Fui a reddit a preguntar cuándo es mejor o no usar Distroless de Google:
Si tu aplicación necesita un runtime externo o paquetes del sistema operativo, Distroless no es buena opción. Es ideal solo para aplicaciones autocontenidas que no requieren librerías externas. Su ventaja es que es muy segura y mínima, pero no incluye herramientas de depuración. Además, si tus imágenes ya comparten una base común, como Ubuntu:24.01, el ahorro de espacio será mínimo.
Me perdí entre tanto comentarios pero super buena esta aoprtación!
Herramienta para detectar buenas buenas practicas en el Dockerfile.
Esta clase fue una recapitulación de lo que hemos visto en el curso
1️⃣ ¿Por qué no se recomienda usar la etiqueta “latest”?
Respuesta: Porque puede cambiar con el tiempo, generando inconsistencias o errores en entornos productivos. 🚫
2️⃣ ¿Qué ventaja tienen los Multi-Stage Builds?
Respuesta: Reducen el tamaño final de la imagen y separan la compilación del entorno de ejecución, mejorando seguridad y eficiencia. ⚡
3️⃣ ¿Qué beneficio ofrece crear un usuario no-root en una imagen Docker?
Respuesta: Limita los permisos dentro del contenedor, evitando accesos o acciones que puedan comprometer la seguridad del sistema. 🔒
🧱 ¿Qué es una imagen Distroless en Docker?
Una imagen Distroless (“sin distribución”) es una imagen Docker ultra mínima, que no incluye un sistema operativo completo como Ubuntu, Debian o Alpine.
👉 Solo contiene tu aplicación y sus dependencias necesarias para ejecutarla.