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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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 \ |
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.
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.
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:
https: // linuxhint.com/install-and-Use-docker-on-Ubuntu/