天天看點

使用Vagrant在指令行快速建立虛拟機

vagrant是一個跨平台的虛拟機管理工具,我們以 deepin 20.2.3 為例,安裝和使用 vagrant。我們在這裡所說的 vagrant 包括 vagrant 工具本身 和 虛拟引擎工具 virtualbox。

安裝 vagrant 時,使用的 virtualbox 版本必須要得到 對應 vagrant 版本的支援,在寫這篇文檔的時候,我安裝的 vagrant 版本是 <code>2.2.18</code> ,對應的 virtualbox 版本是 <code>6.1.26</code>。

vagrant 安裝包下載下傳位址:https://releases.hashicorp.com/vagrant/,在這裡可以看到vagrant 目前的最新版本以及曆史版本,我們可以選擇到對應作業系統的對應版本進行下載下傳;

virtualbox 安裝包下載下傳位址:https://www.virtualbox.org/wiki/downloads,同樣,在這裡我們可以找到 virtualbox 的對應版本。

将 vagrant 和 virtualbox 指定的安裝包下載下傳到本地後,執行安裝指令,如下

驗證:執行以下指令

如果以上步驟可以順利執行,則代表 vagrant 安裝成功

我們可以把 vgarnt 中的 <code>box</code> 了解為某種作業系統的鏡像檔案,也可以了解為虛拟機的本身,我們可以去添加我們想要的 <code>box</code>, vagrant 可以去管理這些 <code>box</code>,我們在啟動虛拟機時可以選擇我們想要的 <code>box</code>。

我們可以通過https://app.vagrantup.com/boxes/search去找到我們想要的box,我們可以看到 box 名稱格式為 <code>a/b</code>, 其中 a 代表建立 box 的使用者名,b 為 box 的名稱,如<code>centos/7</code>。

安裝指定的 box

此時看到如下選擇提示

因為我們使用的虛拟機引擎是<code>virtualbox</code>,是以輸入<code>3</code>後按回車即下載下傳 virtualbox 版本的 centos/7。

查詢已經安裝的box

初始化虛拟機

此時在目錄下生成一個名為 <code>vagrantfile</code> 的配置檔案,在後續,我們可以通過修改 <code>vagrantfile</code> 來定義虛拟機,接下來的相關操作指令都将在 vagrant 項目目錄下執行

啟動虛拟機

虛拟機啟動之後,會将本地的項目目錄自動挂載到虛拟機裡的 <code>/vagrant</code> 目錄

連接配接虛拟機

另外,我們可以通過<code>vagrant ssh-config</code>指令檢視ssh配置資訊,包括虛拟機與本地的映射端口、證書檔案等,如下

我們也可以通過直接通過 ssh 工具連接配接到虛拟機,如下指令

vagrant使用者的預設密碼為<code>vagrant</code>

參數

-p:指定ssh端口

-i:指定ssh私鑰檔案

檢視虛拟機狀态

虛拟機關機

暫停虛拟機

vagrant 将會在虛拟機暫停之後,把資料存儲到我們本地硬碟,下次開啟時,将從硬碟讀取恢複。在虛拟機暫停的過程中,虛拟機相關服務的狀态會進行儲存,如<code>httpd</code> 服務的正在運作,虛拟機暫停後再繼續運作虛拟機,<code>httpd</code> 服務也會繼續運作

重新開機虛拟機

在項目目錄下,執行<code>vagrant reload</code>,虛拟機将會先執行關機動作,後執行開機動作。

銷毀目前的虛拟機

銷毀虛拟機操作會将虛拟機進行關機後删除執行個體,如果虛拟機已經處于關機狀态将直接删除。此指令隻會銷毀我們在目前目錄建立的 虛拟機,不會銷毀 box。

此時我們使用 <code>vagrant status</code> 指令檢視虛拟機狀态,會看到虛拟機處于 <code>not created</code> 狀态。

實際上,在虛拟機建立的時候,vagrant 會将項目目錄自動挂載到 虛拟機裡的 <code>/vagrant</code> 目錄,實際上,我們還可以通過 定義 <code>vagrantfile</code> 的方式來挂載其他目錄。

打開 <code>vagrantfile</code> 找到 <code># config.vm.synced_folder "../data", "/vagrant_data"</code> 所在的行,去掉注視符号 “#”,即定義了一個目錄挂載規則,第一個參數代表 主控端目前目錄的上級目錄下 的 <code>data</code> 目錄, 第二個參數 代表挂載 到虛拟機裡的 <code>/vagrant_data</code> 目錄 。我們還可以添加後面的參數,最終代碼如下

create: true:代表如果主控端不存在對應的目錄,将會建立;

owner: "root":代表挂載到虛拟機後,目錄的擁有者是 root;

group: "root":代表挂載到虛拟機後,目錄的所屬的群組是 root。

儲存好<code>vagrantfile</code>之後,執行<code>vagrant reload</code>即完成虛拟機的重新開機并挂載上對應的目錄。如果執行報錯的話,我們需要使用<code>vagrant plugin install vagrant-vbguest --plugin-version 0.21</code> 安裝vbguest插件後再次重新開機虛拟機。

我們通常需要跟虛拟機進行通信,比如我們在虛拟機上安裝了一個web服務,需要通過自己電腦的浏覽器打開虛拟機上搭建的web服務。這就需要我們配置虛拟機的網絡,主控端才能與虛拟機正常通信。vagrant 提供三種網絡的配置。

端口轉發(forwarded_port):如把主控端的 8080 端口,轉發到虛拟機的 80 端口,這樣 如果在主控端通路 <code>http://localhost:8080</code> 将對轉發到虛拟機的 80 端口服務。這種方法不太靈活,因為我們需要配置所有需要轉發的端口;

私有網絡(private_network):為虛拟機手動設定ip位址,通過ip位址我們的主控端就可以與虛拟機之間通信了,不過,我們隻能通過我們的主控端通路虛拟機;

公有網絡(public_network):公有網絡會把虛拟機配置成在同一個區域網路内可以通路的一台裝置。比如我我們的電腦連結一台路由器,那麼其他連接配接這台路由器的裝置(其他電腦、平闆電腦、手機等)也可以通路到我們電腦裡的虛拟機。

(1)配置私有網絡

找到 <code>config.vm.network "private_network"</code> 所在行,取消注釋,第2個參數是指定的ip位址

接下來用<code>ping 192.168.33.10</code>指令去驗證,如果有傳回,代表私有網絡設定成功。

*(2)配置共有網絡

找到<code>config.vm.network "public_network"</code>所在行,取消注釋,并且注釋私有網絡的配置。後執行<code>vagrant reload</code>重新加載 vagrantfile 檔案,此時需要選擇指定的網卡。如下輸出内容:

我們需要選擇對應的網卡即可,此時我需要輸入1後按回車,因為enp3s0是我電腦的實體網卡名稱,而其他選項都是通過軟體建立的虛拟網卡。

我們可以對正在運作的某個虛拟機進行打包生成鏡像。這樣,就可以使用新的鏡像進行建立虛拟機,那麼新建立的虛拟機會跟打包時的虛拟機環境一緻。步驟如下:

(1)先在虛拟機删除網卡定義檔案

(2)退出虛拟機,進行打包

此時在目前目錄生成<code>package.box</code>鏡像檔案

(3)将鏡像檔案導入box中

導入成功後,即可使用 <code>jkdev/ubuntu</code> 建立新的虛拟機

在實際項目中,有時候我們會把 web 服務放在一台或者多台伺服器, 資料庫伺服器放在一台伺服器。那麼在本地開發中,我們也需要去模拟對應的伺服器環境。如果我們可以建立多台虛拟機,這樣我們就可以模拟一個真實的伺服器環境。實際上, <code>vagrantfile</code> 可以同時定義多台伺服器,每一台主機都可以有自己的配置,同時我們需要把每一台主機的網絡配置好,那麼各台伺服器之間就可以進行通信了。建立過程如下:

在<code>vagranfile</code> 在<code>config.vm.box = "ubuntu/xenial64"</code>下面的一行添加以下代碼

儲存檔案之後,使用<code>vagrant up</code>啟動虛拟機,此時同時開啟兩個虛拟機。啟動完畢後使用<code>vagrant status</code>,可以看到已經啟動了兩個虛拟機

如果我們隻想啟動一台虛拟機,在啟動指令的後面指定對應的虛拟機名稱即可,如<code>vagrant up production</code>。如果我們需要連接配接該虛拟機,使用如下代碼:

在4中vagrantfile檔案裡,我們定義了兩台虛拟機,這兩台虛拟機都基于<code>ubuntu/xenial64</code>,原因是該配置與定義虛拟機的配置屬于同一級,如果我們想要為某台虛拟機定義獨立的配置,我們需要将配置内容定義在<code>config.vm.define</code>和<code>end</code>之間。如下我們定義兩個主機的私有網絡,注意私有網絡的ip位址不要和主控端連接配接的路由器ip位址重複。如下配置

再使用<code>vagrant reload</code>即可完成配置的重加載。

在5中,我們一定配置好了主機的ip位址,我們接下來追加配置,定義主機的名稱,如下代碼:

預設配置下,多台虛拟機會自動共享電腦上項目所在目錄,在虛拟機裡會映射到<code>/vagrant</code>目錄,我們還可以單獨為不同虛拟機設定不同的目錄,首先在項目下建立兩個目錄<code>dev</code>和<code>pro</code>,修改配置檔案如下

我們還可以自定義虛拟機的記憶體和核心數,如下代碼

使用<code>vagrant reload</code>完成虛拟機重加載

繼續閱讀