Vagrant (四) - Box 的用法

Box 是一個 bundle 或者 package,它將一臺虛擬機所須要的一切設施捆綁到一個單一的、可交換的文件之中,從而提供了分享的便利。html

從這一點上說,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,那就已經不在這個問題討論範圍內了。docker

本身的box

打包 VM 爲 box

通常的用法是:windows

vagrant package --base dos7bc31 --output dos7bc31.box

在這裏,你首先在VirtualBox中製做了一個名爲 dos7bc31 的虛擬機,而且在虛擬機中搭建了 DOS 7.1的環境和安裝了 Borland C++ 3.1,而後發佈此命令就能獲得一個 box 文件了:ruby

$ 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 在當前的空文件夾中建議一份。bash

分發 box

LAN中,直接傳輸 box 給他人便可。less

你也能夠考慮發佈 box 到公共目錄中。ide

使用 box

對於一個本地的 box 文件,能夠這樣添加它:fetch

vagrant box add --name hedzr/dos71bc31 ./dos71bc31.box

而後就能夠初始化相應的實例了:ui

mkdir test && cd test1
vagrant init hedzr/doc71bc31
vagrant up

迭代

當發佈了你的box的新版本以後,接收人須要更新它。對於本地的 box 文件,更新的方法是:this

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 包括:

  1. box 中自帶的
  2. 你在 ~/.vagrant.d/ 中自定義的一個 Vagrantfile
  3. 你的當前虛擬機的 Vagrantfile。當 vagrant init 時,此文件還沒有存在故略過,當 vagrant up 時它會被檢視,並根據實際狀況去修訂虛擬機
  4. 若是存在 Multi-machine overrides
  5. 若是存在 Provider-specific overrides

能夠參考:Load Order and Merging

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: https://stackoverflow.com/a/2...

不過我以爲多餘。至於我列舉的緣由呢,只是展現一種使用環境變量的方法,它能夠被用於自行裝配和分發 box。

相關文章
相關標籤/搜索