Optimización de imágenes de Docker

Optimización de imágenes de Docker

A los desarrolladores les gusta trabajar con Docker por su flexibilidad y facilidad de uso. Al crear aplicaciones, vale la pena invertir el tiempo extra optimizando las imágenes de Docker y Dockerfiles. La optimización ayudará a los equipos a compartir imágenes más pequeñas, mejorar el rendimiento y facilitar la depuración de los problemas. A continuación se presentan algunas recomendaciones para crear mejores imágenes y Dockerfiles.

Optimización de imágenes de Docker

Las imágenes de Docker grandes pueden dificultar la compartir. Además, las imágenes grandes ralentizan la ejecución. Por lo tanto, la optimización de las imágenes puede ayudar con el proceso general de desarrollo y producción.

Seleccione imágenes base adecuadas

Las imágenes disponibles en Docker Hub ya están optimizadas. En lugar de construir el suyo, es una buena idea usar las imágenes optimizadas disponibles. Por ejemplo, si necesita una imagen Redis, tiene la opción de construirla en una imagen de Ubuntu o descargar directamente el Redis One. Usar la imagen Redis ya construida es una mejor opción porque los desarrolladores ya se han encargado de cualquier paquete redundante.

Use compilaciones de múltiples etapas

La nueva opción de múltiples etapas en Docker (desde la versión 17.05) puede ayudarlo a crear formas inteligentes de optimizar sus imágenes. Puede crear una aplicación y luego transferirla a un nuevo entorno limpio para implementar. Se asegurará de que solo las bibliotecas y dependencias de tiempo de ejecución necesarias sean parte de la imagen final.

Reducir el número de capas

Al construir una imagen, preste atención a las capas creadas por Dockerfiles. Cada comando de ejecución crea una nueva capa. Entonces, combinar las capas puede reducir el tamaño de la imagen. Un ejemplo simple es el apt-get. En general, los usuarios ejecutan el comando así:

Ejecutar Apt -Get -y Actualización
Ejecutar apt -get install -y python

Creará dos capas. Pero combinar los comandos creará una sola capa en la imagen final:

Ejecutar apt -get -y update && apt -get install -y python

Entonces, las combinaciones inteligentes de comandos pueden conducir a imágenes más pequeñas.

Construir imágenes base personalizadas

Imágenes de Docker Caches. Si necesita múltiples instancias de las mismas capas, es una buena idea considerar la optimización de las capas y crear una imagen base personalizada. Acelerará los tiempos de carga y facilitará rastrear.

Construir en la parte superior de las imágenes de producción

Las imágenes de prueba requieren más herramientas y bibliotecas para probar funciones. Es una buena idea usar la imagen de producción como base y crear imágenes de prueba encima de ella. Los archivos de prueba innecesarios estarán fuera de la base. Entonces, las imágenes de producción se mantendrán pequeñas y limpias para la implementación.

Evite almacenar datos de aplicaciones

El almacenamiento de los datos de la aplicación en el contenedor se disparará sus imágenes. Para los entornos de producción, siempre use la función de volumen para mantener el contenedor separado de los datos.

Las mejores prácticas para escribir Dockerfiles

DockerFiles permite a los desarrolladores codificar procesos. Por lo tanto, es una gran herramienta para mejorar el proceso de construcción de imágenes de Docker. Aquí hay algunas prácticas que lo ayudarán a mejorar su desarrollo.

Diseño de contenedores efímeros

Intente diseñar contenedores que sean fáciles de crear y destruir. Si los contenedores dependen demasiado de entornos y configuraciones periféricas, son más difíciles de mantener. Por lo tanto, el diseño de contenedores sin estado puede ayudar a simplificar el sistema.

Usar .Dockerignore para optimizar las imágenes

Si tiene una compilación complicada que pasa por múltiples directorios de forma recursiva, todos los archivos y directorios se envían al Docker Daemon. Puede dar como resultado imágenes más grandes y tiempos de construcción más lentos. Puedes usar el .dockerignore para excluir archivos y carpetas innecesarios que complican el proceso de compilación.

Use compilaciones de múltiples etapas

Las construcciones de varias etapas son una nueva característica de Docker desde la versión 17.05. Permite a los desarrolladores construir múltiples imágenes en el mismo Dockerfile y mover artefactos de un contenedor a otro en el propio Dockerfile. Por lo tanto, puede tener artefactos más pequeños y optimizados en su imagen final sin usar scripts complicados para lograr los mismos resultados.

Instale los paquetes requeridos solamente

Dockerfile debe instalar solo los paquetes mínimos necesarios para ejecutar los servicios. Cada paquete requiere espacio en la imagen. Por lo tanto, ciertas aplicaciones como ping o editor de texto pueden ser innecesarios en el contexto del servicio que se ejecutará en el contenedor. Comprender los requisitos de un servicio en particular puede ayudarlo a escribir mejores DockerFiles que pueden crear imágenes optimizadas.

Piense en microservicios

Diseñar DockerFiles con la arquitectura de microservicios en mente puede ser útil. No siempre es posible implementar un proceso por contenedor. Pero los desarrolladores pueden pensar cómo distribuir sus procesos de manera más proactiva y tomar decisiones que ayuden a implementar los servicios de manera desacoplada. Los contenedores son un ajuste natural para el diseño modular. Entonces, sus Dockerfiles deben aprovechar las oportunidades que ofrece Docker.

Considere el efecto de las instrucciones sobre las capas

Solo ejecute, copie y agregue Dockerfiles Crear nuevas capas desde la versión 1.10. Otras instrucciones no afectan directamente el tamaño de las imágenes finales. Entonces debes estar atento cuando usan estos comandos. Además, combinar múltiples comandos puede disminuir el número de capas. Menos capas significan tamaños más pequeños.

Ordenar argumentos de múltiples líneas

Siempre que tenga un argumento de múltiples líneas, ordene los argumentos alfanuméricamente para mejorar el mantenimiento del código. Los argumentos al azar pueden conducir a duplicaciones. También son más difíciles de actualizar. Un buen ejemplo:

Ejecute Apt-Get Update && apt-get install -y \
apache2 \
git \
iputils-ping \
Python \

Evite usar: Último

Si está utilizando desde [ImageName]: Last, puede tener problemas siempre que la imagen cambie. Puede convertirse en un problema difícil de rastrear. El uso de etiquetas específicas puede asegurarse de conocer la imagen exacta que se utiliza desde el registro de Docker.

Agregar solo archivos requeridos desde el directorio

Los comandos DockerFile se ejecutan consecutivamente para construir imágenes y solo construye capas que aún no están presentes. Supongamos que tienes un paquete.JSON para NPM y requisitos.txt para pip. Puede escribir el siguiente DockerFile donde paquete.JSON y requisitos.txt están en la carpeta de micodos:

COPIAR ./Mycode//Home/Program/
Ejecutar instalación de NPM
Ejecutar requisitos de PIP Install -R

Sin embargo, cada vez que hay un cambio en cualquiera de los archivos en Mycode, ambos comandos de ejecución deben ser reconstruidos. En cambio, si el código está escrito de la siguiente manera:

COPIAR ./mycode/paquete.JSON/HOME/Programa/Paquete.json
Workdir /Home /Program
Ejecutar instalación de NPM
COPIAR ./Mycode/Requisitos.txt/home/programa/requisitos.TXT
Workdir /Home /Program
Ejecutar requisitos de PIP Install -R

Luego, los comandos de ejecución serán independientes entre sí y el cambio en un solo archivo en la carpeta Mycode no afectará los comandos de ejecución npm y pip. Mirar dependencias como esta puede ayudarlo a escribir mejores Dockerfiles.

Estudio adicional

Las técnicas y las mejores prácticas anteriores deberían ayudarlo a construir imágenes de Docker más pequeñas y escribir mejores Dockerfiles. Aquí hay enlaces para ayudarlo a encontrar más información sobre diferentes temas:

  • Las mejores prácticas de Docker Development
  • Construcciones de Docker Multi-Etess
  • Referencia de archivo de Docker

Referencias:

  • https: // documentos.estibador.com/desarrollo/dev-best-práctica/
  • https: // documentos.estibador.com/motor/userguide/Eng-Image/Dockerfile_Best-Practices/
  • https: // documentos.estibador.com/motor/userguide/Eng-Image/BaseImages/
  • https: // documentos.estibador.com/motor/userguide/Eng-IMage/Multiana-Build/
  • https: // blog.mierda de códigos.com/reduce-docker-imagen/tamaño/
  • https: // hackernoon.com/tips to-reduce-docker-image-sizes-876095da3b34
  • https: // documentos.estibador.com/motor/reference/builder/#dockerignore-file
  • https: // runnable.com/Blog/9-Common-Dockerfile-Mistakes

https: // linuxhint.com/install-and-Use-docker-on-Ubuntu/