整個Vagrant系列,已經有四篇文章了:
好,正文開始:
Box 是一個 bundle 或者 package,它將一臺虛擬機器所需要的一切設施捆綁到一個單一的、可交換的檔案之中,從而提供了分享的便利。
從這一點上說,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,那就已經不在這個問題討論範圍內了。
自己的box
打包 VM 為 box
一般的用法是:
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
在當前的空資料夾中建議一份。
分發 box
LAN中,直接傳輸 box 給他人即可。
你也可以考慮釋出 box 到公共目錄中。
使用 box
對於一個本地的 box 檔案,可以這樣新增它:
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
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
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 loader
按照官方的說法,Vagrantfile能夠被合併。
這就是說,當你通過 vagrant init
建立了一個新的虛擬機器環境時,vagrant將會一次檢查一系列的可用的 Vagrantfile 並將它們合併到最終為你生成的 Vagrantfile
中。而當 vagrant up
當前虛擬機器時,vagrant同樣會檢查這一系列可用的 Vagrantfile,並依據有否變更或虛擬機器有否不符等實際情況對真實的虛擬機器進行配置修訂。
這些可用的 Vagrantfile 包括:
-
box 中自帶的
-
你在 ~/.vagrant.d/ 中自定義的一個 Vagrantfile
-
你的當前虛擬機器的 Vagrantfile。當
vagrant init
時,此檔案尚未存在故略過,當vagrant up
時它會被檢視,並根據實際情況去修訂虛擬機器
GUI模式
有多種方法啟用或禁用 虛擬機器的 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。