6 mejores prácticas para el uso de contenedores

Hablemos de algunas de las mejores prácticas que debe seguir al usar contenedores.

La contenedorización se usa ampliamente en varias organizaciones para implementar aplicaciones dentro de un contenedor. Estos contenedores son populares porque son muy livianos. Para aprovechar al máximo los contenedores, debe seguir algunas prácticas recomendadas mientras trabaja con ellos.

Usar imagen base estable

Gracias a Docker, crear imágenes de contenedores nunca ha sido tan sencillo.

Especifique su imagen base, agregue sus cambios y cree su contenedor. Si bien esto es excelente para comenzar, el uso de las imágenes base predeterminadas puede generar imágenes grandes llenas de vulnerabilidades de seguridad. Además, evite usar la imagen acoplable de la etiqueta “Última” ya que existe una gran posibilidad de que haya un error presente en ella.

La mayoría de las imágenes de Docker utilizan Debian o Ubuntu como imagen base. Son muy útiles en términos de compatibilidad y fácil incorporación, pero estas imágenes base pueden agregar cientos de megabytes de sobrecarga adicional a su contenedor.

Por ejemplo, las aplicaciones simples Node.js y Go, “hola mundo” tienen alrededor de 700 megabytes. Es probable que su aplicación solo tenga unos pocos megabytes de tamaño. Por lo tanto, toda esta sobrecarga adicional es espacio desperdiciado y un excelente escondite para vulnerabilidades y errores de seguridad.

Si su lenguaje de programación o pila no tiene una opción para una imagen base pequeña, puede construir su contenedor utilizando Alpine Linux sin formato como punto de partida. Esto también le da un control completo sobre lo que pasa dentro de sus contenedores.

Mantenga las imágenes de los contenedores más pequeñas

Usar imágenes base más pequeñas es probablemente la forma más fácil de reducir el tamaño de su contenedor.

Lo más probable es que su idioma o la pila que está utilizando proporcione una imagen oficial que sea mucho más pequeña que la imagen predeterminada. Por ejemplo, echemos un vistazo al contenedor Node.js. Pasar del nodo predeterminado: más reciente al nodo: 14-alpine reduce el tamaño de la imagen base casi diez veces.

última etiqueta de nodejs - geekflare

contra….

etiqueta alpina de nodejs - geekflare

En el nuevo archivo Docker, el contenedor comienza con la imagen node:alpine, crea un directorio para el código, instala las dependencias con NPM y, finalmente, inicia el servidor Node.js. Con esta actualización, el contenedor resultante es casi diez veces más pequeño.

El contenedor se crea aún más ligero utilizando el patrón de construcción. Con los lenguajes interpretativos, el código fuente se envía a un intérprete y luego se ejecuta directamente. Pero con un lenguaje compilado, el código fuente se convierte en código compilado de antemano.

Ahora, con los lenguajes de compilación, el paso de compilación a menudo requiere herramientas que no son necesarias para ejecutar el código. Esto significa que puede eliminar estas herramientas del contenedor final por completo. Para hacer esto, puede usar el patrón de construcción. El primer contenedor construye el código y luego el código compilado se empaqueta en el contenedor final sin todos los compiladores y herramientas necesarios para crear el código compilado.

El uso de imágenes base pequeñas y el patrón de construcción son excelentes formas de crear contenedores mucho más pequeños sin mucho trabajo.

Etiqueta tus imágenes de contenedores

El etiquetado de Docker es una herramienta excepcionalmente poderosa para nosotros cuando se trata de administrar nuestras imágenes. Ayuda a administrar diferentes versiones de una imagen acoplable. A continuación se muestra un ejemplo de creación de una imagen acoplable con el nombre de etiqueta v1.0.1

docker build -t geekflare/ubuntu:v1.0.1

Ahora, se utilizan dos tipos de etiquetas: Estable etiquetas Único etiquetas

Use etiquetas estables para mantener la imagen base del contenedor. Evite usar estas etiquetas para contenedores de implementación porque estas etiquetas recibirán actualizaciones con frecuencia y pueden generar incoherencias en el entorno de producción.

Use etiquetas únicas para las implementaciones. Con etiquetas únicas, puede escalar su clúster de producción a muchos nodos con facilidad. Evita las incoherencias y los hosts no extraerán ninguna otra versión de la imagen de la ventana acoplable.

Además, como buena práctica, debe bloquear las etiquetas de imagen implementadas configurando la habilitación de escritura en falso. Esto ayuda a no eliminar la imagen implementada del registro por error.

Seguridad del contenedor

A continuación se detallan los puntos fundamentales para asegurarse de que el contenedor esté seguro.

Verifique la autenticidad de cualquier software que instale en su contenedor Use imágenes docker firmadas o imágenes con una suma de verificación válida. Asegúrese de que la URL use HTTPS si está usando un repositorio de terceros. Incluya las claves GPG correctas antes de usar su administrador de paquetes para actualizar los paquetes. Nunca ejecute sus aplicaciones como root. Siempre debe usar la directiva de usuario dentro del dockerfile para asegurarse de que elimina los privilegios de su usuario. No ejecute SSH dentro de su contenedor. Haga que el sistema de archivos sea de solo lectura. Use espacios de nombres para dividir su clúster.

El punto de referencia de Docker ha sido proporcionado por el Center for Internet Security (CIS) para evaluar la seguridad de un contenedor docker. Han proporcionado un script de código abierto llamado Docker Bench for Security, que puede ejecutar para verificar qué tan seguro es un contenedor docker.

Una aplicación por envase

Las máquinas virtuales son bastante buenas para ejecutar varias cosas en paralelo, pero cuando se trata de contenedores, debe ejecutar una sola aplicación dentro de un contenedor. Por ejemplo, si ejecuta una aplicación MEAN en un entorno en contenedores, debe tener un contenedor para MongoDB, un contenedor para Express.js, un contenedor para Angular y un contenedor para Node.js.

Incluso los contenedores pueden ejecutar varias aplicaciones en paralelo, pero luego puede aprovechar el modelo de contenedor. A continuación se muestra una representación correcta e incorrecta de aplicaciones en ejecución en un contenedor.

aplicación única un contenedor - geekflare

Los contenedores están diseñados para tener un ciclo de vida similar al de la aplicación que ejecuta. Cuando se inicie el contenedor, se iniciará la aplicación. Cuando un contenedor se detiene, la aplicación también se detiene.

Ejecutar contenedores sin estado

Los contenedores están diseñados fundamentalmente para ser sin estado. En este caso, los datos persistentes que contienen información sobre el estado del contenedor se almacenan fuera del contenedor. Los archivos se pueden almacenar en un almacén de objetos, como el almacenamiento en la nube, para almacenar la información de la sesión del usuario, puede usar una base de datos de baja latencia como Redis y también puede adjuntar un disco externo para el almacenamiento a nivel de bloque.

Al mantener el almacenamiento fuera del contenedor, puede cerrar o destruir fácilmente un contenedor sin temor a perder ningún dato.

Si usa contenedores sin estado, es muy fácil migrar o escalar según las necesidades comerciales.

Conclusión

Las anteriores son algunas de las prácticas más importantes que se deben seguir al trabajar con contenedores si está creando un entorno de producción de Docker, luego consulte cómo asegurarlo.

Botón volver arriba