Vagrant 实际上一套虚拟机管理工具,基于 Ruby 开发,底层支持 VirtualBox、VMware 甚至 AWS、Docker 等作为虚拟化系统。我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,“代码在我机子上运行没有问题”这种说法将成为历史。
Vagrant 本身并没有能力创建虚拟机,它是调用一些虚拟化工具来创建,如 VirtualBox, VMWare,甚至 AWS。
box
- 可被
Vagrant
直接使用的虚拟机镜像文件 - 基于不同虚拟化技术打包的
box
是不一样的 - http://www.vagrantbox.es
安装
vagrant 支持在线安装,但是鉴于 GFW 的原因,国内用户使用的时候最好先在 http://www.vagrantbox.es 下载好要使用的 box
在本地安装
# vagrant box 放在 ~/precise64.box
$ mkdir vagrant && cd vagrant
$ vagrant box add base ~/precise64.box
$ vagrant init (boxname)
base
是box
的名称,可以是任意的字符串,base
是默认名称,主要用来标识一下你添加的 box
,后面的命令都是基于这个标识来操作的。
配置
$ vim Vagrnatfile
网络模式
-
端口映射
config.vm.network “forwarded_port", guest: 80, host: 8080 guest: 80 表示虚拟机中的80端口, host: 8080 表示映射到宿主机的8080端口
-
__私有网络__(等效于设置virtualbox使用host-only模式网络适配器),自己自由的访问虚拟机,但是别人不需要访问虚拟机
config.vm.network “private_network", ip: "192.168.33.10" 192.168.33.10 表示虚拟机的IP,多台虚拟机的话需要互相访问的话,设置在相同网段即可
-
__公有网络__(等效于设置virtualbox使用bridged模式网络适配器),如果需要将虚拟机作为当前局域网中的一台计算机,由局域网进行DHCP
config.vm.network “public_network"
目录映射
将本地的目录映射到虚拟机的对应目录,可以同时映射多个目录
config.vm.synced_folder "/Users/wangkun/www", "/vagrant_data"
前边的参数是本地目录,后边是映射目录
系统会自动映射宿主机当前目录到虚拟机根目录的 /vagrant
在该虚拟机上进行rm -rf
操作的时候请谨慎一些,因为在虚拟机中最少也会挂载/vagrant目录,该目录是与你主机的项目共享的,删除的话会将项目删除掉。
启动脚本(非必须)
如果有需要在启动时运行一些脚本,可以编辑脚本,类似如下(摘自 Vagrant Document):
#!/usr/bin/env bash
$ apt-get update
$ apt-get install -y apache2
$ rm -rf /var/www
$ ln -fs /vagrant /var/www
保存在和Vagrantfile
相同目录,文件名自取(如 boot.sh
),然后在Vagrantfile
中添加:
config.vm.provision :shell, :path => "boot.sh"
其他设置
设定VM的名称和内存大小等等
config.vm.provider "virtualbox" do |vb|
vb.customize ["modifyvm", :id,
"--name", "dev",
"--cpus", "1",
"--memory", "512"]
end
这行设置的意思是调用VBoxManage
的modifyvm
的命令,设置VM
的名称为dev
,cpu
为1个核心,内存为512MB。你可以类似的通过定制其它VM
属性来定制你自己的VM
启动并使用
$ vagrant up
$ vagrant ssh
os x
和 linux
下可以直接使用这个命令登录,windows
下需要第三方软件支持,win10
正式版PowerShell
也将支持 SSH
常用命令
# 启动虚拟机
$ vagrant up
# 关闭虚拟机——对应就是关机
$ vagrant halt
# 重新加载配置文件并启动,不会执行启动脚本
$ vagrant reload
# 重新加载配置文件并启动,强制执行启动脚本
$ vagrant reload --provision
# 暂停虚拟机——只是暂停,虚拟机内存等信息将以状态文件的方式保存在本地,可以执行恢复操作后继续使用
$ vagrant suspend
# 恢复虚拟机 —— 与前面的暂停相对应
$ vagrant resume
# 删除虚拟机,删除后在当前虚拟机所做进行的除 Vagrantfile 中的配置都不会保留
$ vagrant destroy
# 可以看到虚拟机的状态,这个状态是被缓存起来的,可能不一定准确
$ vagrant global-status
# 刷新状态
$ vagrant global-status --prune
# 显示box列表
$ vagrant box list
打包
$ vagrant package --output NAME --vagrantfile FILE
可选参数:
--output NAME : (可选)设置通过 NAME 来指定输出的文件名
--vagrantfile FILE:(可选)可以将 Vagrantfile 直接封进 box 中
注:如果网络模式中使用 private_network 的话,在打包之前需要清除一下private_network的设置,避免不必要的错误:
sudo rm -f /etc/udev/rule.d/70-persistent-net.rules
制作完成之后直接将box
文件拿到其他计算机上配置即可使用。
多个VM的配置和启动
vagrant
支持在一个Vagrantfile
中配置多个VM
单个 Vagrantfile
- 各个
VM
的配置和启动都相对独立,如vagrant ssh
时可不指定VM
名。 -
Vagrantfile
也不至于常常要改
多个 Vagrantfile
- 一个
Vagrantfile
收录了整个大环境中所有VM
的基本配置,一眼就知道环境里共有哪些VM
,也不需要切换目录来检查各VM
的状态,跟不会搞混了目录“丢掉”哪个倒霉的VM
。 - 更多地使用
Chef/Puppet
来配置各VM
,比如把VM
的ip
配置从Vagrantfile
后推到puppet
进行,保持Vagrantfile
的简洁。目的是在对本地环境的VM
配置,甚至生产环境的节点配置上,保持较高的一致性,有利于统一部署方式。
注意事项
-
vagrant
启动报错的时候尝试用VirtualBox
启动,可能会直接弹出VT-x is disabled in the BIOS. (VERR_VMX_MSR_VMXON_DISABLED)
这个错误,这是因为没有开启宿主机的虚拟化,重启宿主机进入bios
,开启virtualiation
选项即可 -
HTTP
服务器静态资源缓存问题,这个我没遇到//nginx sendfile off; //apache EnableSendfile off
-
Vagrant 默认启动超时时间是300S,如果启动超时可以配置
config.vm.boot_timeout = 1000
Vagrant 和 Docker 的区别
Vagrant
- Vagrant 用来构建并运行基于 lxc(内核虚拟化技术) 的虚拟 Linux 容器
- 易于配置、可量产、并且可移植的工作环境,并且由一个统一的工作流程进行控制
- 在硬件级别分配资源,支持部署 Linux,Unix,Windows
- 启动较 Docker 稍慢一些
- 有点笨重,但是仍然比完整的虚拟机来得好,其他有点:同时支持和一些配置工具(如 Puppet,Chef)集成
Docker
- Docker 基于 Linux 虚拟机的虚拟环境(Virtual Environment)工具。
- 在软件级别分配资源,支持部署 Linux,Unix,Windows
- 启动只需几秒钟,所创建的虚拟机的隔离级别和安全性:部分
- 轻量级,其他有点:快速,易于学习
- Vagrant 现在也具有一个 Docker 提供商,因此您可以用 Vagrant 来管理 Docker 的构建和部署
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。