标题 2019-06-28
Vagrant 实际上一套虚拟机管理工具,基于 Ruby 开发,底层支持 VirtualBox、VMware 甚至 AWS、Docker 等作为虚拟化系统。我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,“代码在我机子上运行没有问题”这种说法将成为历史。
Vagrant 本身并没有能力创建虚拟机,它是调用一些虚拟化工具来创建,如 VirtualBox, VMWare,甚至 AWS。
Vagrant
直接使用的虚拟机镜像文件box
是不一样的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
文件拿到其他计算机上配置即可使用。
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