¿Debería usar Vagrant o Docker para crear un ambiente aislado

vagrant docker


Utilizo Ubuntu para el desarrollo y el despliegue y tengo la necesidad de crear un entorno aislado.

Estoy considerando o bien Vagabundo o bien Docker para este propósito.¿Cuáles son los pros y los contras,o cómo se comparan estas soluciones?





Answer 1 creack


Si su propósito es el aislamiento,creo que Docker es lo que quiere.

Vagrant es un administrador de máquinas virtuales. Le permite realizar un script de la configuración de la máquina virtual, así como el aprovisionamiento. Sin embargo, sigue siendo una máquina virtual que depende de VirtualBox (u otros) con una gran sobrecarga. Requiere que tenga un archivo de disco duro que puede ser enorme, requiere mucha memoria RAM y el rendimiento puede no ser muy bueno.

Docker, por otro lado, usa el kernel cgroup y el espacio de nombres a través de LXC . Significa que está utilizando el mismo núcleo que el host y el mismo sistema de archivos. Puede usar Dockerfile con el comando docker build para manejar el aprovisionamiento y la configuración de su contenedor. Tiene un ejemplo en docs.docker.com sobre cómo hacer su Dockerfile; Es muy intuitivo.

La única razón por la que podrías querer usar Vagrant es si necesitas hacer desarrollo BSD,Windows u otro desarrollo no Linux en tu caja de Ubuntu.De lo contrario,ve por Docker.




Answer 2 Mitchell


Descargo de responsabilidad: escribí Vagrant! Pero debido a que escribí Vagrant, paso la mayor parte del tiempo viviendo en el mundo DevOps, que incluye software como Docker. Trabajo con muchas compañías que usan Vagrant y muchas usan Docker, y veo cómo interactúan los dos.

Antes de hablar demasiado, una respuesta directa: en su escenario específico (trabajando solo, trabajando en Linux, usando Docker en producción), puede quedarse solo con Docker y simplificar las cosas. En muchos otros escenarios (lo discuto más adelante), no es tan fácil.

No es correcto comparar directamente a Vagrant con Docker.En algunos escenarios,se superponen,y en la gran mayoría,no.En realidad,la comparación más apropiada sería Vagrant versus algo como Boot2Docker (sistema operativo mínimo que puede ejecutar Docker).Vagabundo es un nivel por encima de Docker en términos de abstracciones,por lo que no es una comparación justa en la mayoría de los casos.

Vagrant lanza cosas para ejecutar aplicaciones / servicios con fines de desarrollo. Esto puede estar en VirtualBox, VMware. Puede ser remoto como AWS, OpenStack. Dentro de esos, si usa contenedores, a Vagrant no le importa, y lo acepta: puede instalar, desplegar, construir y ejecutar automáticamente contenedores Docker, por ejemplo. Con Vagrant 1.6, Vagrant tiene entornos de desarrollo basados ​​en Docker y admite el uso de Docker con el mismo flujo de trabajo que Vagrant en Linux, Mac y Windows. Vagrant no intenta reemplazar a Docker aquí, abarca las prácticas de Docker.

Docker dirige específicamente los contenedores Docker.Si lo comparas directamente con Vagrant:es específicamente una solución más específica (sólo puede ejecutar Docker containers),menos flexible (requiere Linux o un host Linux en algún lugar).Por supuesto,si estás hablando de producción o CI,¡no hay comparación con Vagrant! Vagabundo no vive en estos entornos,por lo que se debería usar Docker.

Si tu organización sólo tiene contenedores Docker para todos sus proyectos y sólo tiene desarrolladores que se ejecutan en Linux,entonces está bien,Docker podría definitivamente trabajar para ti!

De lo contrario,no veo un beneficio en intentar usar Docker solo,ya que se pierde mucho de lo que Vagrant tiene para ofrecer,que tiene verdaderos beneficios de productividad empresarial:

  • Los vagabundos pueden lanzar máquinas VirtualBox,VMware,AWS,OpenStack,etc.No importa lo que necesites,Vagrant puede lanzarlo.Si estás usando Docker,Vagrant puede instalar Docker en cualquiera de ellas para que puedas usarlas para ese propósito.

  • Vagabundo es un flujo de trabajo único para todos sus proyectos.O para decirlo de otra manera,es sólo una cosa que la gente tiene que aprender para ejecutar un proyecto,ya sea en un contenedor Docker o no.Si,por ejemplo,en el futuro,surge un competidor para competir directamente con Docker,Vagrant también podrá ejecutar eso.

  • Vagabundo trabaja en Windows (de vuelta a XP),Mac (de vuelta a 10.5),y Linux (de vuelta al kernel 2.6).En los tres casos,el flujo de trabajo es el mismo.Si usas Docker,Vagrant puede lanzar una máquina (VM o remota)que puede ejecutar Docker en los tres sistemas.

  • Vagabundo sabe cómo configurar algunas cosas avanzadas o no triviales como la red y la sincronización de carpetas.Por ejemplo:Vagrant sabe cómo adjuntar una IP estática a una máquina o puertos de reenvío,y la configuración es la misma sin importar el sistema que use (VirtualBox,VMware,etc.)Para las carpetas sincronizadas,Vagrant provee múltiples mecanismos para llevar sus archivos locales a la máquina remota (carpetas compartidas de VirtualBox,NFS,rsync,Samba [plugin],etc.).Si estás usando Docker,incluso Docker con un VM sin Vagrant,tendrías que hacerlo manualmente o tendrían que reinventar Vagrant en este caso.

  • Vagrant 1.6 tiene soporte de primera clase para entornos de desarrollo basados en docker . Esto no lanzará una máquina virtual en Linux, y lanzará automáticamente una máquina virtual en Mac y Windows. El resultado final es que trabajar con Docker es uniforme en todas las plataformas, mientras que Vagrant aún maneja los tediosos detalles de cosas como redes, carpetas sincronizadas, etc.

Para abordar los contra-argumentos específicos que he escuchado a favor de usar Docker en lugar de Vagrant:

  • "Es menos partes móviles"-Sí,puede serlo,si usas Docker exclusivamente para cada proyecto.Incluso entonces,es sacrificar la flexibilidad para el bloqueo de Docker.Si alguna vez decides no usar Docker para cualquier proyecto,pasado,presente o futuro,entonces tendrás más partes móviles.Si hubieras usado Vagrant,tienes esa parte móvil que soporta el resto.

  • "¡Es más rápido!"-Una vez que tienes el host que puede ejecutar los contenedores de Linux,Docker es definitivamente más rápido en la ejecución de un contenedor de lo que cualquier máquina virtual sería para lanzar.Pero lanzar una máquina virtual (o máquina remota)es un costo único.En el transcurso del día,la mayoría de los usuarios Vagabundos nunca destruyen su VM.Es una extraña optimización para los entornos de desarrollo.En la producción,donde Docker realmente brilla,entiendo la necesidad de girar rápidamente los contenedores hacia arriba.

Espero que ahora esté claro que es muy difícil,y creo que no es correcto,comparar a Docker con Vagabundo.Para los entornos de desarrollo,el Vagabundo es más abstracto,más general.Docker (y las diversas formas en que puede hacer que se comporte como Vagrant)es un caso de uso específico de Vagrant,ignorando todo lo demás que Vagrant tiene para ofrecer.

En conclusión:en casos de uso muy específicos,Docker es ciertamente un posible sustituto de Vagrant.En la mayoría de los casos de uso,no lo es.Vagabundo no obstaculiza su uso de Docker;en realidad hace lo que puede para hacer que la experiencia sea más suave.Si usted encuentra que esto no es cierto,estoy feliz de tomar sugerencias para mejorar las cosas,ya que un objetivo de Vagrant es trabajar igualmente bien con cualquier sistema.

¡Espero que esto aclare las cosas!




Answer 3 Solomon Hykes


Soy el autor de Docker.

La respuesta corta es que si quieres manejar las máquinas,debes usar Vagrant.Y si quieres construir y ejecutar entornos de aplicaciones,deberías usar Docker.

Vagabundo es una herramienta para la gestión de máquinas virtuales.Docker es una herramienta para construir y desplegar aplicaciones empaquetándolas en contenedores ligeros.Un contenedor puede contener prácticamente cualquier componente de software junto con sus dependencias (ejecutables,librerías,archivos de configuración,etc.),y ejecutarlo en un entorno de tiempo de ejecución garantizado y repetible.Esto hace que sea muy fácil construir su aplicación una vez e implementarla en cualquier lugar:en su portátil para pruebas,luego en diferentes servidores para su implementación en vivo,etc.

Es un error común pensar que solo puedes usar Docker en Linux. Eso es incorrecto; También puede instalar Docker en Mac y Windows. Cuando se instala en Mac, Docker incluye una pequeña máquina virtual Linux (¡25 MB en disco!) Que actúa como envoltorio para su contenedor. Una vez instalado, esto es completamente transparente; puede usar la línea de comandos de Docker exactamente de la misma manera. Esto le brinda lo mejor de ambos mundos: puede probar y desarrollar su aplicación utilizando contenedores, que son muy livianos, fáciles de probar y fáciles de mover (consulte, por ejemplo, https://hub.docker.com para compartir contenedores reutilizables con la comunidad Docker), y no necesita preocuparse por los detalles esenciales de la administración de máquinas virtuales, que de todos modos son solo un medio para un fin.

En teoría es posible usar Vagrant como una capa de abstracción para Docker.No lo recomiendo por dos razones:

  • Primero,Vagabundo no es una buena abstracción para Docker.Vagabundo fue diseñado para manejar máquinas virtuales.Docker fue diseñado para administrar el tiempo de ejecución de una aplicación.Esto significa que Docker,por diseño,puede interactuar con una aplicación de manera más rica,y tiene más información sobre el tiempo de ejecución de la aplicación.Las primitivas en Docker son los procesos,los flujos de registro,las variables de entorno,y los enlaces de red entre los componentes.Las primitivas en Vagrant son máquinas,dispositivos de bloqueo,y teclas ssh.Vagrant simplemente se sienta más abajo en la pila,y la única forma en que puede interactuar con un contenedor es pretendiendo que es sólo otro tipo de máquina,que puede "arrancar" y "conectarse".Así que,claro,puedes teclear "vagabundo" con un plugin Docker y algo bonito sucederá.¿Es un sustituto de todo lo que Docker puede hacer? Prueba el Docker nativo por un par de días y compruébalo tú mismo :)

  • Segundo,el argumento del encierro."Si usas Vagabundo como una abstracción,no estarás encerrado en Docker!".Desde el punto de vista de Vagrant,que está diseñado para manejar máquinas,esto tiene perfecto sentido:¿no son los contenedores otro tipo de máquina? Al igual que Amazon EC2 y VMware,¡debemos tener cuidado de no atar nuestras herramientas de aprovisionamiento a ningún proveedor en particular! Esto crearía un encierro-mejor abstraerlo todo con Vagrant.Excepto que esto no tiene nada que ver con Docker.Docker no aprovisiona máquinas,sino que envuelve su aplicación en un ligero tiempo de ejecución portátil que se puede dejar en cualquier lugar.

El tiempo de ejecución que elija para su aplicación no tiene nada que ver con la forma de aprovisionar sus máquinas.Por ejemplo,es bastante frecuente desplegar aplicaciones en máquinas que son aprovisionadas por otra persona (por ejemplo una instancia EC2 desplegada por su administrador de sistema,quizás usando Vagrant),o en máquinas de metal desnudo que Vagrant no puede aprovisionar en absoluto.Por el contrario,puede utilizar Vagrant para aprovisionar máquinas que no tienen nada que ver con el desarrollo de su aplicación,por ejemplo,una caja de IIS de Windows lista para usar o algo así.O puede utilizar Vagrant para aprovisionar máquinas para proyectos que no utilizan Docker-tal vez utilizan una combinación de rubíes y rvm para la gestión de dependencias y el sandboxing,por ejemplo.

En resumen:Vagabundo es para la gestión de las máquinas,y Docker es para la construcción y ejecución de entornos de aplicación.




Answer 4 Chris Bushell


Prefiero mi respuesta admitiendo que no tengo experiencia con Docker,salvo como ávido observador de lo que parece ser una solución realmente pulcra que está ganando mucha fuerza.

Tengo una buena cantidad de experiencia con Vagrant y puedo recomendarlo. Ciertamente, es una solución más pesada en términos de que está basada en VM en lugar de LXC. Sin embargo, he encontrado que una computadora portátil decente (8 GB de RAM, CPU i5 / i7) no tiene problemas para ejecutar una VM usando Vagrant / VirtualBox junto con herramientas de desarrollo.

Una de las cosas realmente geniales con Vagrant es la integración con scripts Puppet / Chef / shell para automatizar la configuración. Si está utilizando una de estas opciones para configurar su entorno de producción, puede crear un entorno de desarrollo que sea lo más idéntico posible y esto es exactamente lo que desea.

La otra gran cosa con Vagrant es que puedes versionar tu Vagrantfile junto con tu código de aplicación.Esto significa que todos los demás en tu equipo pueden compartir este archivo y tienes la garantía de que todos trabajan con la misma configuración de entorno.

Curiosamente, Vagrant y Docker pueden ser complementarios. Vagrant puede extenderse para admitir diferentes proveedores de virtualización, y es posible que Docker sea uno de esos proveedores que obtenga soporte en el futuro cercano. Vea https://github.com/dotcloud/docker/issues/404 para una discusión reciente sobre el tema.




Answer 5 Mark Stratmann


Son muy complementarios.

He estado usando una combinación de VirtualBox,Vagrant y Docker para todos mis proyectos durante varios meses y he sentido fuertemente los siguientes beneficios.

En Vagrant puedes eliminar completamente cualquier aprovisionamiento de Chef solo y todo lo que necesitas hacer con tu archivo Vagrant es preparar una máquina que ejecute un pequeño script de shell que instale docker.Esto significa que mis Vagrantfiles para cada proyecto son casi idénticos y muy simples.

Aquí está un típico archivo Vagabundo

# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "mark2"
  config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box"
  [3000, 5000, 2345, 15672, 5672, 15674, 27017, 28017, 9200, 9300, 11211, 55674, 61614, 55672, 5671, 61613].each do |p|
    config.vm.network :forwarded_port, guest: p, host: p
  end
  config.vm.network :private_network, ip: "192.168.56.20"
  config.vm.synced_folder ".", "/vagrant", :type => "nfs"
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048"]
    vb.customize ["modifyvm", :id, "--cpus", "2"]
  end
  # Bootstrap to Docker
  config.vm.provision :shell, path: "script/vagrant/bootstrap", :privileged => true
  # Build docker containers
  config.vm.provision :shell, path: "script/vagrant/docker_build", :privileged => true
  # Start containers
  # config.vm.provision :shell, path: "script/vagrant/docker_start", :privileged => true
end

El archivo Bootstrap que instala Docker se ve así

#!/usr/bin/env bash
echo 'vagrant  ALL= (ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers
apt-get update -y
apt-get install htop -y
apt-get install linux-image-extra-`uname -r` -y
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list
apt-get update -y
apt-get install lxc-docker -y
apt-get install curl -y

Ahora,para obtener todos los servicios que necesito,tengo un script docker_start que se ve algo así.

#!/bin/bash
cd /vagrant
echo Starting required service containers
export HOST_NAME=192.168.56.20
# Start MongoDB
docker run --name=mongodb --detach=true --publish=27017:27017 --publish=28017:28017 dockerfile/mongodb
read -t5 -n1 -r -p "Waiting for mongodb to start..." key
# Start rabbitmq
docker run --name=rabbitmq --detach=true --publish=5671:5671 --publish=5672:5672 --publish=55672:55672 --publish=15672:15672 --publish=15674:15674 --publish=61613:61613 --env RABBITMQ_USER=guest --env RABBITMQ_PASS=guest rabbitmq
read -t5 -n1 -r -p "Waiting for rabbitmq to start..." key
# Start cache
docker run --name=memcached --detach=true --publish=11211:11211  ehazlett/memcached
read -t5 -n1 -r -p "Waiting for cache to start..." key
# Start elasticsearch
docker run --name=elasticsearch --detach=true --publish=9200:9200 --publish=9300:9300 dockerfile/elasticsearch
read -t5 -n1 -r -p "Waiting for elasticsearch to start..." key
echo "All services started"

En este ejemplo estoy dirigiendo MongoDB,Elastisearch,RabbitMQ y Memcached

Una configuración de Chef no-docker en solitario sería considerablemente más complicada.

Una gran ventaja final se obtiene cuando se pasa a la producción,ya que traducir el entorno de desarrollo a una infraestructura de anfitriones que son todos iguales en el sentido de que sólo tienen la suficiente configuración para ejecutar docker significa muy poco trabajo en realidad.

Si le interesa,tengo un artículo más detallado sobre el entorno de desarrollo en mi propio sitio web en

Implementación de un entorno de desarrollo de muelles vagabundos