¿Máquina Virtual o Docker?

¿Máquina Virtual o Docker?

[:es]

Introducción

Ha transcurrido ya un buen tiempo, desde que empezamos a experimentar el desarrollo con Docker en nuestros proyectos, ya sea como plataforma de desarrollo o en la automatización de procesos.  Poco a poco, hemos ido comprendiendo la diferencia entre virtualización y “contenerización”, un ejemplo claro que aplica, es cuando intentamos levantar un ambiente de desarrollo con múltiples dependencias en un nuestras estaciones de trabajo, mientras que la virtualización conlleva a crear múltiples instancias (de acuerdo a necesidades), éstas generalmente exigen una cantidad importante de recursos que se traducen finalmente en un detrimento considerable en la experiencia del usuario y el desempeño de la máquina. Por su parte, la “contenerización” (docker) busca optimizar bastante bien los recursos limitados de nuestras máquinas, permitiendo que virtualmente se transformen en pequeños data center (guardando las proporciones) y se compartan recursos comunes entre servicios independientes (contenedores).

Pero ¿qué es Docker y en qué se diferencia de la virtualización?

Existen diferencias importantes: Una máquina virtual hace uso de un hypervisor para acceder al hardware físico del huésped, con el objeto de ejecutarse como si fuese una máquina física independiente; los recursos utilizados están previamente definidos en su configuración y son utilizados en su totalidad durante su ejecución, es decir, si se configuro la máquina con 4GB de RAM, ésta reservará la totalidad de memoria de la máquina huésped para su ejecución. Como consecuencia de ello, y una vea esté definida la configuración de la máquina virtual, solo queda administrar de buena manera las aplicaciones que se ejecutan dentro de ellas, y que éstas saquen el mejor provecho de los recursos asignados; si una aplicación toma menos recursos, éstos estarán disponibles en la máquina virtual pero no para la máquina huésped.

Hasta este punto, podemos deducir que las máquinas virtuales están mas orientadas a plataforma que hacia aplicación en si.

Docker por su parte, usa una forma muy diferente de interactuar con la maquina huésped.  Al igual que el software de virtualización posee una especie de hypervisor, que sirve de interfaz con el hardware subyacente, pero trabaja de forma muy distinta; lo que hace Docker es generar un wrapper, sobre el cual se ejecuta un único proceso, de ahí viene el nombre de contenedor, ya que éste “contiene” un micro ambiente de ejecución para una aplicación. Éste ambiente de ejecución, provee acceso a librerías de Sistema Operativo, a filesystem, a archivos de configuración y variables de ambiente. Cada contenedor se ejecuta sobre alguna distribución de SO Linux o Windows (ahora último), esta distribución es llamada imagen, y contiene toda la configuración necesaria para que una aplicación se ejecute tal como si la aplicación estuviera corriendo sobre una maquina virtual.

Contenedor

Un contenedor es una especie de wrapper que aísla el proceso a ejecutar de la máquina huésped. Este contenedor, encapsula una imagen de sistema operativo, posee acceso a filesystem y a recursos de hardware de la máquina huésped como si se tratara de un recurso independiente, pero que en ningún caso tiene acceso o conocimiento directo sobre el huésped.

La ventaja del contenedor es que éste solo ocupa los recursos que necesita la aplicación para ejecutarse, y a pesar de estar corriendo sobre una imagen del Sistema Operativo, no inicia otros procesos ajenos a la aplicación.

Docker provee acceso a la aplicación en ejecución, a las liberarías que éste pudiera necesitar, a montar ciertos volúmenes para realizar actividades de lectura y escritura (R/W) e incluso montar volúmenes desde el huésped para persistencia de datos.  En pocas palabras, Docker provee un ambiente de sistema operativo de solo lectura, para ejecutar un solo proceso que sin cargar nada mas que lo necesario, utiliza los recursos de Hardware que necesita dicho proceso.

¿No queda clara la diferencia?

Bueno, hasta acá probablemente sea un poco confuso, pero planteémonos el siguiente caso: Existe un programa que su ejecución toma hipotéticamente el 10% de CPU y 250M de Memoria. Por un lado, tenemos una máquina virtual con Linux Ubuntu con 4GB de Memoria y le dimos el 50% de nuestra CPU para su ejecución.  Si ejecutamos este programa sobre esta máquina virtual el proceso tomará el 10% de la CPU y 250MB de la memoria asignada para esta, pero para la maquina huésped no habrá ninguna diferencia por que ya hay 4GB y el 50% de la CPU reservado para esta maquina virtual.

Ahora bien, si ejecutamos a través de Docker, este proceso tomará 250MB del total de la memoria de la maquina huésped (quizá un poco mas por alguna que otra librería que necesite cargar para su ejecución) y el 10% de la memoria del huésped (también un poco más sumando la memoria que necesita Docker para correr).

Otras Diferencias

Como lema, Docker propone “Build, Ship and Run”, Construir, exportar ejecutar. Esto es sin duda, una de las ventajas mas considerables, ya que la habilidad de desarrollar una aplicación que se pueda exportar con todo su ambiente configurado e independiente, ahorra un montón de dolores de cabeza, sobre todo en ambientes donde conviven muchas aplicaciones, y cada una de ellas no debe afectar a las demás.

El lector seguramente podría pensar… Pero esto también se puede hacer con una maquina virtual!. Si, efectivamente se puede hacer, pero acá llegamos a otra ventaja importante, ya que el transporte de una máquina virtual es más complicado debido a su gran tamaño; Se necesita bastante tiempo y espacio para copiar una máquina en otro ambiente.  Docker, simplifica esto a nivel de archivo, es decir a partir de un archivo la máquina se construye bajando las imágenes de Sistema Operativo desde repositorios (Docker HUB) en Internet, por lo que solo basta este archivo plano para generar todo el ambiente.

Conclusión

Podemos concluir que la diferencia entre la tecnología de contenedores y la de virtualización es que la primera esta orientada a aplicación, mientras la segunda hacia la plataforma y por tanto, se puede ejecutar Docker container dentro de una maquina virtual perfectamente.

Docker provee un wrapper para hacer creer a la aplicación está sobre un ambiente específico, donde provee sistema operativo, recursos de Hardware y acceso a librerías. En cambio, la virtualización provee una ambiente completo, no solo de aplicación, sino también de los servicios que el sistema operativo tiene montados como entidades independientes.

Al momento de elegir, es importante considerar que ambas tecnologías tienen enfoques distintos, pero que también pueden ser complementarias, y que muchas veces las combinación de las dos es adecuada para los escenarios complejos a los que nos enfrentamos día a día.[:]