Vagrant vs Docker: ¿Cuál es el adecuado para ti? (Podrían ser ambos)
Publicado: 2023-01-26Los equipos de DevOps están bajo una presión cada vez mayor para ofrecer una mayor funcionalidad a los clientes rápidamente. Los proveedores de la nube ofrecen una solución a través de plataformas escalables con excelentes integraciones de CLI y API. Desafortunadamente, las interfaces expuestas por los proveedores de la nube pueden ser incompatibles. Pero algunas herramientas nativas de la nube ayudan a los equipos de DevOps a crear soluciones personalizadas para cualquier proveedor de la nube.
Dos de estas herramientas son Vagrant y Docker. Comprender lo que hacen y cómo funcionan juntos es clave para aprovechar al máximo su entorno de nube.
Vagrant es una herramienta para crear y administrar entornos de máquinas virtuales (VM) en un solo flujo de trabajo. Ya sea que esté creando máquinas virtuales locales para ejecutarlas con hipervisores o solo máquinas virtuales en la nube, Vagrant proporciona un formato de configuración uniforme, una CLI única y aprovisionadores compartidos para instalar software y modificar configuraciones.
Docker brinda la capacidad de empaquetar software y configuración de soporte en imágenes que se ejecutan de manera consistente en múltiples plataformas. Docker permite que los equipos de DevOps tengan la confianza de que el software se ejecutará en una estación de trabajo local de la misma manera que se ejecuta en una plataforma de nube administrada.
Aunque Vagrant y Docker comparten el objetivo de crear entornos repetibles, lo hacen de formas diferentes pero complementarias. Este artículo explora cómo Vagrant y Docker logran sus objetivos.
¿Qué es Docker?
Docker es una plataforma abierta para desarrollar, enviar y ejecutar aplicaciones. Permite a los equipos de DevOps empaquetar software personalizado, aplicaciones de soporte y bibliotecas, así como instrucciones para la configuración, conexión en red, montaje de archivos, controles de estado y secuencias de comandos de lanzamiento en un artefacto autónomo llamado imagen.
Luego, las imágenes se ejecutan en un entorno aislado y liviano llamado contenedor. A diferencia de las máquinas virtuales, que normalmente reservan cantidades fijas de memoria y limitan estrictamente el uso de la CPU, los contenedores son mucho más elásticos y consumen solo la memoria y la CPU que necesitan.
Esto permite que muchos contenedores funcionen uno al lado del otro de manera eficiente, lo que reduce los costos y aumenta la escala. Sin embargo, los contenedores no se consideran tan seguros como las máquinas virtuales, lo que significa que los contenedores no son una solución ideal para ejecutar código que no es de confianza.
¿Por qué usar Docker (vs Vagrant)?
Los equipos de DevOps suelen utilizar Docker para entregar y ejecutar aplicaciones web, incluidas las aplicaciones nativas de la nube que se integran con las colas de mensajes o se alojan en plataformas de función como servicio (FaaS) que responden a activadores y eventos basados en la nube.
Las plataformas como Kubernetes se basan en Docker, lo que permite organizar los contenedores a escala. Además, todos los proveedores de la nube admiten la capacidad de ejecutar contenedores Docker en sus ofertas de plataforma como servicio (PaaS). Ahora es raro encontrar un PaaS que no sea compatible con Docker.
Docker también puede distribuir y ejecutar herramientas basadas en CLI, con todas las herramientas nativas de la nube populares que ofrecen imágenes de Docker incrustadas en su CLI.
¿Cuáles son los beneficios de Docker?
Docker resuelve un problema común al que se enfrentan los procesos tradicionales de implementación de software, donde las aplicaciones personalizadas pueden mostrar resultados diferentes cuando se ejecutan en la estación de trabajo local de un desarrollador y en un entorno de producción. Estas diferencias a menudo son el resultado de que los desarrolladores ejecutan diferentes versiones de lenguajes de programación, tienen diferentes configuraciones para admitir aplicaciones como servidores web o ejecutan sistemas operativos completamente diferentes al entorno de producción. Estas diferencias conducen a problemas de soporte que van y vienen entre los equipos con comentarios como "Funciona en mi máquina".
Como las imágenes de Docker incluyen el código para las aplicaciones personalizadas, todas las aplicaciones compatibles y las bibliotecas, las imágenes se ejecutan en contenedores que brindan resultados más consistentes, independientemente de dónde se ejecuten.
Las imágenes de Docker son fáciles de distribuir mediante registros como Docker Hub, lo que permite que los equipos de DevOps compartan imágenes entre ellos rápidamente e implementen las imágenes utilizando las diversas plataformas de alojamiento. Por ejemplo, encontrará Docker detrás de la suite de desarrollo DevKinsta WordPress de Kinsta.
Cuando se requieren pilas de aplicaciones más complejas, como implementar una base de datos junto con una aplicación de back-end o una colección de microservicios relacionados, Docker Compose brinda la capacidad de crear y vincular múltiples contenedores Docker con un solo comando. Todos los contenedores, las configuraciones asociadas y las configuraciones de red se definen en un único archivo YAML. Docker Compose luego lee este archivo para crear y administrar varios contenedores como una sola unidad.
Docker también disfruta de un soporte casi universal entre los principales proveedores de la nube, lo que significa que los equipos de DevOps tienen muchas opciones cuando ejecutan sus imágenes de Docker en la nube.
¿Qué es vagabundo?
Durante décadas, las máquinas virtuales han demostrado ser una solución confiable y segura para particionar y aprovisionar recursos informáticos. Las máquinas virtuales siguen siendo los servicios más populares expuestos por los proveedores de la nube y muchas soluciones comerciales y de código abierto para equipos buscan ejecutar máquinas virtuales en las instalaciones.
Sin embargo, esta variedad plantea un desafío para los equipos de DevOps. Cada solución expone una CLI y una API diferentes para crear y administrar máquinas virtuales, lo que dificulta mantener la coherencia entre los entornos de desarrollo locales y las plataformas basadas en la nube.
Vagrant ofrece una solución al abstraer las diferencias subyacentes entre las plataformas de VM, lo que permite a los equipos de DevOps aprovisionar nuevas VM con una sola CLI y una sintaxis de configuración consistente. Los equipos que adoptan Vagrant pueden crear máquinas virtuales consistentes, independientemente de si se ejecutarán en las instalaciones o en un entorno de nube, y pueden cambiar fácilmente entre entornos. Vagrant tiene una multitud de usos diferentes, incluso como reemplazo de MAMP (macOS, Apache, MySQL/MariaDB y PHP, Perl o Python).
¿Por qué usar Vagrant (frente a Docker)?
Es posible iniciar una VM y configurar manualmente el sistema operativo instalando manualmente el software y editando los archivos de configuración. Esto no es ideal, ya que el proceso no es repetible, lo que significa que las máquinas virtuales deben recrearse manualmente para diferentes sistemas operativos y proveedores. También hace que sea casi imposible entender cómo se configuró una máquina virtual en una fecha posterior.
Una mejor práctica es automatizar el proceso requerido para configurar una máquina virtual. Vagrant proporciona una herramienta única para automatizar el proceso de construcción de máquinas virtuales para muchos proveedores. Vagrant también ofrece una gran selección de máquinas virtuales de alta calidad en Vagrant Cloud que los equipos de DevOps pueden usar para comenzar sus propias máquinas virtuales.
¿Cuáles son los beneficios de Vagrant?
Los equipos de DevOps que utilizan Vagrant tienen una única herramienta para aprender, independientemente de si están creando máquinas virtuales para plataformas locales, plataformas en la nube o ambas. Puede modificar fácilmente los archivos de configuración de Vagrant y volver a ejecutarlos o revisarlos en una fecha posterior para comprender cómo se construyó una máquina virtual.
Vagrant también permite que los equipos de DevOps migren a la nube o entre proveedores sin rediseñar el proceso que usan para construir máquinas virtuales.
Las máquinas virtuales creadas por Vagrant brindan un alto nivel de aislamiento, a menudo aprovechando el soporte de virtualización especializado integrado en las CPU modernas. Esto hace que las máquinas virtuales y las herramientas que las crean, como Vagrant, sean la mejor opción donde la seguridad y el aislamiento son una alta prioridad.
Muchas distribuciones de Linux, como Ubuntu y Fedora, también proporcionan cajas oficiales de Vagrant en las que pueden construir los equipos de DevOps. Esto reduce el tiempo que se tarda en crear máquinas virtuales personalizadas.
Vagrant vs Docker: una mirada más cercana
Tanto Vagrant como Docker hacen que los equipos de DevOps sean más eficientes al automatizar la creación, distribución y ejecución de aplicaciones de software.
Docker logra este objetivo con un formato de empaquetado personalizado en forma de imágenes y un entorno de ejecución ligero a través de contenedores. Los contenedores se ejecutan de manera consistente entre plataformas, lo que brinda a los equipos de DevOps una mayor confianza en que su software funciona como se espera. Docker es compatible con las plataformas en la nube PaaS y FaaS, lo que permite a los equipos de DevOps elegir la mejor plataforma para sus necesidades.
Muchos contenedores pueden coexistir en un solo host, principalmente, pero no completamente, aislados entre sí mientras comparten el mismo grupo de recursos. Esto permite que los contenedores se escalen de manera eficiente.
Vagrant logra este objetivo al proporcionar un método consistente para construir máquinas virtuales con proveedores existentes. Es una opción ideal para los equipos que ya han invertido en máquinas virtuales y confían en su alto nivel de aislamiento, seguridad, control y personalización.
Docker también proporciona la mejor solución cuando se ejecuta código confiable y se minimizan los costos informáticos. Los contenedores están razonablemente aislados unos de otros, pero incurren en muy pocos gastos generales. Eso significa que muchos contenedores pueden ejecutarse simultáneamente en un sistema operativo compartido. Las máquinas virtuales brindan la mejor solución cuando los equipos necesitan altos niveles de aislamiento y seguridad o requieren la capacidad de ejecutar muchos sistemas operativos diferentes en paralelo, con Vagrant brindando una solución conveniente para construir máquinas virtuales de manera automatizada y repetible.
Vagrant y Docker no son tecnologías que se excluyen mutuamente, y ambas herramientas se pueden usar juntas. Por ejemplo, los equipos de DevOps pueden usar Docker para desarrollar y ejecutar aplicaciones mientras usan Vagrant para recrear entornos especializados para reproducir problemas. Docker puede incluso ejecutarse dentro de una VM creada por Vagrant, tal vez para probar nuevas versiones de Docker o para probar herramientas distribuidas como imágenes de Docker en un entorno aislado.
Resumen
Los equipos de DevOps tienen muchas opciones al crear, distribuir y ejecutar aplicaciones.
Docker proporciona un formato de imagen personalizado y un entorno de ejecución de contenedores que permite el uso eficiente de recursos a gran escala y es compatible con las plataformas PaaS y FaaS.
Las máquinas virtuales ofrecen entornos de ejecución seguros y aislados de muchos proveedores de máquinas virtuales locales y en la nube, con Vagrant abstrayendo muchas diferencias para proporcionar una CLI única y una sintaxis de configuración uniforme para crear instancias de máquinas virtuales entre proveedores.
Antes de comenzar a desarrollar su próxima aplicación, observe cómo el servicio de hospedaje de aplicaciones de Kinsta puede aprovechar Dockerfiles para administrar la implementación de su código.