¿Cuál es la diferencia entre Docker y Vagrant? ¿Cuándo deberías usar cada uno?

La principal diferencia proviene del método muy diferente utilizado para lograr algún tipo de separación dentro de una máquina física. Docker se basa en la contenedorización , mientras que Vagrant utiliza la virtualización . ¿Cual es la diferencia?

Virtualización

Con la virtualización, cada máquina virtual ejecuta su propio sistema operativo completo dentro de un entorno de hardware simulado proporcionado por un programa llamado hipervisor que se ejecuta en el hardware físico. Ilustración:

Este enfoque tiene sus ventajas y desventajas. Por mencionar los más obvios:

+++ la separación casi completa entre las máquinas virtuales y el host le permite tener máquinas virtuales Linux en un host de Windows o viceversa.

– – – tiene que dedicar una cantidad estática de recursos (CPU, RAM, almacenamiento) a las máquinas virtuales, y el hipervisor consumirá muchos recursos (esto generalmente se conoce como gastos generales )

La virtualización es ampliamente utilizada, es la tecnología de acceso a las infraestructuras en la nube.

// Auto-promoción: las máquinas virtuales ElasticHosts se crean con una forma de virtualización (Linux-KVM). //

Contenedorización

La contenedorización permite que varias aplicaciones se ejecuten en particiones aisladas de un solo núcleo de Linux que se ejecuta directamente en el hardware físico. Los cgroups y espacios de nombres de Linux son las tecnologías subyacentes del kernel de Linux que se utilizan para aislar, proteger y administrar los contenedores.

Pros y contras:

+++ El rendimiento es más alto que la virtualización ya que no hay sobrecarga del hipervisor y usted está más cerca del metal desnudo. Además, el contenedor simplemente utiliza los recursos que necesita, punto.

– – – Los contenedores usan el núcleo de la máquina host. No hay cosas divertidas de Windows en un host Linux.

// Auto-promoción: ver los contenedores elásticos //

Vagabundo y Docker son diferentes bestias. Docker es una capa de administración / shell de dos partes para construir y ejecutar contenedores virtuales de Linux, basados ​​en lxc.

Lo mejor de Docker es que es liviano (porque se basa en contenedores de Linux de núcleo compartido) y es independiente de la distribución. Si bien el núcleo entre todas las instancias se comparte (pero está aislado del host y entre sí), el espacio de usuario para diferentes instancias puede basarse en diferentes distribuciones de Linux.

Vagrant, por otro lado, es una herramienta maravillosa para el aprovisionamiento automático de múltiples máquinas virtuales, cada una con sus propias configuraciones administradas con títeres y / o chef. Para su virtualización puede utilizar diferentes proveedores. Originalmente, el proveedor predeterminado era virtualbox, pero ahora es compatible con muchos más, incluyendo vmware fusion e incluso amazon-ec2.

Curiosamente, Vagrant tiene un proveedor de Docker ahora, por lo que puede usar vagrant para administrar sus construcciones e implementaciones de Docker.

Docker todavía tiene una flexibilidad limitada: “todo es una imagen”, y puede crear imágenes variantes y pilas completas de imágenes, donde cada una agrega características a la anterior. Gestionar eso puede convertirse en un desafío.

Vagrant tiene desafíos similares, ya que las cajas pueden quedar desactualizadas y, a veces, las cajas pueden ser difíciles de encontrar y / o actualizar. Existen herramientas como el empaquetador y la veewee más antigua para ayudarlo a construir las llamadas cajas ‘base’.

Creo que las herramientas pueden funcionar muy bien juntas, y creo que donde podría brillar la combinación es donde planificaría una refactorización significativa de su pila, donde desea probar el reemplazo de componentes completos, o incluso el sistema operativo base.

Supongamos que tiene una pila de aplicaciones basada en Centos y desea cambiar a Ubuntu, o al revés. Supongamos que desea actualizar su sistema operativo por completo.

Siempre digo que en Desarrollo / Prueba y Estadificación, siempre debe probar su aplicación con el entorno de producción actual (incluida la configuración) y cualquier entorno de producción alternativo potencial. ¿Estás planeando una actualización de seguridad? ¿Desea actualizar o cambiar su pila de Java?

Aquí es donde brillan Vagrant y Docker. Esperaría que Docker lo ayude a acelerar las pruebas en múltiples entornos operativos.

¿Docker es un vehículo útil para implementar su aplicación en producción? Es el caso de uso comúnmente anunciado, y podría serlo. Sin embargo, los cambios meticulosos en los archivos de configuración, especialmente cuando estos deben ser orquestados a través de la red, se realizan mejor con una herramienta que conoce otros componentes de la red.

Respuesta corta: Vagrant abstrae la máquina donde Docker abstrae la aplicación.

Vagrant utiliza virtualbox para activar una máquina virtual en la que puede configurar su propio entorno e instalar todo lo que necesita en esa máquina, principalmente a través de algunos scripts de aprovisionamiento. Su caso de uso más común es probar su aplicación en diferentes entornos y activar servidores / máquinas de prueba donde sus compañeros de equipo pueden probar y probar su trabajo en donde todos los demás puedan ver y usar.

Docker, por otro lado, utiliza imágenes y contenedores para construir su aplicación como una imagen. Una imagen es básicamente una instancia de su aplicación con todo su entorno de instalación y requisitos instalados, sin embargo, no es una máquina. Un contenedor es básicamente un proceso / servicio que se ejecuta en segundo plano, actúa como una máquina virtual que contiene sus imágenes , pero no es uno, es solo un servicio que se ejecuta en la parte superior de una máquina. Puede ejecutar muchas imágenes en un contenedor y puede ejecutar muchos contenedores en una máquina.

Si tiene su imagen de Docker, puede ejecutar su aplicación en cualquier máquina, todo lo que necesita es tener Docker instalado. Docker usa dockerhub como un CDN donde los usuarios pueden extraer / insertar imágenes de los repositorios.

Para comprender la diferencia entre Docker y Vagrant, primero debe comprender la diferencia entre Containerisation y Virtualization. Trataré de explicarlo con un diagrama:

  1. Una máquina virtual ejecuta su propio espacio de kernel (es decir, SO) mientras que un contenedor no lo hace pero comparte el espacio de kernel de su sistema operativo. Esto significa que puede ejecutar máquinas virtuales Windows, Solaris, FreeBSD sobre el kernel de Linux, mientras que solo puede ejecutar contenedores de Linux sobre el kernel de Linux.
  2. Desde el inicio de una máquina virtual que significa arrancar un sistema operativo, por lo que tiene una sobrecarga alta ( arranque lento ), mientras que iniciar un contenedor significa iniciar un proceso encarcelado, por lo tanto, sobrecarga muy baja ( arranque rápido ).

Hay muchas implementaciones de hipervisor, pero las más populares son:

  1. Xen: utilizado por Amazon AWS y Rackspace.
  2. KVM: utilizado por DigitalOcean.

Del mismo modo, hay muchas técnicas de contenedorización como:

  1. Libcontainer
  2. LXC
  3. Zona Solaris
  4. Cárcel de FreeBSD

Docker es una técnica de contenedorización escrita sobre libcontainer (usaron LXC hasta v0.9) mientras que Vagrant es una capa superior a las técnicas de virtualización como VirtualBox, Hyper-V, etc.

El uso de cada uno de ellos depende de algunos factores:

  1. Si necesita un mayor nivel de separación de recursos de hardware, entonces debe usar la virtualización (es decir, máquinas virtuales). El caso de uso perfecto son las ofertas de nube pública donde necesitan una separación estricta de recursos entre las máquinas virtuales que se ejecutan en el mismo hardware.
  2. Si no necesita una separación estricta de recursos y desea que su aplicación se agrupe con sus dependencias de espacio de usuario, los contenedores son perfectos para usted.

Espero que esto ayude.

Vagrant abstrae la máquina, Docker abstrae la aplicación.
Cuando necesite una máquina desechable, use Vagrant. Si desea una aplicación desechable, use Docker.
¿Por qué necesitarías una máquina desechable para una aplicación? Cuando quieras hacer algo sofisticado con redes o hardware.
Si no está seguro, use Vagrant.

Vagrant es un “administrador de máquinas virtuales”. Herramienta única para aprovisionar máquinas virtuales / contenedores de cualquiera de los proveedores. Actúa como un contenedor para diferentes tecnologías de virtualización / contenedor

Nombrando algunos de los proveedores a continuación (No es una lista completa)

  • Caja virtual
  • VMware
  • Docker – Contenedor
  • Hyper-V
  • Google Compute Engine
  • LXC – Contenedor
  • Nube de espacio en rack

Docker es una tecnología de Contenedor (Contenedor en términos simples proporciona un entorno virtual que tiene su propia CPU, memoria, E / S de bloque, red, etc., pero utiliza el núcleo del host). Se puede usar para crear / enviar entornos de aplicaciones

Aprenda Vagabundo aquí: Aprenda Vagabundo – Mejores Tutoriales Vagabundos | Hackr.io

Para aquellos que usan Vagrant pero están investigando Docker , puede ser curioso acerca de la diferencia entre ellos.

Solomon Hykes , el autor de Docker, da su opinión:

Si desea administrar máquinas, debe usar Vagrant … Si desea crear y ejecutar entornos de aplicaciones, debe usar Docker.

En otras palabras, Vagrant administra máquinas virtuales y Docker empaqueta aplicaciones en contenedores . Pero incluso con su explicación, puede ser bastante difícil entender lo que significa todo. Así que haré todo lo posible para explicarlo con una analogía.

Imagina que tienes dos bienes inmuebles. El primero se llama Vagrantland y el segundo se llama Dockertown . Ambos son del mismo tamaño y tienen la misma infraestructura subyacente (por ejemplo, sistemas de agua, redes eléctricas, tuberías y cables).

Su trabajo como desarrollador es agregar tiendas, restaurantes y otros negocios porque en este momento, es solo un área de tierra sin nada.

En Vagrantland , cada vez que se agrega un negocio, se debe construir un nuevo edificio.

Por ejemplo, para agregar una cafetería (llamémosla “Think Java”), necesita construir la tienda física y configurar la infraestructura del edificio (por ejemplo, electricidad, iluminación, agua). Una vez que se erige el edificio, agrega los ingredientes necesarios para que el lugar se vea y se sienta como una cafetería real.

Luego, decide agregar una tienda de muebles llamada “Couch De Bee”. Al igual que “Think Java”, necesita construir una tienda física con la misma infraestructura. Luego, se agregarán el diseño interior y los productos para que la tienda parezca que vende muebles.

Entonces, probablemente podría decir que agregar un negocio puede ser bastante engorroso y difícil de escalar en Vagrantland .

Cambiemos a Dockertown . Primero, se construye un solo edificio con toda la infraestructura establecida, al igual que un edificio en Vagrantland . La diferencia, sin embargo, es que el edificio en Dockertown actúa como un centro comercial . Entonces, cada vez que se agrega un nuevo negocio, simplemente ocupa espacio dentro del edificio.

Por ejemplo, cuando se agrega una joyería llamada “Ruby and Reals”, simplemente encuentra un lugar en el centro comercial y establece la tienda con los materiales que necesita para vender gemas. Y cuando se agrega un puesto de frutas llamado “Mongo”, ocupa un pequeño espacio en el centro comercial y comienza a hacer negocios de inmediato.

Lo que es eficiente aquí es que ambas empresas comparten la misma infraestructura del edificio, como el sistema de iluminación y las instalaciones del baño. En este escenario, agregar, eliminar y cambiar negocios es rápido, fácil y escalable .

Así que vamos a unir todo. Lo que es similar entre las máquinas virtuales de Vagrant y los contenedores de Docker es que ambos se ubican en la parte superior de un sistema operativo host . La diferencia, por otro lado, es cómo se ejecuta la aplicación . Para Vagrant, cada máquina virtual incluye un sistema operativo invitado con la aplicación y sus bibliotecas y binarios. Para Docker, los contenedores no necesitan un SO huésped para cada aplicación, ya que todos comparten el mismo núcleo .

Esa es la diferencia clave entre Vagrant y Docker. Para obtener más información, consulte este diagrama visual que ilustra esta diferencia.

Además de los factores mencionados anteriormente, un factor importante es el sistema operativo host. Si está en un host de Windows, entonces descarta la ventana acoplable a nivel nativo.
Hay un proyecto Boot2Docker que admite Windows. Puede leer más sobre esto en Page en docker.com. Microsoft planea traer soporte nativo para Docker en el servidor de Windows en el futuro.
Mi empresa utiliza contenedores docker para implementaciones de producción mientras yo uso vagabundo para tener una instalación local en mi computadora portátil para reuniones de ventas

Descargo de responsabilidad: soy el autor de `teracy-dev` donde llevamos a Docker a Vagrant = amor.

Vagrant se usa para administrar máquinas virtuales, esto es útil cuando desea configurar diferentes entornos de desarrollo e implementación mediante el uso de Vagrant para administrar VM automáticamente. Las máquinas virtuales son en realidad servidores.

Por otro lado, Docker se usa para construir el tiempo de ejecución de la aplicación con una imagen para ejecutar en los servidores.

Son geniales para combinar en el entorno de desarrollo.

Puede ver más aquí: ¿Debería usar Vagrant o Docker para crear un entorno aislado?

Docker funciona muy bien en Linux, sin embargo, es muy difícil hacer que funcione de manera universal y consistente en Mac y Windows. Hay muchos esfuerzos para resolver este problema, tanto de Docker como de la comunidad de Docker. Sin embargo, aún no hemos alcanzado esa etapa hasta `teracy-dev`.

Puede leer más en detalle: teracy-dev – la única plataforma de desarrollo productivo verdaderamente universal con Docker en macOS, Linux y Windows – Blog de Teracy

Docker es una tecnología de contenedorización. Proporciona un entorno para ejecutar un SO y una aplicación aislada y separada de un SO host. El contenedor Docker se implementa con el software del sistema operativo host que incluye procesos, chroot, cgroup, red, etc. para utilizar un entorno independiente directamente en el sistema operativo host. Docker no es para máquina virtual como en virtualizado con hipervisor.

Vagrant es una herramienta para implementar máquinas virtuales desde la línea de comandos. Necesita un hipervisor, software para implementar y administrar una máquina virtual, como VMware y virtualbox, para ejecutar Vagrant. Con Vagrant, puede crear un archivo de configuración para definir una máquina virtual y ejecutarlo desde el comando para iniciar, iniciar sesión y detener la máquina virtual. Esto es útil cuando desea implementar el mismo entorno de máquina virtual en varios servidores físicos. Vagrant es para máquinas virtuales virtualizadas por hipervisores.

Si desea saber sobre las diferencias entre ellos, creo que es mejor que sepamos sobre Hypervisor vs Container en Page en odin.com. ¡Espero que esto ayude!

Vea lo que los creadores de Vagrant y Docker tienen que decir sobre Vagrant vs Docker:
¿Debo usar Vagrant o Docker.io para crear un entorno aislado?