Publicamos una nueva traducción y esperamos que las recomendaciones del autor le ayuden a optimizar su imagen de Docker.
Desde sus inicios, Docker ha revolucionado la forma en que usamos los contenedores. Esto se debe principalmente a la simplicidad que proporciona Docker. Se puede utilizar sin siquiera comprender ningún tema complejo de contenedores.
Si es nuevo en Docker, puede elegir una plantilla (imagen base) y definir sus instrucciones (comandos de Dockerfile) para colocar su código dentro de la imagen y ejecutarlo.
La simplicidad de Docker lo guiará desde el principio de su uso, y la habilidad para optimizarlo viene con la experiencia y, por lo general, lleva tiempo.
He trabajado con Docker durante mucho tiempo, así que decidí compartir mi experiencia sobre cómo crear contenedores mejor, incluso si eres un principiante.
1. Defina las unidades en caché ➱
¿Sabía que cada comando RUN incluido en el Dockerfile afecta el nivel de almacenamiento en caché?
El uso de varios comandos RUN para instalar paquetes afectará el rendimiento y la eficiencia del proceso de compilación. El uso de un comando RUN para instalar todos los paquetes y dependencias lo ayudará a crear una unidad en caché en lugar de varias.
RUN apt-get update && apt-get install -y \ aufs-tools \ automake \ build-essential \ curl \ dpkg-sig \ libcap-dev \ libsqlite3-dev \ mercurial \ reprepro \ ruby1.9.1 \ ruby1.9.1-dev \ s3cmd=1.1.*
2. Reducir el tamaño de la imagen
El tamaño de la imagen juega un papel importante en la creación de un buen Dockerfile. El uso de imágenes más pequeñas facilita una implementación más rápida y reduce el potencial de ataques.
Eliminar dependencias innecesarias
Evite instalar herramientas innecesarias, como herramientas de depuración, en la imagen.
Si el administrador de paquetes usa automáticamente los paquetes recomendados para la instalación, use los indicadores del administrador de paquetes y evite instalar dependencias innecesarias.
RUN apt-get update && apt-get -y install --no-install-recommends
Consejo: comparta componentes reutilizables entre proyectos utilizando Bit ( Github ).
Bit facilita la documentación, el intercambio y la reutilización de componentes independientes entre proyectos. Úselo para reutilizar código, mantener la coherencia del diseño, la colaboración en equipo, aumentar la velocidad de entrega y crear aplicaciones escalables.
Bit es compatible con Node, TypeScript, React, Vue, Angular y más.
Explore los componentes publicados en Bit.dev
3. Soporte de imagen
Es muy importante elegir la imagen base adecuada para su aplicación.
Utilice la imagen oficial de Docker El
uso de la imagen oficial de Docker reduce su tamaño al reducir las dependencias innecesarias que hacen que la imagen sea más grande. Hay 3 beneficios principales de usar la imagen oficial:
- nos permite utilizar una imagen basada en las mejores prácticas,
- garantiza la fiabilidad de la imagen y su seguridad,
- aumenta la confianza y la seguridad.
#
FROM node:13.12.0-alpine
#
WORKDIR /app
# `/app/node_modules/.bin` $PATH
ENV PATH /app/node_modules/.bin:$PATH
Utilice etiquetas específicas
Al elegir una imagen base, se recomienda utilizar una etiqueta específica. No utilice la etiqueta más reciente para la imagen . La última etiqueta puede sufrir cambios importantes con el tiempo.
#
FROM node:13.12.0-alpine
Utilice una versión de compilación mínima Una
compilación mínima reduce el tamaño de la imagen final. Esto le ayuda a implementar aplicaciones de forma más rápida y segura.
Como puede ver en el ejemplo anterior, cuando se usa la construcción mínima, el tamaño de la imagen es menor. La mayoría de las imágenes utilizan el conjunto alpino. Alpine es una imagen muy ligera con un tamaño estándar de 2 MB.
Al utilizar una imagen de base alpina, podemos reducir significativamente el tamaño de la imagen resultante.
4. Reproducibilidad
Compilación desde la fuente en un entorno coherente
Si está utilizando Docker, es mejor compilar su aplicación en un entorno administrado para proporcionar aislamiento.
Debemos evitar crear aplicaciones localmente y agregarlas al registro.
De lo contrario, los paquetes que instaló en su entorno local pueden afectar la consistencia de la imagen. Probablemente nadie quiera estar en esta situación, ya que compromete una de las principales ventajas de Docker: la ejecución consistente en todos los entornos.
Uso de ensamblados de varias etapas para eliminar dependencias
Se recomienda que utilice un método de implementación de aplicaciones de varias etapas.
Esto elimina el uso de dependencias de ensamblado en un contenedor en ejecución.
Podemos construir la aplicación usando una imagen de construcción única que tiene dependencias de desarrollo y mover los binarios compilados a una imagen de contenedor separada para ejecutarla.
# Stage 0, "build-stage", based on Node.js, to build and compile the frontend
FROM node:13.12.0 as build-stage
WORKDIR /app
COPY package*.json /app/
RUN npm install
COPY ./ /app/
RUN npm run build
# Stage 1, based on Nginx, to have only the compiled app, ready for production with Nginx
FROM nginx:1.15
COPY --from=build-stage /app/build/ /usr/share/nginx/html
Hay dos pasos separados en el Dockerfile anterior. La etapa 0 se usa para construir una aplicación de nodo a partir de la imagen de nodo original, y la etapa 1 se usa para copiar los archivos ensamblados de la imagen de construcción a la imagen del servidor web (Nginx) que finalmente sirve a la aplicación.
Conclusión
Eso es todo lo que quería decirte. Si es nuevo en Docker, le recomiendo que pruebe las prácticas descritas al crear su primera imagen. Esto le ayudará a comprender el tema con mayor profundidad y le permitirá utilizar Docker de forma eficaz desde el primer día.
Si conoce otras prácticas interesantes, comparta los comentarios. ¡Gracias por leer!