Noticias

Docker vs Vagrant en la gestión de entornos de desarrollo

En los equipos modernos de desarrollo, es cada vez más necesario trabajar simultáneamente con distintas tecnologías. Trabajar en cada proyecto implica que el programador debe ser capaz de prepara su equipo de desarrollo de manera que pueda desplegar estos proyectos independientemente de los requisitos y dependencias de cada uno.

Para poder dar solución a algunos de estos problemas hace tiempo contamos con los sistemas de virtualización, en este artículo vamos a ver en concreto dos soluciones, que nos ayudarán a afrontar estas problemáticas de una manera adecuada.

Las ventajas de un entorno virtualizado para el desarrollo de software son muchas, entre ellas:

  • Separación del entorno de desarrollo de la configuración de la máquina anfitrión.

  • Rápida puesta en marcha de entornos con diferentes configuraciones y aplicaciones de manera rápida y segura.

  • La aplicación en desarrollo incorpora información sobre el “ecosistema” en que se ejecuta.

  • Sería posible desarrollar con garantías en un escenario con diferentes desarrolladores con diferentes sistemas operativos.

  • Facilita testear el test de nuevas versiones de librerías o tecnologías nuevas sin comprometer la máquina anfitrión.

  • Facilita trabajar con proyectos con distintas dependencias.

  • Reduce o puede eliminar las inconsistencias entre máquinas de desarrollo y producción.

El objetivo final al utilizar un sistema de virtualizado para el desarrollo de software es obtener un sistema operativo en funcionamiento, con las aplicaciones y librerías necesarias según las preferencias deseadas por ejemplo según los requerimientos de una aplicación o como copia de un entorno de producción.

De todas las opciones disponibles vamos a ver un poco más de cerca Vagrant y Docker:


Vagrant

Se trataría de un gestor de máquinas virtuales. Sería capaz de conectarse a varios gestores de máquina virtuales y a través de un fichero de configuración indicarles los requisitos de la máquina a desplegar, sea virtual o física.

Para ello necesita de dos herramientas auxiliares:

  • Proveedor (provider): el proveedor sería la aplicación o sistema que va a albergar el entorno que vamos a generar. entre otros: VirtualBox, VMware y también Docker.

  • Aprovisionador (provisioner): el aprovisionador sería el encargado de entenderse con el provider ejecutando una serie de instrucciones que le proporcionamos a través de un fichero de configuración, nos permitiría poner a punto un sistema en las condiciones adecuadas a nuestras necesidades. Algunos de los soportados son Ansible, Puppet y Chef.

Situándose en un nivel de abstracción superior, vagrant es capaz de controlar los gestores de máquinas virtuales de forma transparente para el usuario reduciendo la complejidad de utilizar estas herramientas por separado.

La gestión con máquinas virtuales tradicionales que utilizaremos junto con vagrant, tienen un aislamiento total, en ellas podemos gestionar todos los aspectos del sistema como si de un sistema real se tratara entre ellos el tamaño de disco, dirección ip, procesadores a utilizar, ram, etc.

Debido a que con este sistema partimos de unos requisitos bien definidos desde un inicio (tamaño disco, ram, etc), cada máquina que tengamos en marcha de forma simultánea va a comprometer los recursos asignados independientemente de su utilización desde un inicio.

Vagrant funciona bajo linux, windows y mac. Y puede ejecutar diferentes sistemas operativos.

 

Docker
Docker no pretente emular un sistema operativo completo, sólo pone en marcha los recursos y librerías necesarios para que una aplicación se ejecute (entorno virtual), aprovechando recursos de la máquina anfitrión enfocados para la ejecución de una o varias aplicaciones.

Para ello utiliza 2 componentes:

  • Contenedores linux (linux containers): permite la virtualización a nivel de sistema operativo con su propio espacio de procesos y de red.

  • AuFS; sistema de ficheros en capas. Con ayuda de AuFS docker puede combinar partes del sistema anfitrión y de la virtualización.

Con docker también disponemos de un fichero de configuración, sobre el cual indicar que librerías o programas necesita nuestra aplicación para ser ejecutada. Docker funciona bajo linux windows y mac, pero sólo puede ejecutar aplicaciones basadas en linux.

 

Diferencias

Mientras que vagrant es un gestor de software que pueden conectar con providers (docker entre ellos) y provisioners para levantar un sistema operativo con las características deseadas, docker se reduce a crear entornos virtuales basados en linux.

¿Por qué utilizar docker de forma separada, en lugar de utilizarlo como provider de vagran?, podrías hacerlo perfectamente, y si utilizas vagrant para manejar diferentes providers sería la mejor opción, para eso precisamente construyeron vagrant, sin embargo si vas a trabajar con docker de forma exclusiva, deberías valorar el trabajar directamente con el, sin agregar una capa intermedia en este caso vagrant.

Por la naturaleza de cada solución, la basada en virtualización estándar va a comprometer más recursos que la basada en contenedores con menos capas de separación que interfieran en los procesos, a su vez una virtualización estándar está completamente aislada de la máquina anfitrión y puede ejecutar aplicaciones de todo tipo no sólo basadas en linux como docker.

Las operaciones de arranque de contenedores docker son del orden de segundos en lugar de minutos, ya que docker utiliza los recursos activos del sistema anfitrión, aparte permite disponer de múltiples instancias activas de una manera muy eficiente, pues sólo consumen los recursos precisos a las aplicaciones que ejecutan, esto contrasta con la virtualización tradicional, donde se asignan estos recursos desde un inicio.

La comunicación con las instancias docker aunque más eficiente si es más engorrosa al contratio que en las virtualizaciones tradicionales levantan una instancia como si un equipo real se tratara.

Conclusiones

Utilizar un sistema como los descritos, permite "paquetizar" el entorno de ejecución de una aplicación, como un componente más del ciclo de desarrollo. Esto aporta múltiples ventajas que se han descrito al inicio del artículo. Utilizar uno de estos sistemas nos dá gran flexibilidad para trabajar en diferentes proyectos o probar tecnologías nuevas de una forma ágil y flexible. 

No es necesario tampoco decantarse por utilizar un sólo producto, Docker y Vagrant son productos distintos que pueden convivir perfectamente. Si el desarrollo se va a llevar a cabo en máquinas linux y el rendimiento es clave, valora docker como primera opción. Si necesitas de una virtualización completa o utilizar diferentes sistemas operativos, acceso fácil y sencillo a las virtualizaciones con gui e ip, vagrant con un provider tradicional debería ser tu referencia.

Más información

Enlace a la documentación de vagrant: https://docs.vagrantup.com/v2/

Página principal de docker: https://docs.docker.com

Discusión interesante en stackoverflow acerca de estas herramientas: http://stackoverflow.com/questions/16647069/should-i-use-vagrant-or-docker-io-for-creating-an-isolated-environment

Put your development environment in docker. http://play.thinkcube.com/development-environment-on-docker



 


docker virtualización


Compartir mola!!