DEV Community

Cover image for Crea imágenes Docker ligeras y seguras
Israel Oña Ordoñez 🚀
Israel Oña Ordoñez 🚀

Posted on

Crea imágenes Docker ligeras y seguras

📝 TL;DR

Optimizar tus imágenes Docker es esencial para mejorar los tiempos de construcción y despliegue, reducir costos y mejorar la seguridad. Este artículo muestra cómo usar multi-stage builds, elegir imágenes ligeras y aplicar buenas prácticas para crear imágenes Docker más eficientes.

 

🤔 ¿Por qué optimizar imágenes Docker?

En la contenerización, el tamaño y la seguridad de las imágenes Docker tienen un impacto significativo en el rendimiento, la eficiencia y la seguridad de las aplicaciones. Las imágenes grandes aumentan los tiempos de construcción, despliegue y consumo de recursos, mientras que las vulnerabilidades en las imágenes pueden exponer tu aplicación a riesgos de seguridad.

Optimizar tus imágenes Docker te permite:

  • Mejorar los tiempos de construcción y despliegue: Imágenes más pequeñas se construyen y despliegan más rápido.
  • Reducir costos de almacenamiento y transferencia: Imágenes más ligeras ocupan menos espacio y se transfieren más rápido.
  • Mejorar la seguridad: Reducir vulnerabilidades y riesgos de seguridad en tus imágenes.

 

⚙️ Principales estrategias de optimización

1. Multi-stage builds

Las multi-stage builds te permiten dividir la construcción de tu imagen en múltiples etapas, lo que te permite compilar y empaquetar tu aplicación en una etapa y copiar solo los artefactos necesarios a una imagen final más pequeña.

Multi-stage build

Beneficios:

  • Imágenes más pequeñas: La imagen final, basada en una imagen más ligera, solo contiene los artefactos necesarios.
  • Reduce la superficie de ataque: Las etapas de construcción no se incluyen en la imagen final.

 

2. Elegir imágenes base ligeras

Usar imágenes base ligeras y especializadas, como Alpine Linux, Slim o Buster, en lugar de imágenes genéricas como Ubuntu o Debian, puede reducir significativamente el tamaño de tus imágenes.

Imágenes base ligeras

Beneficios:

  • Imágenes más pequeñas: Las imágenes base ligeras tienen un tamaño reducido.
  • Menos vulnerabilidades: Menos paquetes y dependencias significan menos vulnerabilidades potenciales.

 

3. Usar un usuario no-root

Ejecutar contenedores con un usuario no-root (sin privilegios) mejora la seguridad de tus aplicaciones, ya que limita los daños potenciales en caso de una vulnerabilidad o ataque.

Usuario no-root

Beneficios:

  • Mejora la seguridad: Limita los daños potenciales en caso de una vulnerabilidad o ataque.
  • Cumplimiento de estándares de seguridad: Algunas regulaciones y estándares de seguridad requieren ejecutar aplicaciones con usuarios no-root.

 

4. Excluir archivos innecesarios

Usar .dockerignore para excluir archivos y directorios innecesarios de tus imágenes Docker puede reducir significativamente el tamaño de tus imágenes y mejorar los tiempos de construcción.

Excluir archivos innecesarios

Beneficios:

  • Imágenes más pequeñas: Menos archivos y directorios innecesarios.
  • Mejora los tiempos de construcción: Menos archivos a copiar y procesar.

 

5. Optimizar capas de imagen

Reducir el número de capas de imagen y combinar instrucciones en una sola capa puede mejorar el rendimiento y la eficiencia de tus imágenes Docker.

Optimizar capas de imagen

Beneficios:

  • Mejora el rendimiento: Menos capas significa menos operaciones de lectura/escritura.
  • Reduce el tamaño de la imagen: Menos capas y posibilidad de eliminar archivos temporales en la misma capa donde se crean.

 

6. Escaneo de vulnerabilidades

Utilizar herramientas de escaneo de vulnerabilidades, como Trivy, te permite identificar y corregir vulnerabilidades en tus imágenes Docker antes de desplegarlas en producción.

Escaneo de vulnerabilidades

Beneficios:

  • Mejora la seguridad: Identifica y corrige vulnerabilidades antes de desplegar tus imágenes.
  • Protege tu aplicación: Reduce el riesgo de ataques y brechas de seguridad.

 

🚀 Resultados de la optimización

Al aplicar estas estrategias de optimización, puedes obtener los siguientes resultados:

  • Imágenes más pequeñas: Reducción significativa del tamaño de las imágenes Docker, en este caso, de 1.12 GB a 159 MB.
  • Mejora de los tiempos de construcción: Reducción en los tiempos de construcción, en este caso, 60% más rápido.
  • Mejora de la seguridad: Reducción de vulnerabilidades y riesgos de seguridad en las imágenes, en este caso, 0 vulnerabilidades.
  • Mejora de la eficiencia: Reducción de costos de transferencia, en este caso, 85% menos de datos transferidos.
  • Cumplimiento de estándares de seguridad: Ejecución de contenedores con un usuario no-root para mejorar la seguridad.

 

📂 Repositorio del proyecto

Para ver un ejemplo práctico de cómo aplicar estas estrategias de optimización, puedes clonar o explorar el repositorio asociado.

Repositorio: https://github.com/israoo/docker-image-optimization

Este repositorio contiene:

  • Un ejemplo de Dockerfile con las mejores prácticas de optimización.
  • Un archivo .dockerignore para excluir archivos innecesarios.
  • Un script para escanear vulnerabilidades en la imagen Docker con Trivy.
  • Instrucciones detalladas en el archivo README.md sobre cómo construir, optimizar y escanear la imagen Docker paso a paso.

 

🔗 Referencias/Extras

 

🚀 ¿Qué sigue?

Prueba estas técnicas en tus proyectos y comparte los resultados. ¿Conoces otras estrategias para optimizar imágenes Docker? ¡Déjalas en los comentarios!

 

Top comments (0)