Vagrant 实际上一套虚拟机管理工具,基于 Ruby 开发,底层支持 VirtualBox、VMware 甚至 AWS、Docker 等做为虚拟化系统。咱们能够经过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员能够在本身喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,“代码在我机子上运行没有问题”这种说法将成为历史。linux
Vagrant 自己并无能力建立虚拟机,它是调用一些虚拟化工具来建立,如 VirtualBox, VMWare,甚至 AWS。ios
Vagrant
直接使用的虚拟机镜像文件box
是不同的vagrant 支持在线安装,可是鉴于 GFW 的缘由,国内用户使用的时候最好先在 http://www.vagrantbox.es 下载好要使用的 box
在本地安装nginx
# vagrant box 放在 ~/precise64.box $ mkdir vagrant && cd vagrant $ vagrant box add base ~/precise64.box $ vagrant init (boxname)
base
是box
的名称,能够是任意的字符串,base
是默认名称,主要用来标识一下你添加的 box
,后面的命令都是基于这个标识来操做的。docker
$ vim Vagrnatfile
端口映射shell
config.vm.network “forwarded_port", guest: 80, host: 8080 guest: 80 表示虚拟机中的80端口, host: 8080 表示映射到宿主机的8080端口
__私有网络__(等效于设置virtualbox使用host-only模式网络适配器),本身自由的访问虚拟机,可是别人不须要访问虚拟机apache
config.vm.network “private_network", ip: "192.168.33.10" 192.168.33.10 表示虚拟机的IP,多台虚拟机的话须要互相访问的话,设置在相同网段便可
__公有网络__(等效于设置virtualbox使用bridged模式网络适配器),若是须要将虚拟机做为当前局域网中的一台计算机,由局域网进行DHCPvim
config.vm.network “public_network"
将本地的目录映射到虚拟机的对应目录,能够同时映射多个目录windows
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
文件拿到其余计算机上配置便可使用。
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