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