Índice de temas
Capítulo 2: Contenedores frente a máquinas virtuales: diferencias y posicionamiento
La tecnología de contenedores ha adquirido una gran relevancia en los últimos años y se ha convertido en un concepto muy popular dentro del mundo del TI. Sin embargo, para el público general, todavía quedan ciertas dudas en cuanto a su funcionamiento y propósito.
En los siguientes párrafos, se pretende dar una introducción teórica a la tecnología de contenedores, señalando los aspectos claves de su arquitectura que la hacen diferente de la virtualización clásica y posicionándolo dentro del ecosistema de contenedores y microservicios.
Este artículo queda enmarcado dentro de un trabajo de un ámbito más global, realizado junto a Octavio Ruiz Calatayud y Luis Alcalde Gibaja, compañeros de Ingeniería de Clientes especializados en Cloud, en Telefónica, que se titula “Contenedores: Una solución al desarrollo de microservicios”, donde se analiza el estado del arte referente al mundo de los contenedores, se profundiza en la tecnología de contenedores y se analiza Docker como caso práctico de aplicación.
Definición e innovaciones habilitadoras
Es difícil encontrar una definición concreta para los contenedores, ya que cada fabricante, organismo de estandarización, etc. aportan su propio matiz a la misma. Conjuntando adecuadamente todas las ideas, se puede decir que un contenedor es “la imagen de un sistema de ficheros diseñada para empaquetar una aplicación y ejecutarse en un sistema operativo compartido como un proceso”.
Este concepto no es tan novedoso como cabría pensar en primera instancia. De hecho, la idea de contenedor lleva presente desde finales del siglo pasado, sentando sus primeras bases a finales de los años 90. Además, destacar que la evolución del concepto ha estado muy ligada a la evolución del kernel de Linux, ya que algunas de sus características han sido grandes habilitadores para el avance en el desarrollo de los contenedores. La literatura apunta, sobre todo, a los cgroups (para la gestión y asignación de recursos a un grupo de procesos) y a los namespaces (para el aislamiento y virtualización de dichos recursos), surgiendo conceptos como asignación de recursos aislados que también aparecen en la arquitectura de contenedores.
Arquitectura de contenedores: semejanzas y diferencias con máquinas virtuales
En el siguiente diagrama, se pueden ver las arquitecturas de máquina virtual (con un hipervisor de tipo 2) y de contenedor, de manera que se pueden apreciar las primeras diferencias comparando sus modelos de capas.
Ambas presentan similitudes, como la existencia de aislamiento entre máquinas virtuales/contenedores y la presencia una capa intermedia (llámese hipervisor o demonio/motor de contenedores) que posibilita la ejecución de la máquina virtual/contenedor en el equipo. Sin embargo, la forma de implementar los conceptos anteriores en cada tecnología hace que sean muy distintas.
Concretamente, lo que marca la diferencia entre máquina virtual y contenedor es la forma en la que cada capa de virtualización utiliza los recursos de la máquina. Mientras que el hipervisor abstrae el sistema operativo de la máquina virtual del hardware subyacente, el motor de contenedores abstrae la aplicación del contenedor del sistema operativo subyacente.
Esto conlleva una serie de implicaciones. Así, las máquinas virtuales comparten los recursos hardware y el hipervisor se ocupa de la asignación de dichos recursos a cada máquina, mientras que los contenedores comparten sistema operativo, ejecutándose como un proceso más. Por ello, no es necesario un sistema operativo para cada contenedor, ya que se ejecutan directamente sobre el kernel del sistema operativo subyacente, que se encarga de la asignación de recursos a cada contenedor.
Lo que marca la diferencia entre máquina virtual y contenedor es la forma en la que cada capa de virtualización utiliza los recursos de la máquina
A raíz de esto, surgen el resto de diferencias entre ambas tecnologías. Una de ellas es la complejidad y sobrecarga de memoria en cuanto a capas software a gestionar, mayor en máquinas virtuales que en contenedores por el hecho de contar con un sistema operativo completo, entre otros motivos. También se puede comprobar que los tiempos de inicio, apagado y ejecución son menores en contenedores; lo que, unido a su mejor capacidad de portabilidad, favorece el despliegue ágil de aplicaciones tanto en entornos de desarrollo como de producción.
Sin embargo, no todas las diferencias benefician a los contenedores. El gran problema en su uso radica en la seguridad; ya que, por su condición de proceso ejecutándose en un sistema compartido, los recursos se comparten con el resto de procesos, luego no existe el aislamiento de recursos hardware que proporciona el hipervisor en las máquinas virtuales; que da la seguridad de que, en caso de que se corrompa una máquina virtual, el problema no se extienda al resto de máquinas o al host. En contenedores, en un caso similar o de, simplemente, una programación incorrecta, se podría perder el control del sistema, incluso.
Implicaciones en el paradigma de la virtualización y en el ecosistema de microservicios
Ante las semejanzas y diferencias presentadas, y viendo la evolución de la tecnología y las tendencias actuales, ¿tiene sentido hablar de un cambio de paradigma de la virtualización? A ciencia cierta, no existe una respuesta definitiva. En lo que sí coinciden muchos expertos es que, más que un cambio de paradigma, es una evolución, fomentando la opinión de que ambas tecnologías son complementarias, ya que existen diferentes casos generales donde conviene usar una tecnología frente a la otra.
Por ejemplo, se aprecia que las máquinas virtuales son preferibles en entornos estables, consolidados y con aplicaciones heterogéneas, mientras que los contenedores parecen más factibles en entornos cambiantes, de metodología ágil o donde se ejecutan múltiples instancias de la misma aplicación en un menor espacio. Pero son tendencias, más que afirmaciones; ya que, realmente, el uso de una opción u otra dependerá fuertemente de los requisitos del sistema. De hecho, no es extraño hablar de soluciones híbridas donde aparezcan ambos conceptos, como el uso de contenedores dentro de máquinas virtuales, evitando algunos de los problemas de seguridad implícitos en los contenedores que se comentaron anteriormente.
Los contenedores son una tecnología disruptiva y habilitadora de nuevas formas de desarrollo e implementación de sistemas
En definitiva, se puede decir que los contenedores son una tecnología disruptiva y habilitadora de nuevas formas de desarrollo e implementación de sistemas. Tecnología impulsada, principalmente, por Docker, a la que se han unido gigantes como Windows, IBM, Amazon o Google con sus aportaciones y soluciones. De esta forma, los contenedores han terminado por constituir un ecosistema en el que aparecen múltiples actores; como pueden ser tecnologías de orquestación, sistemas operativos dedicados, integradores, herramientas de monitorización y gestión, entornos cloud, etc. Y la realidad es que este ecosistema de contenedores no es más que una parte de un ecosistema mucho más genérico: el de microservicios, alineándose con el desarrollo ágil, independiente y escalable que demanda esta tendencia.