Ventajas de utilizar contenedores en lugar de máquinas virtuales
Las máquinas virtuales ofrecen la virtualización del hardware así como del SO y crean un duplicado eficiente y aislado de una máquina real. En el caso de los contenedores, sólo se virtualiza el sistema operativo y no el hardware, creando un entorno ligero que alberga la aplicación y los activos dependientes. Los contenedores han seguido ganando popularidad desde 2014 y las máquinas virtuales existen desde hace mucho tiempo, la diferencia entre ambos es conocida por todos. Mientras el mundo sigue comparando los dos, es imperativo recordar que ambos están aquí para servir a diferentes propósitos.
Menor coste
Las máquinas virtuales facilitan la partición de los entornos de ejecución entre los microservicios mediante la virtualización del hardware y de los sistemas operativos. Cuando se ejecuta cada microservicio a través de una VM separada, esto requiere la replicación del sistema operativo también. Esto aumentará los costes de las licencias. Es posible ejecutar varios microservicios en una sola máquina virtual, pero eso anularía la mayor ventaja de dividir una aplicación monolítica en microservicios pequeños y fácilmente ejecutables. El problema de las bibliotecas y los componentes de la aplicación en conflicto seguiría sin resolverse.
Los contenedores ofrecen aislamiento a nivel del sistema operativo. Así, un único sistema operativo puede admitir varios contenedores, cada uno de los cuales se ejecuta en su propio entorno de ejecución independiente. Al ejecutar varios componentes en un único sistema operativo, se reducen los costes de licencias.
Mayor eficiencia
Es sabido que las máquinas virtuales a menudo imponen una gran penalización de rendimiento al utilizar ciclos de procesamiento del servidor que podrían utilizarse para ejecutar aplicaciones en su lugar. Cada máquina virtual ejecuta su propio entorno de ejecución en una copia separada del sistema operativo, agotando los ciclos de procesamiento del servidor que, de otro modo, podría haber utilizado para ejecutar las aplicaciones.
Por otro lado, los contenedores realizan el aislamiento del entorno a nivel del sistema operativo. De este modo, un único sistema operativo puede soportar múltiples contenedores, cada uno de los cuales se ejecuta dentro de su propio entorno separado y aislado. Al ejecutar varios componentes en un único sistema operativo, los contenedores reducen la sobrecarga de los ciclos de procesamiento del servidor, liberando así potencia de procesamiento para otros componentes de la aplicación.
Almacenamiento flexible
Las máquinas virtuales tienen múltiples opciones de almacenamiento. Pueden tener un tipo de almacenamiento local o basado en la red. Sea cual sea la opción elegida, siempre habrá un espacio de disco físico asignado a cada VM que está aislado de la propia VM. Por lo tanto, en todo momento, el sistema operativo, los archivos de programa y los datos de una VM ocupan un espacio de almacenamiento en el disco de almacenamiento dedicado - almacenamiento con estado.
Por el contrario, los contenedores ofrecen la opción de tener estado (stateful) o no (stateless). El espacio de almacenamiento se crea u ocupa cuando se crea el contenedor, y se descarta cuando se elimina el contenedor. Cuando se edita una imagen de contenedor, se crea una capa de sandbox que almacena todos los datos. Esta capa está activa sólo como parte del contenedor. Así, cada servicio de tu aplicación de microservicios puede tener su propio almacenamiento, que puede ser gestionado de forma diferente al almacenamiento de otros servicios, proporcionando más flexibilidad y control.
Mejor aislamiento
Como se ha mencionado anteriormente, los contenedores ofrecen entornos de ejecución independientes a los microservicios, al tiempo que permiten la cohabitación en un único sistema operativo. Las bases de datos, así como los entornos de los microservicios, son completamente independientes, a pesar de estar desplegados en un único sistema operativo. Si tratas de ejecutar varios microservicios en una sola máquina virtual, puede haber entornos superpuestos que pueden acabar atascando el servidor.
Con los contenedores, se puede sacar el máximo partido a un hardware determinado mediante el procesamiento inteligente de las aplicaciones. Por ejemplo, algunos microservicios requieren mucha potencia de procesamiento, mientras que otros pueden generar mucho tráfico de red. Con la asignación inteligente de la carga de trabajo dentro de los contenedores, los desarrolladores de aplicaciones pueden utilizar eficientemente los recursos del servidor, asegurando que la capacidad de la red no quede sin utilizar.
Tamaño reducido
Las máquinas virtuales, como sabemos, ocupan mucho más espacio de almacenamiento que los contenedores. Un contenedor suele ser pequeño, sólo unos 10 MB, mientras que una máquina virtual ocupa al menos unos cuantos GB de espacio de almacenamiento. Al segregar una aplicación compleja utilizando una arquitectura de microservicios, donde cada funcionalidad es un microservicio independiente, el aislamiento requerirá un gran número de máquinas virtuales o contenedores. Las máquinas virtuales requieren mucho espacio, mientras que los contenedores no. El mismo servidor físico puede albergar muchos más contenedores que máquinas virtuales. Por lo tanto, dada la necesidad de garantizar que la aplicación empresarial no sea demasiado voluminosa, la contenerización suele ser la opción preferida.
Ejecución más rápida
Las máquinas virtuales son creadas por un hipervisor que necesita muchas decisiones de configuración al principio: el sistema operativo invitado para ejecutar la aplicación, la cantidad de espacio de almacenamiento necesario, las preferencias de red y muchos otros ajustes. Aunque VMWare ofrece valores predeterminados en su asistente de creación de máquinas virtuales, el proceso sigue siendo bastante complejo y tarda un par de minutos en ejecutarse en una plataforma. Por otro lado, los contenedores se crean más rápidamente que las VM debido a la ausencia de un hipervisor. Las imágenes de los contenedores se almacenan en un repositorio, desde el que puedes acceder a ellas cuando sea necesario mediante unos pocos comandos rápidos. Así, el tiempo de arranque de los contenedores Docker oscila entre unos pocos milisegundos y un par de segundos, lo que los hace mucho más rápidos que las máquinas virtuales.
La ejecución de microservicios en contenedores a escala puede simplificarse aún más utilizando orquestadores de contenedores como Kubernetes y Docker Swarm. Los contenedores Docker pueden lanzarse, retirarse y reemplazarse a escala rápidamente con dichos orquestadores. Para mejorar aún más el trabajo con microservicios y contenedores, se pueden utilizar plataformas de entrega de aplicaciones diseñadas exclusivamente para superar los desafíos de entrega modernos para una empresa. Una plataforma de entrega de aplicaciones puede ayudar a acelerar, estandarizar y sostener el proceso completo de contenerización y posterior entrega a los orquestadores.
En realidad, cada empresa tiene sus propias necesidades, requisitos y sistemas heredados. En la elección entre máquinas virtuales y contenedores, estos últimos son más adecuados para empaquetar microservicios. Por lo tanto, si estás buscando una arquitectura moderna escalable y flexible para sus equipos, los contenedores son tu mejor apuesta para garantizar la entrega continua.