Docker vs Vagrant

Dificultad: Fácil
Tiempo de Lectura: 7 minutos

A primera vista Docker vs Vagrant parecen lo mismo y sirven para algo similar sin embargo la tecnología y el método que utilizan para lograr sus objetivos son bastante diferentes, mientras Docker trabaja con Contenedores.

Vagrant en cambio trabaja con maquinas virtuales, cada uno tiene sus ventajas y desventajas, para ciertos casos ambos pueden servirnos indistintamente aunque en otras ocasiones puede servirnos uno más que el otro dependiendo que queramos hacer.

Por eso hoy primero vamos a ver que es una Maquina Virtual y que es un Contenedor, para luego adentrarnos en el versus Docker versus Vagrant, explorando sus diferencias y similitudes.

¿Que es una Maquina Virtual?

Lo cierto es que las VM no son nada nuevo, desde los años 80 los conocemos bajo el nombre de emuladores y los utilizábamos poder correr juegos de consolas de video un hardware diferente al original o directamente en una PC.

Las máquinas virtuales permiten que incluso hoy día en una PC podamos usar juegos de Atari, NES, SuperNES o una variedad de juegos Arcade, para cada plataforma de consolas de video de seguro a vamos a encontrar un emulador y si encontramos las ROMS que son imágenes de los cartuchos o cassettes de nuestros juegos favoritos de esa época podremos disfrutarlos nuevo aun sin tener la consola original de forma física.

De la misma manera que un emulador nos permite emular una consola, una Maquina Virtual es un software que permite emular el hardware de una computadora para instalar allí un sistema operativo y aplicaciones aislándolo por completo del hardware real de la misma forma que lo hacen los emuladores de video juegos, se puede decir que las Maquinas Virtuales actuales con la evolución natural de los emuladores.

Las Maquinas Virtuales se pueden usar en un servidor o en una computadora de escritorio o una computadora portátil donde ademas del sistema operativo principal podemos tener una o varias Maquinas Virtuales con diferentes sistemas operativos que pueden ofrecer una variedad servicios o aplicaciones que necesitemos.

maquina virtual, diagrama explicativo

La emulación de sistemas operativos completos es un salto tecnológico que demoro mucho tiempo en llegar, por un lado porque es mucho más complejo emular un procesador moderno y todo el hardware asociado que uno de video juegos.

Por otro lado también porque debido al tamaño de un Sistema Operativo moderno y sus requisitos, el uso de VM (actuales) implican un gran consumo de recursos, de memoria, de CPU y de disco que antes no eran posibles.

El costo hardware siempre fue un tema determinante a la hora de comprar un computadora, la cantidad de RAM siempre era escasa y los discos eran lentos por lo que la visualización de un sistema operativo era impensable para el usuario promedio, sin embargo con la actual abundancia de RAM a precios económicos en comparación a una o dos décadas atrás.

Junto con la aparición de los CPU multi-nucleo y los discos SSD hacen que hoy sea posible para cualquier equipo con un hardware promedio ejecutar una maquina virtual de forma fluida, teniendo una buena experiencia en el sistema virtualizado sin afectar tanto el rendimiento al PC anfitrión.

¿Que es un Contenedor?

Un contenedor puede definirse como un paquete cerrado que dentro contiene todo lo necesario para que una aplicación se ejecute, todo está encapsulado dentro de una sola imagen completamente independiente el servidor o computadora que lo ejecuta, en el contenedor se incluyen tanto los binarios como todos los archivos de configuración y demás ficheros que necesite para ejecutar la aplicación.

diagrama de docker

Los contenedores a diferencia de las maquinas virtuales no reservan memoria ni limitan el uso del CPU, las aplicaciones dentro de los contenedores se ejecutan

La idea detrás de un contenedor de esto es que sea ligeros y portables, que se pueda transferir entre diferentes entornos sin contratiempos ya que el funcionamiento interno es completamente independiente del sistema operativo que lo aloja.

Con un contenedor nos aseguramos que la aplicación es completamente portable, como es independiente del hardware y del sistema operativo, transferir la imagen entre dos plataformas no representa ningún problema ya que se va a ejecutar siempre de la misma forma.

¿Cuando necesitaría una VM o un contenedor en mi PC?

Hay muchas situaciones donde puede ser útil tener una VM disponible o un contenedor, por ejemplo cuando necesitamos ejecutar alguna aplicación que no es compatible con el sistema operativo de nuestra computadora o cuando queremos probar algo en un entorno seguro sin correr el riesgo de dañar el sistema operativo de nuestra computadora.

Otro interesante uso para Desarrolladores y DevOps es la posibilidad de crear en nuestras estaciones de trabajo entornos de desarrollo y de pruebas idénticos a los de producción independientemente del sistema operativo que tengamos, por ejemplo podremos virtualizar un Windows Server o un CentOS 7 aunque nuestra computadora sea una Mac.

Donde los desarrolladores usamos VM de forma inadvertida es por ejemplo en Android Studio cuando corremos nuestra aplicación en el emulador de dispositivos Android que el IDE incorpora, en realidad se trata de una VM con una imagen de Android emulada mediante QEMU uno de los tantos software para maquinas virtuales disponibles.

Existen muchos software para crear y correr maquinas virtuales, por ejemplo están Oracle VM Virtualbox, VMware Workstation Player/Pro, VMware Fusion/Fusion Pro, Parallels Desktop, QEMU, KVM entre muchos otros.

Contenedores vs Maquinas Virtuales

Las maquinas virtuales y los contenedores tienen diferencias sustanciales en cuando a velocidad, en el caso de los contenedores la creación y arranque solo toma segundos, ya que solo carga una aplicación, mientras que en el caso de las maquinas virtuales la creación puede llevar incluso mucho más tiempo, desde minutos hasta horas dependiendo de la complejidad, ademas el arranque de una maquina virtual puede llevar cinco minutos o incluso más mientras se inicia el sistema operativo y todos sus servicios.

En el uso de CPU los contenedores son más eficientes ya que solo se ejecuta la aplicación mientras que la maquina virtual ejecuta un sistema operativo completo aparte de la aplicación lo que implica un mayor uso del procesador.

El uso de memoria también es mayor en las maquinas virtuales, sin embargo la ventaja de las maquinas virtuales es que la memoria que le asignemos estará garantizada mientras que en los contenedores se asigna solo la que se necesita, esto tiene la ventaja que permitirá que un servidor ejecutar más contenedores que maquinas virtuales sin embargo es posible que cuando un contenedor necesite más memoria resulte que ya no quede RAM disponible.

Un análisis más profundo sobre estos dos tópicos puede encontrase en el artículo: Docker vs Máquinas Virtuales

Docker

Uno de las herramientas más populares para trabajar con contenedores es Docker, un sistema que nos permite construir, transferir, desplegar y ejecutar los contenedores con nuestras aplicaciones y lo hace de una manera muy sencilla, esto garantiza un despliegue escalable de una forma eficiente sin importar el sistema operativo principal de la computadora o del servidor.

Con Docker podemos tener un alto grado de confianza en cuanto a compatibilidad entre los diferentes sistemas porque todo lo que necesita nuestra aplicación junto las librerías y demás dependencias se encuentran empaquetadas dentro de un mismo contenedor, lo que nos da la certeza que el contenedor se ejecutara de la misma forma en cualquier lugar, esto tiene enormes ventajas a la hora de despliegues, escalabilidad, aislamiento y seguridad de sistemas.

Podemos descargar y ejecutar las imágenes desde un repositorio central que Docker nos ofrece, importar desde otro lugar o incluso tomar una imagen y hacer las modificaciones necesarias para adaptarlas a nuestro propósito.

Con Docker podemos generar un archivo llamado Dockerfile y allí indicar a partir de que imagen queremos crear nuestro contenedor, luego mediante una serie de comandos en el fichero podemos establecer que paquetes instalar, de donde, que archivos copiar y modificar, si trabajamos en equipo en lugar de pasar una imagen de cientos de megas e incluso gigas, podemos enviar el archivo Dockerfile de unos pocos Kb y nuestra contra parte generar el contenedor a partir de él.

Si bien Docker esta pensado para empaquetar aplicaciones aisladas también es posible ejecutar un sistema operativo completo tal como si se tratara de una maquina virtual, sin embargo no tenemos el mismo aislamiento de hardware que en una VM, ademas no podemos reservar o limitar recursos tal como lo hacemos en una VM.

Otro tema no menos importante que cabe señalar es que Docker solo permite gestionar contenedores que basados en Linux, si bien es posible instalarlo teniendo Windows o Unix en cuando a los contenedores mismos solo podremos usar Linux en ellos.

Vagrant

Es una herramienta gratuita para la crear entornos de desarrollo basado en Maquinas Virtuales desde linea de comandos, con una sintaxis similar a Docker y permite generar un archivo llamado Vagrantfile (muy similar a Dockerfile) y donde a partir de este archivo se genera la maquina virtual con todo lo que necesitemos incluido los paquetes y ficheros que necesitemos incluir.

Permite construir maquinas virtuales para varios hipervisores, soporta creación de maquinas con VirtualBox, Hyper-V e incluso contenedores Docker aunque ademas puede generar maquinas para WMware y permite crear plugins personalizados para crear maquinas para AWS u otros proveedores por ejemplo que necesitemos.

En este caso al ser una VM debemos definir cuanta memoria RAM queremos asignar, cuanto espacio en disco, cantidad de procesadores queremos usar, podemos limitar el porcentaje de CPU que usara la VM, ademas tendremos acceso al hardware como puertos USB y puertos seriales, interfaces de red fisicas y crear dispositivos de hardware virtuales, ademas podremos visualizar sistemas operativos con interfaces gráfica.

Comparativa Docker vs Vagrant

Veamos ahora una tabla comparativa entre estas dos tecnologías:

DockerVagrant
MultiplataformaSiSi
Sistemas Operativos que permite virtualizarLinuxLinux, Unix y Windows
Reserva y Garantiza Recursos a nivel de HardwareNoSi
Tiempo de creacionUnos pocos segundosVarios minutos
Tiempo de arranqueMilesimas de segundo o unos pocos segundosVarios minutos
AislamientoParcialTotal

Conclusión

Como hemos visto tienen usos parecidos aunque la tecnología que hay detrás de cada uno es bastante diferente y funcionan de manera diferente, los contenedores de Docker son mas livianos.

Sin embargo las maquinas virtuales que nos ofrece Vagrant nos ofrecen mas opciones de gestión y acceso al hardware que los contenedores no, la elección del cual es mejor dependerá del uso que le queramos dar. aunque no son excluyentes y pueden trabajar muy bien juntos y complementarse.

 


¿Te resultó útil el artículo? Compártelo con tus colegas: