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

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

Use Stable Base Image

Gracias a Docker, creando contenedor las imágenes nunca ha sido más simple.

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 utilizar la imagen de la ventana acoplable de etiqueta "Última", ya que existe una gran posibilidad de que se presente un error.

Debian o Ubuntu se utilizan como imagen base en la mayoría de las imágenes de Docker. 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 de 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. Entonces, toda esta sobrecarga adicional es espacio desperdiciado y un gran escondite para vulnerabilidades de seguridad y errores.

Si su lenguaje de programación o pila no tiene una opción para una imagen base pequeña, puede construir su contenedor usando raw Alpine Linux como punto de partida. Esto también le da un control total sobre lo que entra en sus contenedores.

Keep Container Images Smaller

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 el idioma o la pila que está utilizando proporcione una imagen oficial mucho más pequeña que la imagen predeterminada. Por ejemplo, echemos un vistazo al contenedor de Node.js. Pasar del nodo predeterminado: último al nodo: 14-alpine reduce el tamaño de nuestra imagen base en casi diez veces.

Última etiqueta de nodejs - geekflare

contra….

etiqueta alpina 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 liviano 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. Entonces esto significa que puede quitar estas herramientas del contenedor final por completo. Para hacer esto, puede utilizar el patrón de construcción. El primer contenedor crea el código y luego el código compilado se empaqueta en el contenedor final sin todos los compiladores y herramientas necesarios para hacer el código compilado.

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

Tag your Container Images

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 cómo crear una imagen de Docker 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 Unique las etiquetas.

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

Use etiquetas únicas para implementaciones. Con etiquetas únicas, puede escalar su clúster de producción a muchos nodos con facilidad. Evita inconsistencias 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.

Container Security

A continuación se presentan los puntos fundamentales para asegurarse de que contenedor es seguro.

  • Verifique la autenticidad de cualquier software que instale en su contenedor
  • Utilice imágenes de Docker firmadas o imágenes con una suma de comprobación válida.
  • Asegúrese de que la URL esté usando 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 eliminar 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 Centro de Seguridad de Internet (CIS) para evaluar la seguridad de un contenedor de Docker. Han proporcionado un script de código abierto llamado Banco Docker para seguridad, que puede ejecutar para comprobar qué tan seguro es un contenedor Docker.

One Application Per Container

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 está ejecutando una aplicación MEAN en un entorno en contenedor, entonces 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 múltiples aplicaciones en paralelo, pero luego puede aprovechar el modelo de contenedor. A continuación se muestra una representación correcta e incorrecta de las 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 inicia el contenedor, se iniciará la aplicación. Cuando un contenedor se detiene, la aplicación también se detiene.

Run Stateless Containers

Los contenedores están diseñados fundamentalmente para ser apátridas. 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 almacenamiento en la nube, para almacenar 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

Lo anterior son algunas de las prácticas más importantes que debe seguir al trabajar con contenedores si está creando un entorno de producción de Docker, luego consulte como asegurar él.