¿Cómo funciona la contenedorización?

Introducción

Si está involucrado en el mundo del desarrollo web, es posible que ya haya oído hablar de la creación de contenedores y todas sus ventajas o que incluso las haya disfrutado utilizando una de las muchas soluciones de creación de contenedores disponibles. No es una exageración decir que la creación de contenedores de software ha cambiado el mundo, tal como lo hizo el cambio de bare metal a máquinas virtuales (VM).

¿Qué es un contenedor?

Un contenedor es un paquete de software que incluye todas las herramientas del sistema operativo que utiliza (también llamadas dependencias) para funcionar como una unidad estándar. Las aplicaciones en contenedores están diseñadas para ejecutarse de manera confiable, independientemente de las dependencias instaladas en la máquina host.

Los contenedores suelen tener un tamaño de unas pocas docenas de megabytes en lugar de las máquinas virtuales normales, que registran decenas de gigabytes. Los contenedores también se inician casi al instante y usan muchos menos recursos del host que las máquinas virtuales completas, al mismo tiempo que brindan un aislamiento de procesos y una consistencia del entorno similares, independientemente de dónde se ejecuten. ¿Cómo se las arreglan para lograr todos esos beneficios?

Mirando debajo del capó

Desde un punto de vista técnico, un contenedor puede considerarse un tipo de máquina virtual. La diferencia fundamental es que la virtualización de contenedores se produce en el nivel del sistema operativo, mientras que los hipervisores tradicionales se virtualizan en la capa de hardware. En otras palabras, en lugar de imitar una plataforma de hardware para ejecutar un sistema operativo completo, los contenedores imitan el sistema operativo para ejecutar una aplicación.

Por lo tanto, los contenedores reducen la cantidad de recursos necesarios dedicados a la virtualización y comparten algunos de esos recursos con el host.

Los contenedores se pueden describir como una unidad de código estándar, ya que implica encapsular aplicaciones y sus dependencias para garantizar que se ejecuten de manera confiable independientemente del entorno informático. Dado que todas las interacciones con el sistema operativo están virtualizadas, los contenedores se ejecutan como procesos aislados similares a una máquina virtual tradicional.

La estructura de los formatos de los contenedores está estandarizada por la Iniciativa de contenedores abiertos (OCI). El motor de contenedorización más popular que implementa estos estándares es Docker, que agrega varias características útiles a las capacidades estándar de los contenedores. Las imágenes del contenedor Docker son de solo lectura, con un volumen de lectura/escritura que maneja cualquier cambio en el sistema de archivos virtual. Al girar varias copias de un contenedor, estas usan la misma imagen base. Solo los cambios se almacenan por separado, lo que reduce drásticamente el espacio en disco necesario para manejar docenas o cientos de contenedores dentro de la misma máquina física.

Seguridad y Rendimiento

Parte de lo que permite que los contenedores logren este uso de recursos notablemente bajo es que comparten el kernel de la máquina host a pesar de estar virtualizados a nivel de proceso. Esto significa que un contenedor que compromete la estabilidad del kernel del sistema operativo puede afectar potencialmente a la máquina host u otros contenedores que se ejecutan sobre él.

Afortunadamente, incluso en el caso de una aplicación que se comporta mal, los contenedores brindan métodos para recuperarse de fallas y mitigar este tipo de problema. Dado que la imagen base aún está intacta, es posible reiniciar automáticamente el contenedor a un estado limpio conocido e inmediatamente continuar con el manejo de las solicitudes. Con un tiempo de inicio medido en milisegundos, cualquier tiempo de inactividad causado por el reinicio de un contenedor apenas se nota.

Orquestación

Teniendo en cuenta lo fácil que es poner en marcha nuevos contenedores, los pocos recursos que utilizan y lo bien que pueden empaquetar aplicaciones individualmente, se pueden aprovisionar sobre la marcha para gestionar tareas específicas y apagarlos cuando ya no se necesiten. Esta técnica, conocida como orquestación o automatización en la nube, es muy valiosa para la automatización de infraestructuras y aplicaciones distribuidas y ejecuta una gran cantidad de pruebas simultáneamente durante el desarrollo de la aplicación. Cuando la orquestación se combina con la virtualización tradicional, varios contenedores se ejecutan en varias máquinas virtuales para usar los recursos en un centro de datos de manera más eficiente.

Los dos nombres más destacados en la orquestación de contenedores estándar de la industria son Kubernetes y Docker Swarm. Ambos coordinan contenedores dentro de un clúster a escala. Kubernetes fue inicialmente diseñado por Google y ahora es mantenido por el Cloud Fundación de Computación Nativa. A pesar de lo que su nombre pueda implicar, Docker Swarm no es la única herramienta de orquestación que puede manejar imágenes de Docker; Kubernetes se usa con mayor frecuencia con imágenes de Docker.

En términos generales, Kubernetes es una herramienta más avanzada y adecuada para cargas de trabajo de gran carga/alta disponibilidad, mientras que Docker Swarm es más fácil de configurar e implementar con una instalación simple.

Persistencia de datos

Como acabamos de ver, una de las ventajas más valiosas de los contenedores es la facilidad con la que se pueden crear y destruir un gran número de ellos. Sin embargo, los archivos guardados en el disco virtual del contenedor se pierden cuando el contenedor se elimina o se reinicia desde su imagen original. Además, dado que los contenedores están aislados por procesos entre sí y del sistema operativo host, estos archivos no son fácilmente accesibles fuera del contenedor. Eso plantea la pregunta: ¿cómo almacena datos persistentes para evitar perderlos una vez que ya no se necesita el contenedor?

Almacenamiento de archivos

ofertas Docker múltiples formas para manejar el almacenamiento persistente de archivos, según sus necesidades. El tipo más básico son los montajes de enlace, que toman un archivo o directorio en la máquina host y lo montan en un contenedor. Los montajes de enlace son de alto rendimiento y se pueden usar para compartir datos dentro y fuera del contenedor. Sin embargo, debido a que permiten que los contenedores accedan o cambien archivos importantes en el sistema de archivos del host, use los montajes de enlace con cuidado.

Por este motivo, se recomienda utilizar volúmenes siempre que sea posible. Un volumen es un contenedor dedicado al almacenamiento, que se puede montar en muchos otros contenedores simultáneamente y es apoyado por Kubernetes. Los volúmenes no se eliminan automáticamente cuando un contenedor ya no los usa, por lo que sus datos permanecen en la máquina host hasta que se eliminen manualmente.

Otras opciones de almacenamiento

La diferencia entre los volúmenes y los montajes de enlace depende principalmente de su funcionalidad subyacente, pero para el contenedor, estos aparecen igual que cualquier otro archivo o directorio. Sin embargo, otros almacenes de datos no siguen necesariamente la misma estructura y, por lo tanto, son adecuados para diferentes tareas.

Una tienda de clave-valor como etc. es muy útil para realizar un seguimiento de los datos críticos de la infraestructura, como la configuración, el estado y los metadatos, cuando se organiza una gran cantidad de contenedores con Kubernetes o Docker. Los datos se almacenan jerárquicamente como en un sistema de archivos normal, pero se leen y escriben con herramientas HTTP estándar, como cURL. Los datos almacenados en etcd están disponibles en todos los nodos del clúster, mientras que un nodo líder maneja todas las decisiones que necesitan consenso en todo el clúster, como las escrituras.

Un proceso de elección ocurre automáticamente cada vez que el líder muere o ya no responde para evitar que el líder se convierta en un único punto de falla, lo que hace que etcd sea muy resistente incluso en entornos poco confiables.

Para otro tipo de información estructurada, una base de datos es la opción más adecuada. Esta base de datos puede vivir externamente y recibir solicitudes de los contenedores a través de la red, pero también puede hospedarse dentro de un contenedor (con el motor de la base de datos y el almacenamiento real de la base de datos en volúmenes de contenedor separados) para aprovechar todos los beneficios de la contenedorización discutidos anteriormente.

El propósito de los contenedores

La eficiencia de los recursos de los contenedores los hace excelentes para la orquestación y el equilibrio de carga en una gran cantidad de servidores, pero los contenedores también llenan un nicho en el otro extremo del espectro. Dado que los contenedores permiten que las dependencias de las aplicaciones se estandaricen y se ejecuten de manera confiable de un entorno a otro, son perfectos para desarrollar aplicaciones en una estación de trabajo e implementar cambios en el servidor sin problemas.

Dado que los contenedores comparten el kernel con la máquina host, parecería imposible ejecutar un contenedor creado para Linux en una estación de trabajo con Windows. Pero gracias a herramientas de virtualización adicionales como Subsistema de Windows para Linux y Hiper-V, Docker para Windows puede ejecutar imágenes de contenedores de Linux sin crear una máquina virtual completa. Esto significa que incluso un entorno de desarrollo mixto puede funcionar sin problemas y compartir código entre desarrolladores y servidores.

Tener la aplicación completamente en contenedores durante el ciclo de vida del desarrollo del software también facilita la creación de herramientas adicionales para automatizar las pruebas y la implementación de la aplicación después de realizar cambios. Las herramientas de orquestación pasan rápidamente por una gran cantidad de escenarios de prueba en paralelo.

¿Cuándo se prefieren las máquinas virtuales a los contenedores?

Es posible que algunas aplicaciones heredadas que requieren una versión anterior del kernel no se ejecuten correctamente dentro de un contenedor. Dado que la estabilidad es mucho más crítica con este tipo de aplicación, la virtualización completa del sistema operativo es la mejor opción para migrar a un entorno basado en la nube sin la necesidad de mantener un hardware obsoleto y propenso a fallas.

Ejecute siempre código que no sea de confianza en una máquina completamente virtual para mitigar la posibilidad de que una vulnerabilidad del kernel permita que una pieza de malware en un contenedor afecte al host u otros contenedores que se ejecutan sobre él. Esto también se aplica a los sistemas de seguridad críticos donde una vulnerabilidad puede ser devastadora independientemente de su baja probabilidad.

Conclusión

¿Está listo para comenzar a construir su propia infraestructura en contenedores? Consulte nuestras ofertas de nube privada para orquestar múltiples hosts de contenedores con facilidad, o comuníquese con uno de nuestros útiles expertos en soluciones para encontrar la configuración perfecta para usted.

Related Posts