Sua pergunta tem a sorte de obter as respostas dos dois escritores dos dois serviços: Mitchell e Solomon Hykes
itsazzad
4
Eu gostaria de dar um novo resumo - a questão está principalmente errada. A pergunta certa é: Devo usar o Vagrant ou o docker-composite para criar um ambiente isolado? A resposta é que o Vagrant e o docker-compose executam a mesma tarefa de descrever ambientes, e você deve comparar o Docker ao Virtualbox. A diferença é que o Vagrant pode usar qualquer virtualização como Docker, VMWare, Virtualbox no Windows, Linux ou OSX, mas o docker-compose pode usar apenas imagens do Docker baseadas em Linux.
PHZ.fi-Pharazon
Para mim, a resposta é "Qual a importância da velocidade para você em atividades regulares de trabalho". Acho o Vagrant mais lento que o Docker. Na janela de encaixe, especialmente depois de uma atração inicial, o cache e camadas aproximar da janela de encaixe torna o mais fácil e mais rápido para mim como um desenvolvedor de usá-lo
Michael Durrant
Respostas:
1155
Se seu objetivo é o isolamento, acho que Docker é o que você deseja.
O Vagrant é um gerenciador de máquinas virtuais. Ele permite que você script a configuração da máquina virtual, bem como o provisionamento. No entanto, ainda é uma máquina virtual, dependendo do VirtualBox (ou de outros) com uma enorme sobrecarga. Ele exige que você tenha um arquivo do disco rígido que pode ser enorme, que requer muita memória RAM e que o desempenho pode não ser muito bom.
O Docker, por outro lado, usa o kernel cgroup e o namespacing via LXC . Isso significa que você está usando o mesmo kernel que o host e o mesmo sistema de arquivos. Você pode usar o Dockerfile com o docker buildcomando para lidar com o provisionamento e a configuração do seu contêiner. Você tem um exemplo em docs.docker.com sobre como criar seu arquivo Docker; é muito intuitivo.
A única razão pela qual você pode querer usar o Vagrant é se você precisa desenvolver BSD, Windows ou outro desenvolvimento não Linux na sua caixa do Ubuntu. Caso contrário, vá para o Docker.
Infelizmente ainda não. Se você estiver em um sistema de 32 bits, precisará de uma VM com um sistema convidado de 64 bits para executar a janela de encaixe. No entanto, com go1.1 o apoio de 32 bits ficar melhor e é possível que estivador apoiará arco de 32 bits em breve
creack
8
Isso é verdade para Mac e Windows, mas desde o docker 0.7, qualquer distribuição Linux funciona bem. Se você souber de alguém que não trabalha, entre em contato. Além disso, a menos que você tenha uma pilha do Mac ou Windows (o que é improvável, mas pode acontecer), você não deseja executar o Docker em qualquer lugar, exceto no Linux. O cliente docker funciona bem no Mac, deve funcionar em breve no BSD e o daemon eventualmente oferecerá suporte ao BSD, Solaris e Mac.
O vagrant possui provedores de LXC e docker. No entanto - Vagrant e docker são coisas fundamentalmente diferentes. O Vagrant é apenas para ambientes de desenvolvimento, o docker é apenas para produção e Linux.
Dannyboy
2
O Docker agora funciona no Windows 10 Pro e superior e no Windows Server 2016. Acabei de atualizar do Windows 10 Home para o Windows 10 Pro e instalei o aplicativo docker. Agora posso executar imagens do docker Linux no Windows 10. É brilhante!
PrestonDocks
2339
Disclaimer: Eu escrevi Vagrant! Mas como eu escrevi o Vagrant, passo a maior parte do tempo vivendo no mundo do DevOps, que inclui software como o Docker. Eu trabalho com muitas empresas usando o Vagrant e muitas usam o Docker e vejo como as duas interagem.
Antes de falar demais, uma resposta direta: em seu cenário específico (você trabalhando sozinho, trabalhando no Linux, usando o Docker em produção), você pode ficar com o Docker sozinho e simplificar as coisas. Em muitos outros cenários (discuto mais adiante), não é tão fácil.
Não é correto comparar diretamente o Vagrant ao Docker. Em alguns cenários, eles se sobrepõem e, na grande maioria, não. Na verdade, a comparação mais adequada seria o Vagrant versus algo como o Boot2Docker (SO mínimo que pode executar o Docker). Vagrant é um nível acima do Docker em termos de abstrações, portanto, não é uma comparação justa na maioria dos casos.
O Vagrant lança coisas para executar aplicativos / serviços com o objetivo de desenvolvimento. Isso pode ser no VirtualBox, VMware. Pode ser remoto como AWS, OpenStack. Nessas, se você usar contêineres, o Vagrant não se importa e aceita isso: ele pode instalar, puxar, construir e executar automaticamente contêineres do Docker, por exemplo. Com o Vagrant 1.6, o Vagrant possui ambientes de desenvolvimento baseados no docker e suporta o uso do Docker com o mesmo fluxo de trabalho do Vagrant no Linux, Mac e Windows. O Vagrant não tenta substituir o Docker aqui, abrange as práticas do Docker.
O Docker executa especificamente contêineres do Docker. Se você estiver comparando diretamente com o Vagrant: é especificamente uma solução mais específica (só pode executar contêineres do Docker), menos flexível (requer host Linux ou Linux em algum lugar). Obviamente, se você está falando sobre produção ou IC, não há comparação com o Vagrant! O Vagrant não vive nesses ambientes e, portanto, o Docker deve ser usado.
Se sua organização executar apenas contêineres do Docker para todos os seus projetos e tiver apenas desenvolvedores em execução no Linux, tudo bem, o Docker definitivamente funcionará para você!
Caso contrário, não vejo benefício em tentar usar o Docker sozinho, pois você perde muito do que o Vagrant tem a oferecer, o que traz benefícios reais de negócios / produtividade:
O Vagrant pode iniciar máquinas VirtualBox, VMware, AWS, OpenStack, etc. Não importa o que você precisa, o Vagrant pode iniciá-lo. Se você estiver usando o Docker, o Vagrant poderá instalar o Docker em qualquer um deles, para que você possa usá-los para esse fim.
O Vagrant é um fluxo de trabalho único para todos os seus projetos. Ou, dito de outra maneira, é apenas uma coisa que as pessoas precisam aprender a executar um projeto, esteja ele em um contêiner do Docker ou não. Se, por exemplo, no futuro, um concorrente surgir para competir diretamente com o Docker, o Vagrant também poderá executá-lo.
O Vagrant funciona no Windows (volta ao XP), Mac (volta à 10.5) e Linux (volta ao kernel 2.6). Nos três casos, o fluxo de trabalho é o mesmo. Se você usa o Docker, o Vagrant pode iniciar uma máquina (VM ou remota) que possa executar o Docker nos três sistemas.
O Vagrant sabe como configurar algumas coisas avançadas ou não triviais, como rede e sincronização de pastas. Por exemplo: O Vagrant sabe como conectar um IP estático a uma máquina ou portas de encaminhamento, e a configuração é a mesma, independentemente do sistema que você usa (VirtualBox, VMware, etc.). Para pastas sincronizadas, o Vagrant fornece vários mecanismos para obter seu local arquivos para a máquina remota (pastas compartilhadas do VirtualBox, NFS, rsync, Samba [plugin], etc.). Se você estiver usando o Docker, mesmo o Docker com uma VM sem o Vagrant, você precisará fazer isso manualmente ou eles terão que reinventar o Vagrant nesse caso.
O Vagrant 1.6 possui suporte de primeira classe para ambientes de desenvolvimento baseados em docker . Isso não iniciará uma máquina virtual no Linux e iniciará automaticamente uma máquina virtual no Mac e Windows. O resultado final é que o trabalho com o Docker é uniforme em todas as plataformas, enquanto o Vagrant ainda lida com os detalhes tediosos de coisas como redes, pastas sincronizadas etc.
Para abordar contra-argumentos específicos que ouvi a favor do uso do Docker em vez do Vagrant:
"São menos partes móveis" - Sim, pode ser, se você usar o Docker exclusivamente para cada projeto. Mesmo assim, está sacrificando a flexibilidade do aprisionamento no Docker. Se você decidir não usar o Docker para qualquer projeto, passado, presente ou futuro, terá mais peças móveis. Se você já usou o Vagrant, tem uma parte móvel que suporta o resto.
"É mais rápido!" - Depois de ter o host que pode executar contêineres Linux, o Docker é definitivamente mais rápido em executar um contêiner do que qualquer máquina virtual seria lançada. Mas iniciar uma máquina virtual (ou máquina remota) é um custo único. Ao longo do dia, a maioria dos usuários do Vagrant nunca destrói sua VM. É uma otimização estranha para ambientes de desenvolvimento. Na produção, onde o Docker realmente brilha, entendo a necessidade de girar rapidamente os contêineres para cima / baixo.
Espero que agora fique claro que é muito difícil, e acredito que não correto, comparar o Docker ao Vagrant. Para ambientes de desenvolvimento, o Vagrant é mais abstrato, mais geral. O Docker (e as várias maneiras pelas quais você pode fazê-lo se comportar como o Vagrant) é um caso de uso específico do Vagrant, ignorando tudo o que o Vagrant tem a oferecer.
Concluindo: em casos de uso altamente específicos, o Docker é certamente um possível substituto para o Vagrant. Na maioria dos casos de uso, não é. O Vagrant não atrapalha o uso do Docker; na verdade, faz o que pode para tornar essa experiência mais suave. Se você acha que isso não é verdade, fico feliz em receber sugestões para melhorar as coisas, pois o objetivo do Vagrant é trabalhar igualmente bem com qualquer sistema.
@JaredMarkell Acho que talvez ele esteja procurando um serviço baseado na Web que permita gerenciar suas máquinas Vagrant, como a Protobox .
Ryan Kennedy
73
@ Mitchell, eu só queria agradecer por explicar isso com tanto detalhe. Obviamente, é impossível que você seja completamente objetivo, então eu aprecio que você tenha tido tempo para explicar as nuances e as várias situações em que elas poderiam ser usadas. Eu acho que muita confusão em torno de uma variedade de ferramentas hoje é que elas se sobrepõem muito, e muitas pessoas querem uma solução única, onde alguém apenas lhes diga o que fazer e elas possam implementá-la. A beleza de sua resposta é que ela responde à pergunta subjacente: como posso criar um ambiente isolado? (independentemente das ferramentas).
@ OğuzÇelikdemir O Vagrant pode fazer muito mais do que isso. Obviamente, se você preparar uma máquina virtual específica para cada projeto, isso durará. Mas durante o desenvolvimento, muitas vezes acabo adicionando mais serviços / daemons / configurações (por exemplo, quando decido usar o RabbitMQ para um projeto durante o desenvolvimento). A abordagem puramente de VM exigirá que você prepare uma nova imagem, com o RabbitMQ instalado e configurado, e force os desenvolvedores a mudar sua VM para essa nova. Para o Vagrant - estou adicionando linhas apropriadas na configuração vaga e todos os desenvolvedores podem atualizar suas VMs facilmente (usando vagrant provision).
Tomasz Struczyński
5
(Você quer dizer "divulgação", revelando algo importante, não "disclaimer", a responsabilidade negar: english.stackexchange.com/q/115850 )
Jerry101
1418
Eu sou o autor de Docker.
A resposta curta é que, se você deseja gerenciar máquinas, deve usar o Vagrant. E se você deseja criar e executar ambientes de aplicativos, use o Docker.
O Vagrant é uma ferramenta para gerenciar máquinas virtuais. O Docker é uma ferramenta para criar e implantar aplicativos, empacotando-os em contêineres leves. Um contêiner pode conter praticamente qualquer componente de software junto com suas dependências (executáveis, bibliotecas, arquivos de configuração etc.) e executá-lo em um ambiente de tempo de execução garantido e repetível. Isso facilita muito a criação do seu aplicativo uma vez e a implantação em qualquer lugar - no laptop para teste e em servidores diferentes para implantação ao vivo etc.
É um equívoco comum que você só pode usar o Docker no Linux. Isso está incorreto; você também pode instalar o Docker no Mac e Windows. Quando instalado no Mac, o Docker empacota uma pequena VM do Linux (25 MB no disco!), Que atua como um invólucro para o seu contêiner. Uma vez instalado, isso é completamente transparente; você pode usar a linha de comando do Docker exatamente da mesma maneira. Isso oferece o melhor dos dois mundos: você pode testar e desenvolver seu aplicativo usando contêineres, que são muito leves, fáceis de testar e fáceis de mover (veja, por exemplo, https://hub.docker.com para compartilhar contêineres reutilizáveis com comunidade Docker) e você não precisa se preocupar com os detalhes básicos do gerenciamento de máquinas virtuais, que são apenas um meio para atingir um fim.
Em teoria, é possível usar o Vagrant como uma camada de abstração para o Docker. Eu recomendo isso por dois motivos:
Primeiro, o Vagrant não é uma boa abstração para o Docker. O Vagrant foi projetado para gerenciar máquinas virtuais. O Docker foi projetado para gerenciar um tempo de execução do aplicativo. Isso significa que o Docker, por design, pode interagir com um aplicativo de maneiras mais sofisticadas e ter mais informações sobre o tempo de execução do aplicativo. As primitivas no Docker são processos, fluxos de logs, variáveis de ambiente e links de rede entre componentes. As primitivas no Vagrant são máquinas, dispositivos de bloco e chaves ssh. O Vagrant simplesmente fica mais baixo na pilha, e a única maneira de interagir com um contêiner é fingir que é apenas mais um tipo de máquina: você pode "inicializar" e "entrar". Então, com certeza, você pode digitar "vagrant up" com um plug-in do Docker e algo bonito acontecerá. É um substituto para toda a amplitude do que o Docker pode fazer? Experimente o Docker nativo por alguns dias e veja você mesmo :)
Segundo, o argumento de bloqueio. "Se você usar o Vagrant como uma abstração, não será bloqueado no Docker!". Do ponto de vista do Vagrant, projetado para gerenciar máquinas, isso faz todo o sentido: os contêineres não são apenas outro tipo de máquina? Assim como o Amazon EC2 e o VMware, devemos ter cuidado para não vincular nossas ferramentas de provisionamento a nenhum fornecedor em particular! Isso criaria lock-in - melhor abstrair tudo isso com o Vagrant. Exceto que isso erra totalmente o objetivo do Docker. O Docker não provisiona máquinas; envolve seu aplicativo em um tempo de execução portátil leve, que pode ser descartado em qualquer lugar.
O tempo de execução que você escolhe para o seu aplicativo não tem nada a ver com o modo como você provisiona suas máquinas! Por exemplo, é bastante frequente implantar aplicativos em máquinas provisionadas por outra pessoa (por exemplo, uma instância do EC2 implantada pelo administrador do sistema, talvez usando o Vagrant) ou em máquinas bare metal que o Vagrant não pode provisionar. Por outro lado, você pode usar o Vagrant para provisionar máquinas que nada têm a ver com o desenvolvimento de seu aplicativo - por exemplo, uma caixa do Windows IIS pronta para usar ou algo assim. Ou você pode usar o Vagrant para provisionar máquinas para projetos que não usam o Docker - talvez eles usem uma combinação de rubygems e rvm para gerenciamento de dependências e sandbox, por exemplo.
Em resumo: o Vagrant é para gerenciar máquinas e o Docker é para criar e executar ambientes de aplicativos.
Só queria observar que os aspectos do Vagrant dessa resposta estão incorretos. O Vagrant não é para gerenciar máquinas, o Vagrant é para gerenciar ambientes de desenvolvimento. O fato de o Vagrant gerar máquinas é principalmente histórico. A próxima versão do Vagrant tem suporte de primeira classe para acelerar o ambiente de desenvolvimento usando o Docker como provedor diretamente no host ou em qualquer VM (Mac, Win). Também pode ativar o LXC bruto, se for o que alguém deseja (novamente, no host ou na VM). O Vagrant está interessado em fazer o melhor para criar um ambiente de desenvolvimento portátil, se isso significa criar ou não uma VM.
"É um equívoco comum que você só possa usar o Docker no Linux". Embora isso seja verdade, é preciso dizer que você só pode usar o Linux no Docker. Se eu quiser configurar um executor de teste que exercite meu aplicativo em uma ampla variedade de configurações de ambiente (bancos de dados diferentes, versões php, back-end de cache etc.), eu posso fazer isso facilmente com contêineres de janela de encaixe. Mas não consigo ver se meu aplicativo será executado corretamente em um ambiente Windows IIS ou em BSD ou OSX.
A postagem está desatualizada. O Vagrant agora suporta o Docker como provedor. E existem alguns vídeos demonstrando como você pode usar o Vagrant e o Docker em uníssono no blog deles .
Sargas
86
Prefácio minha resposta admitindo que não tenho experiência com o Docker, a não ser como um observador ávido do que parece ser uma solução realmente interessante que está ganhando muita força.
Eu tenho uma quantidade razoável de experiência com o Vagrant e posso recomendá-lo. Certamente, é uma solução mais pesada em termos de VM, em vez de LXC. No entanto, descobri que um laptop decente (8 GB de RAM, CPU i5 / i7) não tem problemas ao executar uma VM usando o Vagrant / VirtualBox junto com as ferramentas de desenvolvimento.
Uma das melhores coisas do Vagrant é a integração com os scripts Puppet / Chef / shell para automatizar a configuração. Se você estiver usando uma dessas opções para configurar seu ambiente de produção, poderá criar um ambiente de desenvolvimento o mais próximo possível do idêntico, e é exatamente isso que você deseja.
A outra grande coisa do Vagrant é que você pode fazer a versão do seu arquivo Vagrant junto com o código do aplicativo. Isso significa que todos os outros membros da sua equipe podem compartilhar esse arquivo e você garante que todos estão trabalhando com a mesma configuração de ambiente.
Curiosamente, Vagrant e Docker podem realmente ser complementares. O Vagrant pode ser estendido para oferecer suporte a diferentes provedores de virtualização, e pode ser possível que o Docker seja um desses provedores que obtenha suporte em um futuro próximo. Consulte https://github.com/dotcloud/docker/issues/404 para obter uma discussão recente sobre o tópico.
O Docker não é virtualização, mas executa o sistema operacional dentro de seu próprio contêiner, usando o mesmo kernel do host, não é um provedor nem como outras VMs, portanto, o Docker já é suportado pelo Vagrant.
Aftab Naveed
1
Docker é a virtualização do próprio sistema operacional, reutilizando implicitamente o hardware subjacente. É virtualização, uma vez que abstrai e isola o sistema de arquivos, a rede e os processos em execução em um contêiner.
Jose.angel.jimenez
63
Eles são muito complementares.
Eu tenho usado uma combinação de VirtualBox, Vagrant e Docker para todos os meus projetos há vários meses e senti os seguintes benefícios.
No Vagrant, você pode eliminar completamente qualquer provisionamento individual do Chef e tudo o que você precisa para fazer o seu arquivo vagrant é preparar uma máquina que executa um único script de shell pequeno que instala o docker. Isso significa que meus arquivos Vagrant para cada projeto são quase idênticos e muito simples.
Agora, para obter todos os serviços necessários, eu tenho um script docker_start que se parece com isso
#!/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"
Neste exemplo, eu estou executando MongoDB, Elastisearch, RabbitMQ e Memcached
Uma configuração individual do Chef sem docker seria consideravelmente mais complicada.
Uma grande vantagem final é obtida quando você está entrando em produção, traduzindo o ambiente de desenvolvimento para uma infraestrutura de hosts que são todos iguais, pois eles só têm configuração suficiente para executar o docker, o que significa muito pouco trabalho.
Se você estiver interessado, tenho um artigo mais detalhado sobre o ambiente de desenvolvimento no meu próprio site em
Você fez toda essa orquestração docker_start, mas não se incomodou em vincular os contêineres. Você está apenas usando números de porta codificados porque está executando no Vagrant?
WineSoaked
6
Olá, WineSoaked, o exemplo acima não mostra o contêiner que realmente usa todos esses serviços. Se você olhar na postagem do blog mencionado, há outro script script / vagrant / docker_web que dispara o contêiner de desenvolvimento para o projeto. Isso de fato usa --link no comando docker run e o projeto Rails usa as variáveis de ambiente injetadas do docker para conectar-se aos serviços.
Mark Stratmann
1
Eu posso ver o potencial de mesclar ambos os produtos. Vagrant como teste de ambiente e docker para empacotador de aplicativos. Ao mesclar os dois, você pode testar um único aplicativo ou teste de unidade em vários cenários. Eu acho que muitos dos "serviços de plataformas de teste" estão usando o Vagrant + Docker no momento.
M3nda
8
"Eles são muito elogiosos." - Ambos são livres para usar, de fato.
Underyx
2
Olá, @koppor Eu usei a última janela de encaixe há cerca de três meses e ainda não voltei a usá-la. O problema que tive foi que havia um erro no compartilhamento de pastas do host do meu host MAC para a VM executando a janela de encaixe ao usar o driver VMWare. Isso significava que não era possível editar o código localmente no Mac e que as alterações eram refletidas no contêiner do Docker. Ainda não sei se o consertaram; quando o fizerem, mudarei de fato. Tenho no entanto ligado todo o meu recipiente orquestração para compor janela de encaixe desde escrevendo esta resposta
Mark Stratmann
53
O Vagrant-lxc é um plugin para o Vagrant que permite usar o LXC para provisionar o Vagrant. Ele não possui todos os recursos da VM vagrant padrão (VirtualBox), mas deve permitir mais flexibilidade do que os contêineres do docker. Há um vídeo no link mostrando seus recursos que vale a pena assistir.
Com o Vagrant agora você pode ter o Docker como provedor. http://docs.vagrantup.com/v2/docker/ . O provedor Docker pode ser usado em vez do VirtualBox ou VMware.
Isso significa que você pode substituir o Chef ou o Puppet pelo Docker. Você pode usar combinações como Docker como provedor (VM) com o Chef como provisionador. Ou você pode usar o VirtualBox como provedor e o Docker como provisionador.
mundo só fui louco;) podemos correr errante usando o provedor janela de encaixe para executar contentores Docker dentro vagabundo
Andrzej Rehmann
@zainengineer, o provedor do Docker para o Vagrant no Windows ainda usa o boot2docker ou usa alguma variante do Docker Toolbox?
Derek Mahar
@zainengineer Você tem alguns links para exemplos ilustrativos (documentos não vagabundos)?
Wlad
16
O uso de ambos é uma parte importante do teste de entrega de aplicativos. Estou apenas começando a me envolver com o Docker e pensando muito sobre uma equipe de aplicativos que tem uma complexidade terrível na criação e entrega de seu software. Pense em uma situação clássica do Projeto Phoenix / Entrega Contínua.
O pensamento é mais ou menos assim:
Pegue um componente de aplicativo Java / Go e construa-o como um contêiner (observe, não tenho certeza se o aplicativo deve ser construído no contêiner ou construído e instalado no contêiner)
Entregue o contêiner em uma VM Vagrant.
Repita isso para todos os componentes do aplicativo.
Iterar nos componentes contra os quais codificar.
Teste continuamente o mecanismo de entrega nas VMs gerenciadas pelo Vagrant
Durma bem sabendo que é hora de implantar o contêiner, que os testes de integração estavam ocorrendo de maneira muito mais contínua do que antes do Docker.
Esta parece ser a extensão lógica da afirmação de Mitchell de que o Vagrant é para desenvolvimento combinado com o pensamento de Farley / Humbles em Entrega Contínua. Se eu, como desenvolvedor, conseguir diminuir o ciclo de feedback nos testes de integração e na entrega de aplicativos, seguiremos uma melhor qualidade e melhores ambientes de trabalho.
O fato de que, como desenvolvedor, estou constantemente e consistentemente entregando contêineres à VM e testando o aplicativo de forma mais holística, significa que as liberações de produção serão ainda mais simplificadas.
Então, vejo o Vagrant evoluindo como uma maneira de aproveitar algumas das impressionantes consequências que o Docker terá na implantação de aplicativos.
por acaso você tem um post sobre isso? Já faz quase dois anos, como está indo? ainda está usando vagrant com docker ou apenas docker e docker-fleat / machine?
Andrzej Rehmann 30/03
A empresa em que eu trabalhava foi adquirida e eles retiraram todo o meu conteúdo @Hoto. A resposta curta é que eu uso a docker-machine em casa para meus projetos de animais de estimação. No trabalho, sou <gulp> gerente </gulp> e não faço muita tecnologia. Como não temos planos de usar o Docker, nossa ferramenta é geralmente o Vagrant.
Boyd Hemphill
10
Definitivamente Docker pela vitória!
Como você deve saber, o Vagrant é para gerenciamento de máquinas virtuais, enquanto o Docker é para gerenciamento de contêineres de software. Se você não estiver ciente da diferença, aqui está: Um contêiner de software pode compartilhar a mesma máquina e kernel com outros contêineres de software. Ao usar contêineres, você economiza dinheiro porque não desperdiça recursos em vários sistemas operacionais (kernels), você pode empacotar mais software por servidor, mantendo um bom grau de isolamento.
É claro que é uma nova disciplina para cuidar de seus próprios pitfals e desafios.
Escolha o Docker Swarm se seus requisitos ultrapassarem o limite de recursos de uma única máquina.
Há um artigo realmente informativo na revista Oracle Java real sobre o uso do Docker em combinação com o Vagrant (e o Puppet):
Conclusão
Os contêineres leves do Docker são mais rápidos em comparação com as VMs clássicas e se tornaram populares entre os desenvolvedores e como parte das iniciativas de CD e DevOps. Se seu objetivo é o isolamento, o Docker é uma excelente opção. O Vagrant é um gerenciador de VM que permite criar configurações de script de VMs individuais, bem como fazer o provisionamento. No entanto, ainda é uma VM dependente do VirtualBox (ou outro gerenciador de VM) com sobrecarga relativamente grande. Ele exige que você tenha um disco rígido ocioso que pode ser enorme, é preciso muita RAM e o desempenho pode ser abaixo do ideal. O Docker usa cgroups de kernel e isolamento de namespace via LXC. Isso significa que você está usando o mesmo kernel que o host e o mesmo sistema de arquivos. Vagrant é um nível acima do Docker em termos de abstração, portanto eles não são realmente comparáveis. Ferramentas de gerenciamento de configuração, como o Puppet, são amplamente usadas para provisionar ambientes de destino. Reutilizar soluções existentes baseadas em Puppet é fácil com o Docker. Você também pode dividir sua solução, para que a infraestrutura seja provisionada com o Puppet; o middleware, o próprio aplicativo de negócios ou ambos são fornecidos com o Docker; e o Docker é envolvido pelo Vagrant. Com essa gama de ferramentas, você pode fazer o melhor para o seu cenário.
Respostas:
Se seu objetivo é o isolamento, acho que Docker é o que você deseja.
O Vagrant é um gerenciador de máquinas virtuais. Ele permite que você script a configuração da máquina virtual, bem como o provisionamento. No entanto, ainda é uma máquina virtual, dependendo do VirtualBox (ou de outros) com uma enorme sobrecarga. Ele exige que você tenha um arquivo do disco rígido que pode ser enorme, que requer muita memória RAM e que o desempenho pode não ser muito bom.
O Docker, por outro lado, usa o kernel cgroup e o namespacing via LXC . Isso significa que você está usando o mesmo kernel que o host e o mesmo sistema de arquivos. Você pode usar o Dockerfile com o
docker build
comando para lidar com o provisionamento e a configuração do seu contêiner. Você tem um exemplo em docs.docker.com sobre como criar seu arquivo Docker; é muito intuitivo.A única razão pela qual você pode querer usar o Vagrant é se você precisa desenvolver BSD, Windows ou outro desenvolvimento não Linux na sua caixa do Ubuntu. Caso contrário, vá para o Docker.
fonte
Disclaimer: Eu escrevi Vagrant! Mas como eu escrevi o Vagrant, passo a maior parte do tempo vivendo no mundo do DevOps, que inclui software como o Docker. Eu trabalho com muitas empresas usando o Vagrant e muitas usam o Docker e vejo como as duas interagem.
Antes de falar demais, uma resposta direta: em seu cenário específico (você trabalhando sozinho, trabalhando no Linux, usando o Docker em produção), você pode ficar com o Docker sozinho e simplificar as coisas. Em muitos outros cenários (discuto mais adiante), não é tão fácil.
Não é correto comparar diretamente o Vagrant ao Docker. Em alguns cenários, eles se sobrepõem e, na grande maioria, não. Na verdade, a comparação mais adequada seria o Vagrant versus algo como o Boot2Docker (SO mínimo que pode executar o Docker). Vagrant é um nível acima do Docker em termos de abstrações, portanto, não é uma comparação justa na maioria dos casos.
O Vagrant lança coisas para executar aplicativos / serviços com o objetivo de desenvolvimento. Isso pode ser no VirtualBox, VMware. Pode ser remoto como AWS, OpenStack. Nessas, se você usar contêineres, o Vagrant não se importa e aceita isso: ele pode instalar, puxar, construir e executar automaticamente contêineres do Docker, por exemplo. Com o Vagrant 1.6, o Vagrant possui ambientes de desenvolvimento baseados no docker e suporta o uso do Docker com o mesmo fluxo de trabalho do Vagrant no Linux, Mac e Windows. O Vagrant não tenta substituir o Docker aqui, abrange as práticas do Docker.
O Docker executa especificamente contêineres do Docker. Se você estiver comparando diretamente com o Vagrant: é especificamente uma solução mais específica (só pode executar contêineres do Docker), menos flexível (requer host Linux ou Linux em algum lugar). Obviamente, se você está falando sobre produção ou IC, não há comparação com o Vagrant! O Vagrant não vive nesses ambientes e, portanto, o Docker deve ser usado.
Se sua organização executar apenas contêineres do Docker para todos os seus projetos e tiver apenas desenvolvedores em execução no Linux, tudo bem, o Docker definitivamente funcionará para você!
Caso contrário, não vejo benefício em tentar usar o Docker sozinho, pois você perde muito do que o Vagrant tem a oferecer, o que traz benefícios reais de negócios / produtividade:
O Vagrant pode iniciar máquinas VirtualBox, VMware, AWS, OpenStack, etc. Não importa o que você precisa, o Vagrant pode iniciá-lo. Se você estiver usando o Docker, o Vagrant poderá instalar o Docker em qualquer um deles, para que você possa usá-los para esse fim.
O Vagrant é um fluxo de trabalho único para todos os seus projetos. Ou, dito de outra maneira, é apenas uma coisa que as pessoas precisam aprender a executar um projeto, esteja ele em um contêiner do Docker ou não. Se, por exemplo, no futuro, um concorrente surgir para competir diretamente com o Docker, o Vagrant também poderá executá-lo.
O Vagrant funciona no Windows (volta ao XP), Mac (volta à 10.5) e Linux (volta ao kernel 2.6). Nos três casos, o fluxo de trabalho é o mesmo. Se você usa o Docker, o Vagrant pode iniciar uma máquina (VM ou remota) que possa executar o Docker nos três sistemas.
O Vagrant sabe como configurar algumas coisas avançadas ou não triviais, como rede e sincronização de pastas. Por exemplo: O Vagrant sabe como conectar um IP estático a uma máquina ou portas de encaminhamento, e a configuração é a mesma, independentemente do sistema que você usa (VirtualBox, VMware, etc.). Para pastas sincronizadas, o Vagrant fornece vários mecanismos para obter seu local arquivos para a máquina remota (pastas compartilhadas do VirtualBox, NFS, rsync, Samba [plugin], etc.). Se você estiver usando o Docker, mesmo o Docker com uma VM sem o Vagrant, você precisará fazer isso manualmente ou eles terão que reinventar o Vagrant nesse caso.
O Vagrant 1.6 possui suporte de primeira classe para ambientes de desenvolvimento baseados em docker . Isso não iniciará uma máquina virtual no Linux e iniciará automaticamente uma máquina virtual no Mac e Windows. O resultado final é que o trabalho com o Docker é uniforme em todas as plataformas, enquanto o Vagrant ainda lida com os detalhes tediosos de coisas como redes, pastas sincronizadas etc.
Para abordar contra-argumentos específicos que ouvi a favor do uso do Docker em vez do Vagrant:
"São menos partes móveis" - Sim, pode ser, se você usar o Docker exclusivamente para cada projeto. Mesmo assim, está sacrificando a flexibilidade do aprisionamento no Docker. Se você decidir não usar o Docker para qualquer projeto, passado, presente ou futuro, terá mais peças móveis. Se você já usou o Vagrant, tem uma parte móvel que suporta o resto.
"É mais rápido!" - Depois de ter o host que pode executar contêineres Linux, o Docker é definitivamente mais rápido em executar um contêiner do que qualquer máquina virtual seria lançada. Mas iniciar uma máquina virtual (ou máquina remota) é um custo único. Ao longo do dia, a maioria dos usuários do Vagrant nunca destrói sua VM. É uma otimização estranha para ambientes de desenvolvimento. Na produção, onde o Docker realmente brilha, entendo a necessidade de girar rapidamente os contêineres para cima / baixo.
Espero que agora fique claro que é muito difícil, e acredito que não correto, comparar o Docker ao Vagrant. Para ambientes de desenvolvimento, o Vagrant é mais abstrato, mais geral. O Docker (e as várias maneiras pelas quais você pode fazê-lo se comportar como o Vagrant) é um caso de uso específico do Vagrant, ignorando tudo o que o Vagrant tem a oferecer.
Concluindo: em casos de uso altamente específicos, o Docker é certamente um possível substituto para o Vagrant. Na maioria dos casos de uso, não é. O Vagrant não atrapalha o uso do Docker; na verdade, faz o que pode para tornar essa experiência mais suave. Se você acha que isso não é verdade, fico feliz em receber sugestões para melhorar as coisas, pois o objetivo do Vagrant é trabalhar igualmente bem com qualquer sistema.
Espero que isso esclareça as coisas!
fonte
vagrant provision
).Eu sou o autor de Docker.
A resposta curta é que, se você deseja gerenciar máquinas, deve usar o Vagrant. E se você deseja criar e executar ambientes de aplicativos, use o Docker.
O Vagrant é uma ferramenta para gerenciar máquinas virtuais. O Docker é uma ferramenta para criar e implantar aplicativos, empacotando-os em contêineres leves. Um contêiner pode conter praticamente qualquer componente de software junto com suas dependências (executáveis, bibliotecas, arquivos de configuração etc.) e executá-lo em um ambiente de tempo de execução garantido e repetível. Isso facilita muito a criação do seu aplicativo uma vez e a implantação em qualquer lugar - no laptop para teste e em servidores diferentes para implantação ao vivo etc.
É um equívoco comum que você só pode usar o Docker no Linux. Isso está incorreto; você também pode instalar o Docker no Mac e Windows. Quando instalado no Mac, o Docker empacota uma pequena VM do Linux (25 MB no disco!), Que atua como um invólucro para o seu contêiner. Uma vez instalado, isso é completamente transparente; você pode usar a linha de comando do Docker exatamente da mesma maneira. Isso oferece o melhor dos dois mundos: você pode testar e desenvolver seu aplicativo usando contêineres, que são muito leves, fáceis de testar e fáceis de mover (veja, por exemplo, https://hub.docker.com para compartilhar contêineres reutilizáveis com comunidade Docker) e você não precisa se preocupar com os detalhes básicos do gerenciamento de máquinas virtuais, que são apenas um meio para atingir um fim.
Em teoria, é possível usar o Vagrant como uma camada de abstração para o Docker. Eu recomendo isso por dois motivos:
Primeiro, o Vagrant não é uma boa abstração para o Docker. O Vagrant foi projetado para gerenciar máquinas virtuais. O Docker foi projetado para gerenciar um tempo de execução do aplicativo. Isso significa que o Docker, por design, pode interagir com um aplicativo de maneiras mais sofisticadas e ter mais informações sobre o tempo de execução do aplicativo. As primitivas no Docker são processos, fluxos de logs, variáveis de ambiente e links de rede entre componentes. As primitivas no Vagrant são máquinas, dispositivos de bloco e chaves ssh. O Vagrant simplesmente fica mais baixo na pilha, e a única maneira de interagir com um contêiner é fingir que é apenas mais um tipo de máquina: você pode "inicializar" e "entrar". Então, com certeza, você pode digitar "vagrant up" com um plug-in do Docker e algo bonito acontecerá. É um substituto para toda a amplitude do que o Docker pode fazer? Experimente o Docker nativo por alguns dias e veja você mesmo :)
Segundo, o argumento de bloqueio. "Se você usar o Vagrant como uma abstração, não será bloqueado no Docker!". Do ponto de vista do Vagrant, projetado para gerenciar máquinas, isso faz todo o sentido: os contêineres não são apenas outro tipo de máquina? Assim como o Amazon EC2 e o VMware, devemos ter cuidado para não vincular nossas ferramentas de provisionamento a nenhum fornecedor em particular! Isso criaria lock-in - melhor abstrair tudo isso com o Vagrant. Exceto que isso erra totalmente o objetivo do Docker. O Docker não provisiona máquinas; envolve seu aplicativo em um tempo de execução portátil leve, que pode ser descartado em qualquer lugar.
O tempo de execução que você escolhe para o seu aplicativo não tem nada a ver com o modo como você provisiona suas máquinas! Por exemplo, é bastante frequente implantar aplicativos em máquinas provisionadas por outra pessoa (por exemplo, uma instância do EC2 implantada pelo administrador do sistema, talvez usando o Vagrant) ou em máquinas bare metal que o Vagrant não pode provisionar. Por outro lado, você pode usar o Vagrant para provisionar máquinas que nada têm a ver com o desenvolvimento de seu aplicativo - por exemplo, uma caixa do Windows IIS pronta para usar ou algo assim. Ou você pode usar o Vagrant para provisionar máquinas para projetos que não usam o Docker - talvez eles usem uma combinação de rubygems e rvm para gerenciamento de dependências e sandbox, por exemplo.
Em resumo: o Vagrant é para gerenciar máquinas e o Docker é para criar e executar ambientes de aplicativos.
fonte
Prefácio minha resposta admitindo que não tenho experiência com o Docker, a não ser como um observador ávido do que parece ser uma solução realmente interessante que está ganhando muita força.
Eu tenho uma quantidade razoável de experiência com o Vagrant e posso recomendá-lo. Certamente, é uma solução mais pesada em termos de VM, em vez de LXC. No entanto, descobri que um laptop decente (8 GB de RAM, CPU i5 / i7) não tem problemas ao executar uma VM usando o Vagrant / VirtualBox junto com as ferramentas de desenvolvimento.
Uma das melhores coisas do Vagrant é a integração com os scripts Puppet / Chef / shell para automatizar a configuração. Se você estiver usando uma dessas opções para configurar seu ambiente de produção, poderá criar um ambiente de desenvolvimento o mais próximo possível do idêntico, e é exatamente isso que você deseja.
A outra grande coisa do Vagrant é que você pode fazer a versão do seu arquivo Vagrant junto com o código do aplicativo. Isso significa que todos os outros membros da sua equipe podem compartilhar esse arquivo e você garante que todos estão trabalhando com a mesma configuração de ambiente.
Curiosamente, Vagrant e Docker podem realmente ser complementares. O Vagrant pode ser estendido para oferecer suporte a diferentes provedores de virtualização, e pode ser possível que o Docker seja um desses provedores que obtenha suporte em um futuro próximo. Consulte https://github.com/dotcloud/docker/issues/404 para obter uma discussão recente sobre o tópico.
fonte
Eles são muito complementares.
Eu tenho usado uma combinação de VirtualBox, Vagrant e Docker para todos os meus projetos há vários meses e senti os seguintes benefícios.
No Vagrant, você pode eliminar completamente qualquer provisionamento individual do Chef e tudo o que você precisa para fazer o seu arquivo vagrant é preparar uma máquina que executa um único script de shell pequeno que instala o docker. Isso significa que meus arquivos Vagrant para cada projeto são quase idênticos e muito simples.
Aqui está um arquivo Vagrant típico
O arquivo Bootstrap que instala a janela de encaixe fica assim
Agora, para obter todos os serviços necessários, eu tenho um script docker_start que se parece com isso
Neste exemplo, eu estou executando MongoDB, Elastisearch, RabbitMQ e Memcached
Uma configuração individual do Chef sem docker seria consideravelmente mais complicada.
Uma grande vantagem final é obtida quando você está entrando em produção, traduzindo o ambiente de desenvolvimento para uma infraestrutura de hosts que são todos iguais, pois eles só têm configuração suficiente para executar o docker, o que significa muito pouco trabalho.
Se você estiver interessado, tenho um artigo mais detalhado sobre o ambiente de desenvolvimento no meu próprio site em
Implementando um ambiente de desenvolvimento Vagrant / Docker
fonte
O Vagrant-lxc é um plugin para o Vagrant que permite usar o LXC para provisionar o Vagrant. Ele não possui todos os recursos da VM vagrant padrão (VirtualBox), mas deve permitir mais flexibilidade do que os contêineres do docker. Há um vídeo no link mostrando seus recursos que vale a pena assistir.
fonte
Com o Vagrant agora você pode ter o Docker como provedor. http://docs.vagrantup.com/v2/docker/ . O provedor Docker pode ser usado em vez do VirtualBox ou VMware.
Observe que você também pode usar o Docker para provisionar com o Vagrant. Isso é muito diferente do que usar o Docker como provedor. http://docs.vagrantup.com/v2/provisioning/docker.html
Isso significa que você pode substituir o Chef ou o Puppet pelo Docker. Você pode usar combinações como Docker como provedor (VM) com o Chef como provisionador. Ou você pode usar o VirtualBox como provedor e o Docker como provisionador.
fonte
O uso de ambos é uma parte importante do teste de entrega de aplicativos. Estou apenas começando a me envolver com o Docker e pensando muito sobre uma equipe de aplicativos que tem uma complexidade terrível na criação e entrega de seu software. Pense em uma situação clássica do Projeto Phoenix / Entrega Contínua.
O pensamento é mais ou menos assim:
Esta parece ser a extensão lógica da afirmação de Mitchell de que o Vagrant é para desenvolvimento combinado com o pensamento de Farley / Humbles em Entrega Contínua. Se eu, como desenvolvedor, conseguir diminuir o ciclo de feedback nos testes de integração e na entrega de aplicativos, seguiremos uma melhor qualidade e melhores ambientes de trabalho.
O fato de que, como desenvolvedor, estou constantemente e consistentemente entregando contêineres à VM e testando o aplicativo de forma mais holística, significa que as liberações de produção serão ainda mais simplificadas.
Então, vejo o Vagrant evoluindo como uma maneira de aproveitar algumas das impressionantes consequências que o Docker terá na implantação de aplicativos.
fonte
Definitivamente Docker pela vitória!
Como você deve saber, o Vagrant é para gerenciamento de máquinas virtuais, enquanto o Docker é para gerenciamento de contêineres de software. Se você não estiver ciente da diferença, aqui está: Um contêiner de software pode compartilhar a mesma máquina e kernel com outros contêineres de software. Ao usar contêineres, você economiza dinheiro porque não desperdiça recursos em vários sistemas operacionais (kernels), você pode empacotar mais software por servidor, mantendo um bom grau de isolamento.
É claro que é uma nova disciplina para cuidar de seus próprios pitfals e desafios.
Escolha o Docker Swarm se seus requisitos ultrapassarem o limite de recursos de uma única máquina.
fonte
Há um artigo realmente informativo na revista Oracle Java real sobre o uso do Docker em combinação com o Vagrant (e o Puppet):
Conclusão
Como criar, usar e orquestrar contêineres do Docker no DevOps http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0
fonte