1. 程式人生 > >Vagrant 基礎全面解析

Vagrant 基礎全面解析

找到 archive 初始化 類型 cnblogs 查看 都是 PE 驗證

本文轉載自:https://www.cnblogs.com/kelsen/archive/2017/01/04/6247005.html

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

Vagrant

Vagrant 是一個管理虛擬主機生命周期的命令行工具。本文旨在從上到下對 Vagrant 各個特性進行全面講解,盡可能多的涵蓋細節。如果你只是想入門 Vagrant ,那麽本文是一個非常好的開始。

本文將會使用到 VirtualBox,因為它在各個主要的操作系統平臺上都是免費的,並且已集成到 Vagrant 中。不過,在讀完文檔後,請不要忘記 Vagrant 還可以配合很多其他虛擬機平臺一起工作。

在深入第一個 Vagrant 項目之前,請安裝最新版本的 Vagrant ,並且安裝好 VirtualBox,因為後續環節我們會把 VirtualBox 作為我們的 provider 進行主要講解。

如果你更喜歡閱讀紙質書本, 《Vagrant: Up and Running》 可能是一個不錯的選擇,該書已在 O‘Reilly 出版,其作者正是 Vagrant 的作者。

#1 - UP AND RUNNING

$ vagrant init hashicorp/precise64
$ vagrant up

運行上面兩條命令後,一個基於 VirtualBox 的虛擬主機(Ubuntu12.04 LTS 64-bit)將運行起來。你可以通過vagrant ssh

命令以 SSH 的形式登錄到虛擬主機,處理完你的工作後,可通過`vagrant destroy` 命令終止虛擬主機運行。

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

本文的其余部分將通過引導您建立一個比較完整的項目,來介紹更多 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/

關於本文如果您有任何建議或疑問請在下面留言交流,也可通過 Web前端高級工程師 群進行線上溝通。

Vagrant 基礎全面解析