Vagrant 基礎全面解析

這篇 Vagrant 入門文章將帶你建立一個 Vagrant 項目,這個過程將會用到 Vagrant 所提供的主要基本特性。若是想了解 Vagrant 能爲你帶來哪些好處,能夠閱讀 Vagrant 官網文檔的  "Why Vagrant?" 部分。html

Vagrantweb

Vagrant 是一個管理虛擬主機生命週期的命令行工具。本文旨在從上到下對 Vagrant 各個特性進行全面講解,儘量多的涵蓋細節。若是你只是想入門 Vagrant ,那麼本文是一個很是好的開始。shell

本文將會使用到 VirtualBox,由於它在各個主要的操做系統平臺上都是免費的,而且已集成到 Vagrant 中。不過,在讀完文檔後,請不要忘記 Vagrant 還能夠配合不少其餘虛擬機平臺一塊兒工做。apache

在深刻第一個 Vagrant 項目以前,請安裝最新版本的 Vagrant ,而且安裝好 VirtualBox,由於後續環節咱們會把 VirtualBox 做爲咱們的 provider 進行主要講解。bootstrap

若是你更喜歡閱讀紙質書本, 《Vagrant: Up and Running》 多是一個不錯的選擇,該書已在 O'Reilly 出版,其做者正是 Vagrant 的做者。ubuntu

#1 - UP AND RUNNING

$ vagrant init hashicorp/precise64
$ vagrant up

運行上面兩條命令後,一個基於 VirtualBox 的虛擬主機(Ubuntu12.04 LTS 64-bit)將運行起來。你能夠經過 vagrant ssh 命令以 SSH 的形式登陸到虛擬主機,處理完你的工做後,可經過`vagrant destroy` 命令終止虛擬主機運行。瀏覽器

如今,想象一下你的每個項目都可以如此容易的創建!在 Vagrant 中,只需執行一條 `vagrant up` 命令,項目依賴安裝、網絡配置、文件夾同步等工做都會準備完成。你能夠很是方便的基於你的物理機進行工做。bash

本文的其他部分將經過引導您創建一個比較完整的項目,來介紹更多 Vagrant 特性。服務器

#2 - PROJECT SETUP

要配置一個 Vagrant 項目,首先需建立 Vagrantfile 文件,Vagrantfile 文件所在目錄就是項目根目錄:網絡

1. 記下你的項目根目錄。許多 Vagrant 配置選項都是相對於這個根目錄的。
1. 描述運行項目所需的機器和資源,以及要安裝什麼軟件和如何訪問它。

Vagrant 內置了初始化文件夾爲 Vagrant 項目的命令 vagrant init 。在命令行執行下列命令:

$ mkdir vagrant_getting_started
$ cd vagrant_getting_started
$ vagrant init

上述命令將在當前工做目錄中生成一個 Vagrantfile 文件。你能夠打開該文件看一看,裏面有一些被註釋掉的案例。不要懼怕,若是看起來很嚇人,咱們會很快修改[引用官方原話]。你也能夠在一個已存在的目錄中運行 vagrant init,將其初始化爲 vagrant 項目。

若是你使用版本控制,vagrantfile 可以使你很是方便的對項目進行版本控制。這樣,你團對中的每一個人均可以在無需前期準備的狀況下快速部署開發環境。

#3 - BOXES

從頭開始建立虛擬機,是一個緩慢和繁瑣的過程,Vagrant 利用鏡像(image)克隆虛擬機。這些基本的鏡像在 Vagrant 中被稱爲 boxes ,建立完 vagrantfile 後的第一步,就是指定你的 Vagrant 環境要使用的 box。

3.1. INSTALLING A BOX

若是你成功執行過下面命令(上面的UP AND RUNNING章節有提到)

$ vagrant init hashicorp/precise64
$ vagrant up

那麼你就已經安裝了一個 box,而且你不須要再次執行下面的命令。然而,這一小節仍然值一讀,這能讓你瞭解到更多關於 Vagrant box 方面的知識。

使用 vagrant box add 能夠添加一個 box 到 Vagrant,這將存儲 box 在特定的名稱下,以便於多個 Vagrant 環境重複使用。若是你沒有添加過任何 box 到 Vagrant,你能夠執行下面的命令:

$ vagrant box add hashicorp/precise64

上述命令將會從 https://atlas.hashicorp.com/boxes/search 下載一個名爲 hashicorp/precise64 的 box 。固然,這是最簡單的下載 box 的方式,你也能夠從一個本地文件或自定義路徑添加 box。

boxes 被全局的存儲在當前用戶名下,每一個項目都可以經過克隆 box 鏡像的方式使用 box,而且不會修全局的 box。這意味着,若是你有兩個項目同時使用了名爲 hashicorp/precise64 的 box,咱們在其中一個 Vgrant 項目的虛擬機中添加文件,徹底不會影響到另外一個。

經過上面的命令,你可能已經注意到,box 的名字是有命名空間的。box 名稱由兩部分組成,分別是用戶名和 box 名,二者之間由斜槓 '/' 分隔。在上面的案例中,用戶名是`hashicorp`,box 名是'precise64'。你也能夠經過URL或本地文件路徑指定 box,可是,在這篇入門文章中咱們不會具體到這一部分。

3.2. USING A BOX

如今 box 已經被添加進 Vagrant 了,須要配置咱們的項目以使用它。打開 vagrantfile 並修改內容以下:

Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
end

上述代碼,`hashicorp/precise64`必須與你上一步添加的 box 名稱一致。Vagrant 將經過該配置肯定應該使用哪一個 box。若是指定 box 在以前沒有被添加到 Vagrant,當 Vagrant 運行時 Vagrant 將自動聯網下載並添加他們。

你還能夠經過 `config.vm.box_version` 配置明確的指定一個 box 版本: 

Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
config.vm.box_version = "1.1.0"
end

你也能夠經過`config.vm.box_url`配置直接指定 box 的 URL:

Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
end

在下一節,咱們會啓動並運行 Vagrant ,同時還會對它進行一些基本的操做。

3.3. FINDING MORE BOXES

該文檔的剩餘部分,咱們只會用到 "hashicorp/precise64" 這個 box。可是在結束這個文檔以後,你的第一個問題多是 "哪裏能夠找到更多的box?」

最好的查找 box 資源的地方是 https://atlas.hashicorp.com/boxes/search 。除了使用免費的 box,你也能夠經過 hashicORP‘s 發佈本身的 box。

#4 - UP AND SSH

是時候啓動你的第一個 Vagrant 環境了,在命令行執行下述命令:

$ vagrant up

很快,這個命令將會執行完畢,執行完畢後,你便擁有了一個運行 ubuntu 的虛擬主機。如今,你可能不會看到任何東西,由於 Vagrant 運行的這個虛擬主機並不包含 UI,可是,你能夠經過 SSH 登陸到該主機。

$ vagrant ssh

這將使你與虛擬機建立一個 SSH 連接,你能夠在該虛擬機中執行任何你須要的操做。這看上去很是完美,可是請謹慎操做 `rm -rf /` 命令,由於 Vagrant 共享了一個 '/vagrant' 目錄,其和你主機上的 Vagrantfile 文件所在位置是同一個目錄。 rm -rf / 將會刪除全部的文件。共享目錄的概述咱們將在下一節仔細講解。

如今,花一點時間思考一下剛纔發生了什麼事:只有一行的配置和一條在你命令行終端執行的命令,咱們便擁有了一個全功能的,SSH可訪問的虛擬主機。

SSH 會話能夠用 Ctrl + D 終止。

vagrant@precise64:~$ logout
Connection to 127.0.0.1 closed.

當執行完你須要的操做後,運行 `Vagrant destroy` 可終止虛擬機運行,並釋放虛擬機所佔用的資源。

#5 - SYNCED FOLDERS

這真是太酷了, 使用 Vagrant 建立一個虛擬主機是如此的簡單。不過,沒有多少人願意經過 SSH 在命令行終端裏編寫代碼。幸運的是,在 Vagrant 中你不須要這樣,Vagrant 提供了共享目錄同步機制,它會自動同步主機共享目錄中的文件到虛擬機中。

默認狀況下,Vagrant 會共享你的項目目錄(Vagrantfile文件的所在目錄)到虛擬機的 `/vagrant` 目錄中。

須要注意的是,當你經過 `vagrant ssh` 連接到虛擬主機時,你是在 `/home/vagrant` 目錄中,該目錄和上面提到的  '/vagrant' 不是同一個位置。

若是登錄過程當中顯示了一些錯誤,你可能須要更新你的 box 或者從新選擇一個 box,一些用戶經過 vagrant-vbguest 來處理該問題,不過這不是 vagrant 核心團隊官方支持的。

再次運行 `vagrant up`,並 SSH 登錄你的主機能夠看到:

$ vagrant up
...
$ vagrant ssh
...
vagrant@precise64:~$ ls /vagrant
Vagrantfile

不管你信或不信,這個你看到的在虛擬主機裏的 Vagrantfile 文件,實際上就是你的真實主機上的 Vagrantfile 文件。繼續並新建一個文件:

vagrant@precise64:~$ touch /vagrant/foo
vagrant@precise64:~$ exit
$ ls
foo Vagrantfile

如今 'foo' 文件已經在你的主機上了,如你所見,Vagrant 會確保共享目錄同步。經過 SYNCED FOLDERS ,你能夠繼續在你的主機上使用你喜歡的編輯器進行開發工做,代碼會自動同步到虛擬主機中執行。

#6 - PROVISIONING

如今,咱們有一個基於 Ubuntu 系統的虛擬機,還能夠從咱們的主機編輯文件並同步到虛擬機。接下來,咱們建立一個 web 服務器發佈這些文件。

若是咱們經過 SSH 登陸虛擬機並以本身的方式安裝 web 服務器,那麼每個使用一樣 Vagrant 環境的同事就都要重複這一安裝過程。Vagrant 集成了自動配置功能來處理這些事務。使用這個特性,當你執行`vagrant up`命令的時候 Vagrant 將會自動的安裝軟件。如此一來,即可以很方便的建立 Vagrant 環境的副本在開發團隊之間共享開發環境。

6.1. installing apache

咱們將使用一個 shell 腳本爲咱們的 Vagrant 項目安裝一個 apache。在 vagrantfile 所在目錄中建立一個腳本文件 bootstrap.sh ,內容以下:

#!/usr/bin/env bash

apt-get update
apt-get install -y apache2
if ! [ -L /var/www ]; then
rm -rf /var/www
ln -fs /vagrant /var/www
fi

接着,咱們經過修改 vagrantfile 文件,配置 vagrant 在啓動時運行該腳本,代碼以下:

Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
config.vm.provision :shell, path: "bootstrap.sh"
end

這裏的 `provision` 行是新增的,它告訴 vagrant 使用 `bootstrap.sh` 腳本配置虛擬主機,腳本位置是相對與當前項目根目錄的(vagrantfile 所在位置)。

6.2. PROVISION!

當一切都配置穩當,咱們只需執行 `vagrant up` 便可經過 Vagran 自動化的配置虛擬主機。過程當中你將會看到 shell 腳本的執行結果在你的命令行終端。若是虛擬主機已經處於運行狀態,執行 `vagrant reload --provision` 將會快速重啓虛擬主機,跳過初始導入步驟。 provision 參數告訴 Vagrant 執行 provisioners,由於該步驟一般只會在第一次執行 `vagrant up` 時執行。

Vagrant 啓動完成後,Web服務器將啓動和運行。如今,你還不能從你本身的瀏覽器看到網站,但你可經過SSh從服務器加載一個文件以驗證 web 服務已在正常運行:

$ vagrant ssh
...
vagrant@precise64:~$ wget -qO- 127.0.0.1

上述命令會正常工做,由於咱們已安裝 apache 並設置 documentroot 指向 `/vagrant`目錄(咱們在前面配置的共享目錄),您能夠經過建立更多的文件並從終端查看它們,下一步咱們將討論網絡選項,以便您可使用本身的瀏覽器訪問來虛擬主機。

#7 - NETWORKING

如今咱們有一個Web服務器,當咱們修改咱們的主機文件時,他們會自動同步到虛擬主機。然而,僅僅從終端訪問虛擬機的網頁並不使人滿意。在這一步中,咱們將使用 Vagrant 的網絡功能實現從咱們的主機訪問虛擬主機。

7.1. PORT FORWARDING

這將用到端口轉發功能,端口轉發是轉發一個網絡端口從一個網絡節點到另外一個網絡節點的行爲,其使一個外部用戶從外部通過一個被激活的NAT路由器到達一個在私有內部IP地址(局域網內部)上的一個端口。這容許你在你本身的機器上訪問一個端口,但實際上全部的網絡流量都將轉發到一個虛擬機的特定端口上。

讓咱們創建一個轉發端口,以便咱們在主機上訪問虛擬主機中的Apache。只須要簡單的編輯一下 vagrantfile 文件便可,操做以下:

Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
config.vm.provision :shell, path: "bootstrap.sh"
config.vm.network :forwarded_port, guest: 80, host: 4567
end

運行 `vagrant reload` 或 `vagrant up`(取決於虛擬主機是否已運行),上面的配置將會開始生效。

一旦虛擬主機完成重啓,咱們即可在瀏覽器中打開 `http://127.0.0.1:4567` 訪問虛擬主機中的頁面。

7.2. OTHER NETWORKING

Vagrant 也有其餘形式的網絡工做模式,容許你爲虛擬機指定一個靜態IP地址,或橋接虛擬機的到一個已存在的網絡。若是您對其餘選項感興趣,請閱讀相關文檔。

#8 - SHARE

如今,咱們有一個正常運行的Web服務器,而且可以經過咱們的主機訪問。咱們已具有一個至關功能的開發環境。可是,除了提供一個開發環境, Vagrant 也能夠很容易地共享一個開發環境。

Vagrant 分享可以使你方便快捷的分享你的 Vagrant 開發環境給周圍任何能與互聯網鏈接的人。它會生成一個網址,該 URl 用來讓全世界任何一個鏈接互聯網的設備都可以訪問獲取到你的開發環境。

8.1. LOGIN TO HASHICORP'S ATLAS

在分享你的 Vagrant 環境以前,你將須要一個 hashicorp 賬戶。不要擔憂,它是免費的。
一旦你建立完帳號,即可使用 `vagrant login` 命令登陸:

$ vagrant login
Username or Email: mitchellh
Password (will be hidden):
You are now logged in!

8.2. SHARE

一旦登陸成功,運行 `vagrant share` 命令:

$ vagrant share
...
==> default: Your Vagrant Share is running!
==> default: URL: http://frosty-weasel-0857.vagrantshare.com
...

您的網址將是不一樣的,因此不要嘗試上面的網址。相反,複製 vagrant share 輸出的 URL 在 Web 瀏覽器中訪問,它應該載入咱們早前在 Apache 中設置好的頁面。

若是您修改共享文件夾中的文件並刷新 URL,您將看到它的更新!URL是直接路由到你 Vagrant 環境的。

在你的終端按下 Ctrl + C 可結束共享會話。您能夠再次刷新URL,以驗證您的環境再也不共享。

Vagrant 共享比簡單的 HTTP 共享更強大。更多信息,請查看完整的 vagrant 共享文檔。

#9 - TEARDOWN

咱們已經擁有一個功能齊全的虛擬機,可用於基本的 Web 開發。如今,是時候來談一談如何使 vagrant 中止工做了,好比咱們要切換到另外一個其它類型的工做項目,也許是出去吃午餐,或者只是到了回家時間。咱們該如何關閉咱們的開發環境呢?

Vagrant 中,你能夠經過 `suspend` 、 `halt` 或 `destroy` 來中止虛擬主機運行。這些選項各有利弊,你應該根據需求選擇最適合你的方法。

9.1. Suspending

調用 `vagrant suspend` 命令將暫停虛擬主機,它會保存當前運行的機器狀態而後中止 Vagrant。當你準備開始工做時,只需執行 `vagrant up`,它將從你離開的地方從新開始。這種方法的主要好處是,它是超級快的,中止和開始你的工做一般只需5至10秒。缺點是虛擬機仍然佔用你的磁盤空間,而且須要更多的磁盤空間來存儲磁盤上的虛擬機內存狀態。

9.2. Halting

調用 `vagrant halt` 命令,vagrant 會優雅地關閉虛擬機操做系統並關閉虛擬機。當你準備開始工做時,只需執行 `vagrant up`。這種方法的好處是,它會乾淨地關閉您的機器,保存磁盤的內容,並容許它再次乾淨的啓動。缺點是,它會須要一些額外的時間用來冷啓動操做系統,而且虛擬機關閉期間仍然佔用磁盤空間。

9.3. Destroying

調用 `vagrant destroy` 命令將從您的系統中刪除虛擬機的全部痕跡。它會中止虛擬機,關閉電源,並刪除全部的虛擬磁盤信息。再次,當你準備好開始工做時,只需執行 `vagrant up`。這樣作的好處是,沒有任何東西在你的機器上留下。由虛擬機消耗的磁盤空間和RAM被回收,而且主機保持清潔。缺點是,`vagrant up` 啓動時間會花費一些額外的時間,由於它須要從新導入和初始化 provision 。

#10 - REBUILD

當你準備好回到你的項目繼續工做,不管是明天,從如今開始的一個星期後,仍是從如今開始的一年後,從新運行以前保存起來的項目都很是容易:

$ vagrant up

就是這樣!因爲 Vagrant 環境已經經過 vagrantfile 配置文件保存起來,你或者你的同事只需在適當的時候執行 `vagrant up` 便可快速重塑你的工做環境。

截至目前,你已經完整的把 Vagrant 整個生命週期梳理一遍了。

#11 - PROVIDERS

在這篇文章中,你的項目是基於 VirtualBox 的,可是 Vagrant 還能夠與各式各樣的其餘 providers 一塊兒工做,如 VMware , AWS 等等。能夠到官網文檔中閱讀每一個 provider 頁面,瞭解如何設置它們的更多信息。

一旦你有一個 provider 安裝完成,你不須要對你的 vagrantfile 進行任何修改,只需在執行 `vagrant up` 命令時帶上相應的 provider 參數便可。

$ vagrant up --provider=vmware_fusion

準備移動到雲了嗎?把它帶到AWS:

$ vagrant up --provider=aws

一旦你運行 vagrant up 時指定了 provider ,其餘 Vagrant 命令均再也不須要明確指定 provider 信息。因此,當你準備 SSH 、destroy 或其餘操做時,只要運行常規的 Vagrant 命令便可。如 `vagrant destroy`,無需帶任何參數信息。

#12 - The end

本文地址:http://www.cnblogs.com/kelsen/p/6247005.html

參考資料:https://www.vagrantup.com/docs/getting-started/

如您有任何建議或疑問請在下面留言交流。

相關文章
相關標籤/搜索