Cuando se habla de despliegue de aplicaciones en la nube (cloud computing) hay 3 conceptos que tipicamente se llegan a escuchar muy frecuentemente, estos son Servidores, Maquinas Virtuales y Contenedores. Así que para aquellos que siempre han tenido problemas entendiendo estos conceptos, en este artículo veremos de que se trata cada uno, para que sirven, y porque existen en primer lugar, a modo de tener un poco mas de informacion.
Pero antes primero veamos como empezo todo esto.
Antes de las VMs y Containers
La forma tradicional en la que muchas empresas mantenian inicialmente funcionando aplicaciones de internet, era ejecuntadolas en servidores, Y cada servidor tenia ejecutando una sola aplicacion. Por ejemplo cada servidor podria ejecutar una base de datos, otra un servidor ejecutaria una aplicacion web, y otra servidor podria ser de correos.
Esto era debido a que hace mucho tiempo los sistemas operativos no tenian la suficienta capacidad para ejecutar multiples aplicaciones de forma segura en un solo servidor. Asi que para cada nuevo servicio o aplicacion que la empresa necesitaba crear, se necesita adquirir un nuevo Servidor, lo que significaba invertir más dinero en adquirirlos.
Y por si fuera poco, muchas de las aplicaciones ni siquiera usaban toda la capacidad del servidor, por lo que tambien se desperdiciaba dinero, al no usarse todo el potencial que ofrecia cada maquina.
Asi que para resolver este tipo de problemas, se desarrollaron las maquinas virtuales (Virtual Machines o abreviado VMs). Ya que estas permiten ejecutar multiples aplicaciones en un mismo servidor, a traves de simular Hardware y Software.
Por ejemplo si una empresa tiene 3 aplicaciones ejecutandose cada una en su propio servidor, estas tambien pueden ser ejecutadas en un solo servidor, simulando cada hardware de servidor, y sus aplicaciones en una maquina vitual.
Cada una puede ejecutar su propio sistema operativo, con sus propias aplicaciones como aplicaciones de correo, aplicaciones web, bases de datos, y demás, todas ejecutandose en un solo servidor.
Arquitectura de las maquinas virtuales
Ahora, como ves en el siguiente grafico:
Para poder usar maquinas virtuales, primero empezamos con tener un Hardware, es decir el servidor, luego encima del hardwawre hay software, en este caso se llama el Hypervisor. Hypervisor es lo que permite a una sola maquina, ejecutar multiples maquinas virtuales. es el software encargado de controlar y compartir los recursos del hardware (como CPU, RAM, o Espacio en disco).
Hay 2 tipos de Hypervisor:
- Tipo 1, el cual se instala directamente en el servidor fisico, esto tambien son llamado Bare Metal Hypervisors (BM), y es el hypervisor más usado al ser el más seguro, y el que ofrece menor latencia. Algunos ejemplos de este Hypervisor son:
- Tipo 2, estos se caracterizan por que entre el servidor y el Hypervisor hay un sistema operativo Host, lo que hace que tambien se llame a este tipo de Hypervisor Hosted, estos son menos frecuentes, tienen una latencia más alta y son más usados por usuarios finales. entre algunos de estos podemos encontrar a:
- Oracle VirtualBox
- VMWare Workstation
- Citrix XenServer
Asi que una vez tengamos el Hypervisor instalado lo siguiente es crear las maquinas virtules, en donde cada una de estas pueden tener su propio sistema operativo (como pueden ser Windows, Linux o Unix). Y encima de estas aplicaciones estan las aplicaciones que a su vez las maquinas vituales van a ejecutar.
Así que las maquinas virtuales resuelven el problema principal de la necesidad de adquirir nuevo hardware, pero estas tambien tienen algunas desventajas, como que:
- las maquinas vituales consumen mucho recursos de Harware, como espacio en disco, mucha RAM y CPU. Todo esto debido a que cada maquina virtual tiene su propio sistema operativo dedicado y este necesita emular todos sus procesos.
- Arranque Lento, como cada maquina virtual necesita arrancar un sistema operativo completo
- Cada sistema requiere una licencia para cada sistema operativo, lo que significa que cuesta más dinero si se usa sistemas privativos
Asi que la siguiente solucion a todos estos problemas han sido los contenedores.
Contenedores
Los contenedores de forma similar a las maquinas virtuales, permiten ejecutar multiples aplicaciones en mismo computador, pero mientas que las maquinas virtuales simulan maquinas enteras con sistema operativo y todos sus procesos. Un contenedor solo contiene una aplicación.
Esto es porque un Contenedor no es más que una aplicacion que ha sido empaquetada con todos sus archivos, configuraciones, y dependencias necesarias para que la aplicacion funcione. Lo que quiere decir que es un paquete de software que ya viene con todo lo que necesita para ejecutarse en cualquier computador, sin la necesidad de tener que instalar nada más en tal computador.
Por ejemplo si un desarrollador crea una aplicacion web, y quiere hacer que esta pueda funcionar en cual servidor (acción que tambien recibe el nombre de desplegar aplicación), lo que puede hacer es crear un contenedor para esa aplicación web, y agrupar alli todo lo necesario para que funcione, como podria ser el código de HTML, bibliotecas, imagenes, y código de backend escrito en algun lenguaje de programación (Java, Python, Go, Javascript).
Luego este contenedor podra ser usado en cualquier computador ya sea un servidor u otro computador de otro desarollador por ejemplo, sin la necesidad que este otro instale nada, ya que la aplicacion viene con todo lo que necesita para funcionar.
Entre algunas opciones de software de contenedores tenemos a:
- LXC
- Rocket (RKT)
- containerd
- Windows Server containers, e incluso el propio Windows tiene su propia plataforma de containerizacion.
Pero el Software más popular para crear, administrar y ejecutar contenedores es Docker, el cual puede funcionar en sistemas operativos como Windows, Linux y Mac.
Arquitectura de Contenedores
Ahora, al igual que las maquinas virtuales, los contenedores para poder ser creados, empiezan con el Hardware que seria el servidor, y encima de este esta el sistema operativo, como podria ser Linux.
Luego, en lugar de usar un Hypervisor, se utiliza un software llamado Container Engine o Motor de containerizacion, el cual sirve para poder desempaquetar los archivos de un contendor, y poder ejecutarlos usando el kernel del sistema operativo.
De hecho aqui esta la diferencia más grande, porque mientras que las maquinas virtuales ejecutan en cada maquina virtual un sistema operativo entero, que requiere de muchos recursos de hardware y lo que los hace lento de arrancar, los contenedores no, ya que estos solo usan el sistema operativo Host, y permiten ejecutar multiples aplicaciones, los que solo estan conformadas en su mayoria por archivos, lo que los hacen más ligero, tanto en consumo de espacio de almacenamiento, ademas de consumir muy poca RAM, y CPU.
lo que a su vez los hace muy rapidos para poder arrancar una aplicacion, por ejemplo las maquinas virtuales pueden tomar minutos para arrancar mientras que los contenedores pueden tomar solo milisegundos.
Y mientras que tanto las VMs y los contenedores son portatiles, es decir que puedes mover tu aplicacion de una maquina a otra, los contendores al no necesitar de mucho software adicional, son más ligeros los que los hace mucho más portatiles aun en comparacion.
Desvengajas de los contenedores
Aunque los contenedores por supuesto tambien tienen algunas desventajas en comparacion a las VMs. Por mencionar algunas de estas:
- Los contenedores deben ser empaquetados para trabajar con el mismo sistema operativo en el servidor. Asi que si el servidor que ejecutará los contenedores es Linux, los archivos de los contenedores deben estar basados en Linux, o si el servidor sera Windows, los contenedores tienen que estar basados en Windows. Asunto que en las maquinas virtuales no es un problema porque estas pueden ejecutar multiples sistemas operativos en un mismo servidor.
- Todos los contenedores dependen de un solo sistema operativo. Esto quiere decir que si el sistema operativo del servidor de contenedores llega a fallar, todos los contenedores al depender de este caerán con el.
Conclusión
En fin como puedes ver ambas tecnologías resuelven el mismo problema de dos formas distintas, pero de hecho debido a esto algunas organizaciones usan las dos en conjunto en una misma maquina. En donde pueden tener un servidor ejecutando maquina virtuales y dentro de cada maquina virtual ejecutan contenedores, teniendo las ventajas de ambos. Debido a esto software como Kubernetes u OpenShift, permiten administrar ambas dependiendo del caso de uso.
Finalmente dejo una tabla de comparación:
Virtual Machines | Containers |
---|---|
Aislamiento de procesos a nivel de Hardware | Aislamiento de procesos a nivel de sistema operativo |
VMs aislan completamente los procesos del sistema opertivo Host | Los contenedores comparten recursos con el sistema operativo Host |
Cada maquina virtual tiene un Sistema operativo separado | cada contenedor comparte recursos con el sistema opertivo host |
Arranca en Minutos | Arranca en milisegundos |
Consume muchos recursos | Consume pocos recursos |
Las maquinas virtuales Pre configuradas son dificiles de encontrar | Los contenedores de Docker preconstruidos ya estan disponibles |
Las maquinas virtuales Pre configuradas son dificiles de editar | Crear configuraciones personalizadas de contenedores es fácil |
VMs son faciles de mover a un nuevo Host | Los contenedores son destruidos y recreados en un nuevo Host en lugar de movidos |