整个Vagrant系列,已经有四篇文章了:html
好,正文开始:docker
Box 是一个 bundle 或者 package,它将一台虚拟机所须要的一切设施捆绑到一个单一的、可交换的文件之中,从而提供了分享的便利。windows
从这一点上说,Box 和 OVF 是同样的东西。不过 OVF 是具备公信力的标准格式,而 Box 则是 Vagrant 的私有格式。因此人们难免疑问既然如此、岂非我仍是去 VMWare/VirtualBox 中导出 ovf 格式的比较好吧?事实上又并不是这么简单,就好像 Microsoft Office 也是私有格式同样,它仍是通行于全球。因此,通常地看,为着分享一个极为有效的基础设施的目的,你可能仍是须要经过 Vagrant Box 特性创建你的基础设施的 VirtualBox/VMWare/KVM/Hyper-V 分发包,才能真的让世界上的其它人或许感谢你的友好;而若是你只是临时给LAN中某我的传递一个snapshot的话,就ovf好了;若是你的 team 统一使用 vagrant 为开发容器环境的话,那固然仍是 box 了;若是你的 team 主力使用 docker,那就已经不在这个问题讨论范围内了。ruby
通常的用法是:bash
vagrant package --base dos7bc31 --output dos7bc31.box
复制代码
在这里,你首先在VirtualBox中制做了一个名为 dos7bc31 的虚拟机,而且在虚拟机中搭建了 DOS 7.1的环境和安装了 Borland C++ 3.1,而后发布此命令就能获得一个 box 文件了:网络
$ vagrant package --base dos71bc31 --output dos71bc31.box
==> dos7bc31: Exporting VM...
==> dos7bc31: Compressing package to: /Users/hz/vmt/dos7/dos71bc31.box
$ ll
total 113784
-rw-r--r-- 1 hz staff 3.0K Feb 21 10:05 Vagrantfile
-rw-r--r--@ 1 hz staff 55M Feb 21 10:08 dos71bc31.box
复制代码
固然,你须要为那个虚拟机准备一份 Vagrantfile,这能够用 vagrant init
在当前的空文件夹中建议一份。less
LAN中,直接传输 box 给他人便可。ide
你也能够考虑发布 box 到公共目录中。post
对于一个本地的 box 文件,能够这样添加它:fetch
vagrant box add --name hedzr/dos71bc31 ./dos71bc31.box
复制代码
而后就能够初始化相应的实例了:
mkdir test && cd test1
vagrant init hedzr/doc71bc31
vagrant up
复制代码
当发布了你的box的新版本以后,接收人须要更新它。对于本地的 box 文件,更新的方法是:
vagrant box add -f --name hedzr/dos72bc31 './dos71bc31 (1).box'
复制代码
若是发布者在构建 box 时正确地进行了 config.vm.box_version
的管理的话,则 -f
标志没必要使用。
相关的 vagrant 命令参考以下:
package
命令用于从虚拟机提供商(例如 virtualbox)环境中已经建立了虚拟机实例中打包一个 .box 可交换文件出来。
Usage: vagrant package [options] [name|id]
Options:
--base NAME Name of a VM in VirtualBox to package as a base box (VirtualBox Only)
--output NAME Name of the file to output
--include FILE,FILE.. Comma separated additional files to package with the box
--vagrantfile FILE Vagrantfile to package with the box
-h, --help Print this help
复制代码
box 包含一组子命令:add,list,outdated,prune,remove,repackage,update。
命令 | 描述 |
---|---|
add | 添加 box(从文件、url、短名字)到 vagrant boxes管理区,必要时自动下载它 |
list | 列出 vagrant boxes 管理区中已有的本地 boxes |
outdated | 检查本地 boxes 的时效性,有否新版本存在 |
prune | 删除本地 boxes 的旧版本,仅保留最新的一个版本 |
remove | 删除一个本地 box |
repackage | 从新打包一个本地 box,这多用于本地建立新box的过程当中 |
update | 更新一个本地 box,从远程来源 |
你能够经过 vagrant box add --help
来获取相应的命令行参数参考。或者检查官网:Box。
为免填充字数只说,这里再也不罗列了。
cd dos71bc31
vagrant package --base dos71bc31 --output dos71bc31.box --vagrantfile
vagrant box add -f --name hedzr/dos71bc31 dos71bc31.box
mkdir test1 && cd test1
vagrant init hedzr/dos71bc31
vagrant up
# shutdown VM from virtualbox ...
vagrant destroy -f
cd -
vagrant box remove hedzr/dos71bc31 -f
复制代码
按照官方的说法,Vagrantfile可以被合并。
这就是说,当你经过 vagrant init
创建了一个新的虚拟机环境时,vagrant将会一次检查一系列的可用的 Vagrantfile 并将它们合并到最终为你生成的 Vagrantfile
中。而当 vagrant up
当前虚拟机时,vagrant一样会检查这一系列可用的 Vagrantfile,并依据有否变动或虚拟机有否不符等实际状况对真实的虚拟机进行配置修订。
这些可用的 Vagrantfile 包括:
box 中自带的
你在 ~/.vagrant.d/ 中自定义的一个 Vagrantfile
你的当前虚拟机的 Vagrantfile。当 vagrant init
时,此文件还没有存在故略过,当 vagrant up
时它会被检视,并根据实际状况去修订虚拟机
有多种方法启用或禁用 虚拟机的 GUI 界面。
直接经过命令行:
vagrant up --gui
vagrant up --headless
复制代码
修改 Vagrantfile
配置文件:
config.vm.provider "virtualbox" do |v|
v.gui = true
end
复制代码
对于大多数基于 Linux Server 的虚拟机来讲,乃至于 vagrant 默认状况下,一个虚拟机老是被启动于 headless 无界面模式的。
不过即便这样,你仍是能够在 VirtualBox应用程序界面中双击虚拟机缩略图或者经过虚拟机子菜单显示其 gui 界面。
有人曾钻研过这个问题,列出了一个更奇技的方法来方便你指定GUI模式与否。其方法是修改Vagrantfile加入以下片断:
# Returns true if `GUI` environment variable is set to a non-empty value.
# Defaults to false
def gui_enabled?
!ENV.fetch('GUI', '').empty?
end
Vagrant.configure('2') do |config|
config.vm.provider 'virtualbox' do |v|
v.gui = gui_enabled?
end
end
复制代码
而后你就能够这样来执行命令:
# for *nix system
GUI=1 vagrant up # gui mode
vagrant up # -headless mode
# for windows
SET GUI=1
vagrant up
复制代码
See also: stackoverflow.com/a/23929641/…
不过我以为多余。至于我列举的缘由呢,只是展现一种使用环境变量的方法,它能够被用于自行装配和分发 box。