我使用Ubuntu进行开发和部署,需要创建一个独立的环境。
为此,我正在考虑Vagrant或Docker。优缺点是什么,或者这些解决方案如何比较?
我使用Ubuntu进行开发和部署,需要创建一个独立的环境。
为此,我正在考虑Vagrant或Docker。优缺点是什么,或者这些解决方案如何比较?
当前回答
我在回答的开头承认,除了作为一个狂热的观察者,我对Docker没有任何经验,因为它看起来是一个非常整洁的解决方案,并获得了很多关注。
我确实对Vagrant有相当丰富的经验,并强烈推荐它。就基于VM而不是基于LXC而言,它无疑是一个更重量级的解决方案。然而,我发现一台不错的笔记本电脑(8GB RAM,i5/i7 CPU)在使用Vagrant/VirtualBox和开发工具运行VM时没有问题。
Vagrant真正伟大的一点是与Puppet/Chef/shell脚本的集成,以实现自动配置。如果您使用这些选项之一来配置您的生产环境,那么您可以创建一个与您将要获得的几乎完全相同的开发环境,这正是您想要的。
Vagrant的另一个优点是,您可以将Vagrant文件与应用程序代码一起进行版本化。这意味着团队中的其他所有人都可以共享此文件,并且保证每个人都使用相同的环境配置。
有趣的是,Vagrant和Docker实际上可能是互补的。Vagrant可以扩展到支持不同的虚拟化提供商,Docker可能就是其中一个在不久的将来获得支持的提供商。看见https://github.com/dotcloud/docker/issues/404最近关于该主题的讨论。
其他回答
Vagrant lxc是Vagrant的一个插件,让您使用lxc来提供Vagrant。它没有默认流浪VM(VirtualBox)所具有的所有功能,但它应该比docker容器更灵活。链接中有一段视频显示了它的功能,值得观看。
现在使用Vagrant,您可以将Docker作为提供者。http://docs.vagrantup.com/v2/docker/.Docker提供程序可以用来代替VirtualBox或VMware。
请注意,您也可以使用Docker为Vagrant提供资源。这与使用Docker作为提供者非常不同。http://docs.vagrantup.com/v2/provisioning/docker.html
这意味着你可以用Docker代替Chef或Puppet。您可以使用Docker作为提供者(VM)和Chef作为提供者的组合。或者您可以使用VirtualBox作为提供程序,Docker作为提供程序。
它们非常互补。
几个月来,我一直在所有项目中使用VirtualBox、Vagrant和Docker的组合,并强烈感受到以下好处。
在Vagrant中,您可以完全取消任何Chef单独提供,您所需要的流浪文件只需准备一台运行安装docker的小型shell脚本的机器。这意味着我的每个项目的Vagrant文件几乎都是相同的,而且非常简单。
这是一个典型的流浪汉档案
# -*- 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
安装docker的Bootstrap文件如下
#!/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
现在,为了获得我需要运行的所有服务,我有一个docker_start脚本,看起来像这样
#!/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"
在本例中,我运行MongoDB、Elastisearch、RabbitMQ和Memcached
非码头厨师的单人配置将更加复杂。
当您进入生产环境时,将开发环境转换为主机的基础设施,因为它们只有足够的配置来运行docker,这意味着几乎没有什么工作。
如果你感兴趣,我在自己的网站上有一篇关于开发环境的更详细的文章
实现Vagrant/Docker开发环境
我在回答的开头承认,除了作为一个狂热的观察者,我对Docker没有任何经验,因为它看起来是一个非常整洁的解决方案,并获得了很多关注。
我确实对Vagrant有相当丰富的经验,并强烈推荐它。就基于VM而不是基于LXC而言,它无疑是一个更重量级的解决方案。然而,我发现一台不错的笔记本电脑(8GB RAM,i5/i7 CPU)在使用Vagrant/VirtualBox和开发工具运行VM时没有问题。
Vagrant真正伟大的一点是与Puppet/Chef/shell脚本的集成,以实现自动配置。如果您使用这些选项之一来配置您的生产环境,那么您可以创建一个与您将要获得的几乎完全相同的开发环境,这正是您想要的。
Vagrant的另一个优点是,您可以将Vagrant文件与应用程序代码一起进行版本化。这意味着团队中的其他所有人都可以共享此文件,并且保证每个人都使用相同的环境配置。
有趣的是,Vagrant和Docker实际上可能是互补的。Vagrant可以扩展到支持不同的虚拟化提供商,Docker可能就是其中一个在不久的将来获得支持的提供商。看见https://github.com/dotcloud/docker/issues/404最近关于该主题的讨论。
如果你的目的是隔离,我认为Docker就是你想要的。
Vagrant是一个虚拟机管理器。它允许您编写虚拟机配置以及资源调配的脚本。然而,它仍然是一个依赖VirtualBox(或其他)的虚拟机,开销巨大。它需要你有一个巨大的硬盘文件,它需要很多内存,而且性能可能不是很好。
另一方面,Docker通过LXC使用内核cgroup和命名空间。这意味着您正在使用与主机相同的内核和相同的文件系统。您可以将Dockerfile与docker build命令一起使用,以便处理容器的供应和配置。你在docs.docker.com上有一个关于如何制作Dockerfile的示例;这是非常直观的。
如果您需要在Ubuntu上进行BSD、Windows或其他非Linux开发,那么您可以使用Vagrant。否则,去找Docker。