Hablemos de algunas de las mejores prácticas que debe seguir al utilizar contenedores
La contenedorización se está utilizando ampliamente en varias organizaciones para desplegar aplicaciones dentro de un contenedor. Estos contenedores son populares porque son muy ligeros. Para aprovechar al máximo los contenedores, debe seguir algunas de las mejores prácticas mientras trabaja con ellos
Utilice una imagen base estable
Gracias a Docker, crear imágenes de contenedores nunca ha sido tan sencillo
Especifique su imagen base, añada sus cambios y construya su contenedor. Aunque esto es estupendo para empezar, utilizar las imágenes base predeterminadas puede dar lugar a grandes imágenes llenas de vulnerabilidades de seguridad. Además, evite utilizar la imagen Docker con la etiqueta “Latest”, ya que existe una enorme probabilidad de que contenga algún error
La mayoría de las imágenes Docker utilizan Debian o Ubuntu como imagen base. Son muy útiles en términos de compatibilidad y facilidad de incorporación, pero estas imágenes base pueden añadir cientos de megabytes de sobrecarga adicional a su contenedor
Por ejemplo, las aplicaciones simples de Node.js y Go, “hola mundo”, rondan los 700 megabytes. Su aplicación es probablemente sólo unos pocos megabytes de tamaño. Por lo tanto, toda esta sobrecarga adicional es espacio desperdiciado y un gran escondite para vulnerabilidades de seguridad y bugs
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 en bruto como punto de partida. Esto también le da un control completo sobre lo que va dentro de sus contenedores
Mantenga las imágenes de contenedor más pequeñas
Utilizar 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 lenguaje o pila que esté utilizando proporcione una imagen oficial mucho más pequeña que la imagen por defecto. Por ejemplo, echemos un vistazo al contenedor Node.js. Pasar de la imagen por defecto node:latest a node:14-alpine reduce el tamaño de nuestra imagen base en casi diez veces
vs….
En el nuevo archivo Docker, el contenedor se inicia con la imagen node:alpine, crea un directorio para el código, instala las dependencias con NPM y, por último, inicia el servidor Node.js. Con esta actualización, el contenedor resultante es casi diez veces más pequeño
Puede crear el contenedor aún más ligero utilizando el patrón constructor. 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 previamente en código compilado
Ahora bien, con los lenguajes compilados, el paso de compilación suele requerir herramientas que no son necesarias para ejecutar el código. Esto significa que puede eliminar completamente estas herramientas del contenedor final. Para ello, puede utilizar el patrón constructor. El primer contenedor construye el código y, a continuación, el código compilado se empaqueta en el contenedor final sin todos los compiladores y herramientas necesarios para realizar el código compilado
El uso de pequeñas imágenes base y el patrón constructor son excelentes formas de crear contenedores mucho más pequeños sin mucho trabajo
Etiquete sus imágenes contenedoras
El etiquetado Docker es una herramienta excepcionalmente poderosa para nosotros cuando se trata de gestionar nuestras imágenes. Ayuda en la gestión de diferentes versiones de una imagen Docker. A continuación se muestra un ejemplo de la construcción de una imagen docker con nombre de etiqueta v1.0.1
docker build -t geekflare/ubuntu:v1.0.1
Ahora bien, se utilizan dos tipos de etiquetas: Etiquetas estables Etiquetas únicas
Utilice etiquetas estables para mantener la imagen base del contenedor. Evite utilizar estas etiquetas para contenedores de despliegue porque estas etiquetas recibirán actualizaciones con frecuencia, y puede dar lugar a inconsistencias en el entorno de producción
Utilice etiquetas únicas para los despliegues. Utilizando etiquetas únicas, puede escalar su clúster de producción a muchos nodos con facilidad. Evita incoherencias, y los hosts no tirarán de ninguna otra versión de imagen Docker
Además, como buena práctica, debe bloquear las etiquetas de imagen desplegadas estableciendo write-enable en false. Esto ayuda a no eliminar la imagen desplegada del registro por error
Seguridad del contenedor
A continuación se indican los puntos fundamentales para asegurarse de que el contenedor es seguro
- Verifique la autenticidad de cualquier software que instale en su contenedor
- Utilice imágenes Docker firmadas o con una suma de comprobación válida.
- Asegúrese de que la URL utiliza HTTPS si utiliza un repositorio de terceros.
- Incluya las claves GPG correctas antes de utilizar su gestor de paquetes para actualizar los paquetes
- Nunca ejecute sus aplicaciones como root. Siempre debe utilizar la directiva user dentro del dockerfile para asegurarse de que baja los privilegios de su usuario.
- No ejecute SSH dentro de su contenedor.
- Haga que el sistema de archivos sea de sólo lectura.
- Utilice Namespaces para dividir su cluster.
Docker benchmark ha sido proporcionado por el Centro para la Seguridad en Internet (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 comprobar cómo de seguro es un contenedor Docker
Una aplicación por contenedor
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 de contenedores, entonces debería 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 en él, pero entonces usted puede tomar ventaja del modelo de contenedor. A continuación se muestra una representación correcta e incorrecta de la ejecución de aplicaciones en un contenedor
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 inicia 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 no tener 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 de usuario se puede utilizar una base de datos de baja latencia como Redis y también se puede adjuntar un disco externo para el almacenamiento a nivel de bloque
Al mantener el almacenamiento fuera del contenedor, puede apagar o destruir fácilmente un contenedor sin temor a perder ningún dato
Si utiliza contenedores sin estado, es muy fácil migrar o escalar según las necesidades de la empresa
Conclusión
Las anteriores son algunas de las prácticas más importantes que uno debe seguir mientras se trabaja con contenedores si usted está construyendo un entorno de producción Docker a continuación, echa un vistazo a cómo asegurarlo.
-
Avi es un entusiasta de la tecnología con experiencia en tecnologías de tendencia como DevOps, Cloud Computing, Big Data y muchas más. Le apasiona aprender tecnologías de vanguardia y compartir sus conocimientos con los demás a través de... Seguir leyendo