Vagrant 入門指南
Vagrant 簡介
Vagrant 是一個用來構建和管理虛擬機器環境的工具。Vagrant 有著易於使用的工作流,並且專注於自動化,降低了開發者搭建環境的時間,提高了生產力。解決了“在我的機器上可以工作”的問題。
Vagrant 是為了方便的實現虛擬化環境而設計的,使用 Ruby 開發,基於 VirtualBox 等虛擬機器管理軟體的介面,提供了一個可配置、輕量級的行動式虛擬開發環境。使用 Vagrant 可以很方便的就建立起來一個虛擬環境,而且可以模擬多臺虛擬機器,這樣我們平時還可以在開發機模擬分散式系統。
團隊新員工加入,常常會遇到花一天甚至更多時間來從頭搭建完整的開發環境,而有了 Vagrant,只需要直接將已經打包好的 package(裡面包括開發工具,程式碼庫,配置好的伺服器等)拿過來就可以工作了,這對於提升工作效率非常有幫助。
為什麼選擇 Vagrant
Vagrant 提供了一個易於配置,可重複使用,相容的環境,透過一個單一的工作流程來控制,幫助你和團隊最大化生產力和靈活性。 為了實現 Vagrant 的魔力,Vagrant 站在了巨人的肩膀上。虛擬機器的配置基於 VirtualBox,VMware,AWS 或者其他提供商。然後一些配置工具,比如 shell 指令碼,Chef 或者 Puppet 可以自動化地在虛擬機器安裝並配置軟體。
對於開發者人員
如果你是一個開發者,Vagrant 將在一個一次性的、一致的環境中隔離依賴項及其配置,而不會影響你習慣使用的任何工具(編輯器、瀏覽器、偵錯程式等)。一旦你或者其他人建立了一個 Vagrantfile,你只需要執行 vagrant up
所有的東西就自動安裝和配置了。你團隊中的其他成員使用同一個配置檔案來建立開發環境,因此不管你工作在 Linux,MacOS X 還是 Windows, 所有團隊的成員都可以在統一的環境環境中執行程式碼,這樣就可以避免“在我的機器上可以工作”的問題。
對於運維人員
如果你是一個運維工程師或者 DevOps 工程師,Vagrant 給予你一個一次性的環境來開發和測試基礎架構管理指令碼。你可以使用本地虛擬機器(比如 VirtualBox 或者 VMware)馬上測試一些東西,比如 shell 指令碼、Chef cookbooks、Puppet 模組等。然後,你可以用同樣的配置在遠端雲上,比如 AWS 或者 RackSpace,來測試這些指令碼。拋棄之前自定義指令碼來回收 EC2 例項吧,停止使用 SSH 在各種機器之間跳來跳去,請開始使用 Vagrant 來給你的工作帶來更多便利。
Vagrant 和 Terraform 的區別
Vagrant 和 Terraform 都出自同一個公司 HashiCorp,該公司主要做一些開源軟體,相關的產品還有 Packer,Consul,Vault,Nomad 等。
Terraform 的主要用途是管理雲提供商的遠端資源,比如 AWS。Terraform 可以管理橫跨多個雲提供商巨量的基礎設施。而 Vagrant 主要用來管理僅使用少量虛擬機器的本地開發環境。
Vagrant 用於開發環境,Terraform 普遍用於基礎設施管理。
VirtualBox 安裝
VirtualBox 是 Oracle 開源的虛擬化系統,和 VMware 是同類產品,支援多個平臺,可以到官方網站:https://www.virtualbox.org/wiki/Downloads 下載適合你平臺的 VirtualBox 最新版本並安裝。
提示:對於 Mac 使用者,如果系統為 OSX 10.13.3(mac OS High Sierra) 或者更高版本,安裝過程可能會失敗,報錯提示
安裝失敗,安裝器遇到了一個錯誤導致安裝失敗...
,原因是新版本 Mac 系統的安全機制阻止外部核心擴充套件安裝,導致安裝失敗。兩種解決方法:
1. 進入系統偏好設定 > 安全性與隱私 > 通用,然後手動允許;
2. 在終端敲命令停用此安全特性:sudo spctl --master-disable
;
Vagrant 安裝
到官方網站下載相應系統平臺的安裝包:http://www.vagrantup.com/downloads.html 。
直接根據嚮導進行操作即可完成安裝,安裝完後就可以在終端輸入 vagrant
命令了。
提示:儘量下載最新的程式,因為 VirtualBox 經常升級,升級後有些介面會變化,老的 Vagrant 可能無法使用。
Vagrant 啟動第一臺虛擬機器
到此準備工作(VirtualBox 和 Vagrant 安裝)基本上做完了,接下來就可以透過 Vagrant 來啟動一臺虛擬機器了。
在啟動虛擬機器之前先簡單介紹下 Vagrant box,box 是一個打包好的作業系統,是一個字尾名為 .box
的檔案,其實是一個壓縮包,裡面包含了 Vagrant 的配置資訊和 VirtualBox 的虛擬機器映象檔案。vagrant up
啟動虛擬機器是基於 box 檔案的,因此在啟動虛擬機器前必須得把 box 檔案準備好。或者也可以在啟動的時候指定遠端 box 地址,在這裡我把 box 檔案下載下來,然後啟動時指定該檔案。
我使用網上分享的 ubuntu-server-16.04
這個 box,由於vagrant 官方 box 下載速度特別慢,所以在此提供一下該 box 的百度網盤下載地址,加速下載:https://pan.baidu.com/s/1wJCeWEyxKQLVPi1IH1IlYg
1、新建一個目錄作為 Vagrant 的工程目錄
haohao $ cd /Users/haohao
haohao $ mkdir vagrant
2、新增前面下載的 box
新增 box 命令格式:
vagrant box add <本地 box 名稱> <box 檔案>
- 本地 box 名稱:自定義名稱,該名稱是本地 vagrant 管理時使用的名稱;
- box 檔案:前面下載的 vagrant box 檔案或者遠端 box url 地址;
haohao $ vagrant box add ubuntu-server-16.04 ubuntu-server-16.04-amd64-vagrant.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'ubuntu-server-16.04' (v0) for provider:
box: Unpacking necessary files from: file:///Users/haohao/vagrant/ubuntu-server-16.04-amd64-vagrant.box
==> box: Successfully added box 'ubuntu-server-16.04' (v0) for 'virtualbox'!
3、檢視 box 是否新增成功
檢視當前 vagrant 中有哪些 box:
haohao $ vagrant box list
ubuntu-server-16.04 (virtualbox, 0)
4、初始化上面新增的 box
初始化命令格式:
vagrant init <本地 box 名稱>
本地 box 名稱:第 2 步中新增的 box 名稱
這裡初始化前面新增的 box,初始化後會在當前目錄生產一個 Vagrantfile 檔案,裡面包含了虛擬機器的各種配置,關於具體每個配置項是什麼意思,後面會介紹。
haohao $ vagrant init 'ubuntu-server-16.04'
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
5、啟動虛擬機器
虛擬機器啟動命令:
vagrant up
啟動虛擬機器時會自動將當前目錄(即 Vagrantfile 檔案所在目錄),和虛擬機器的 /vagrant
目錄共享。
haohao $ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu-server-16.04'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: vagrant_default_1524288099752_62326
==> default: Clearing any previously set network interfaces...
.....
==> default: Mounting shared folders...
default: /vagrant => /Users/haohao/vagrant
6、連線虛擬機器
haohao $ vagrant ssh
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-98-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Get cloud support with Ubuntu Advantage Cloud Guest:
http://www.ubuntu.com/business/services/cloud
0 packages can be updated.
0 updates are security updates.
Last login: Sat Apr 21 05:28:37 2018 from 10.0.2.2
haohao $
7、檢視 Vagrant 共享目錄
進入虛擬機器後執行 df -h
可以看到 Vagrant 預設把宿主機 Vagrantfile
所在的目錄和虛擬機器的 /vagrant
目錄共享,可以透過 ls /vagrant/
檢視該目錄內容,內容和宿主機對應目錄一致。
haohao $ df -h
Filesystem Size Used Avail Use% Mounted on
udev 490M 0 490M 0% /dev
tmpfs 100M 3.1M 97M 4% /run
/dev/sda1 9.7G 857M 8.8G 9% /
tmpfs 497M 0 497M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 497M 0 497M 0% /sys/fs/cgroup
vagrant 234G 49G 185G 21% /vagrant
tmpfs 100M 0 100M 0% /run/user/1000
# ls 檢視該共享目錄內容和宿主機內容一致
haohao $ ls /vagrant/
ubuntu-xenial-16.04-cloudimg-console.log Vagrantfile
Vagrant 配置檔案淺析
前面我們執行 vagrant init <本地 box 名稱>
會在當前目錄生成 Vagrantfile 檔案,這個檔案是非常重要的,一般給別人共享自己的環境時都是提供一個 Vagrantfile 和一個 box 檔案,這樣就可以很輕鬆地將環境共享給別人,別人能得到一模一樣的統一的環境,這就是使用 Vagrant 的好處。
Vagrantfile 主要包括三個方面的配置,虛擬機器的配置、SSH配置、Vagrant 的一些基礎配置。Vagrant 是使用 Ruby 開發的,所以它的配置語法也是 Ruby 的,對於沒有學過 Ruby 的朋友也沒關係,根據例子模仿下就會了。
修改完配置後需要執行 vagrant reload
重啟 VM 使其配置生效。
以下簡單介紹下常用配置的配置項:
1. box 名稱設定
config.vm.box = "base"
上面這配置展示了 Vagrant 要去啟用那個box作為系統,也就是前面我們輸入 vagrant init <本地 box 名稱>
時所指定的 box,如果沒有輸入 box 名稱的話,那麼預設就是 base
。
2、VM 相關配置
VirtualBox 提供了 VBoxManage 這個命令列工具,可以讓我們設定 VM,用modifyvm
這個命令讓我們可以設定 VM 的名稱和記憶體大小等等,這裡說的名稱指的是在 VirtualBox 中顯示的名稱,我們也可以在 Vagrantfile 中進行設定,舉例如下:
呼叫 VBoxManage 的 modifyvm
的命令,設定 VM 的名稱為 ubuntu
,記憶體為 1024 MB。你可以類似的透過定製其它 VM 屬性來定製你自己的 VM。
config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--name", "ubuntu", "--memory", "1024"]
end
3、網路設定
Vagrant 有兩種方式來進行網路連線,一種是 host-only (主機模式),這種模式下所有的虛擬系統是可以互相通訊的,但虛擬系統和真實的網路是被隔離開的,虛擬機器和宿主機是可以互相通訊的,相當於兩臺機器透過雙絞線互聯。另一種是 Bridge(橋接模式),該模式下的 VM 就像是區域網中的一臺獨立的主機,可以和區域網中的任何一臺機器通訊,這種情況下需要手動給 VM 配 IP 地址,子網掩碼等。我們一般選擇 host-only 模式,配置如下:
config.vm.network :private_network, ip: "11.11.11.11"
4、hostname 設定
hostname
的設定非常簡單:
config.vm.hostname = "kubernetes"
5、目錄共享
我們前面介紹過/vagrant
目錄預設就是當前的開發目錄,這是在虛擬機器開啟的時候預設掛載同步的。我們還可以透過配置來設定額外的同步目錄:
# 第一個引數是主機的目錄,第二個引數是虛擬機器掛載的目錄
config.vm.synced_folder "/Users/haohao/data", "/vagrant_data"
6、埠轉發
對宿主機器上 8080 埠的訪問請求 forward 到虛擬機器的 80 埠的服務上:
config.vm.network :forwarded_port, guest: 80, host: 8080
Vagrant 常用命令清單
vagrant box add
新增 boxvagrant init
初始化 boxvagrant up
啟動虛擬機器vagrant ssh
登入虛擬機器vagrant box list
列出 Vagrant 當前 box 列表vagrant box remove
刪除相應的 boxvagrant destroy
停止當前正在執行的虛擬機器並銷燬所有建立的資源vagrant halt
關機vagrant package
把當前的執行的虛擬機器環境進行打包為 box 檔案vagrant plugin
安裝解除安裝外掛vagrant reload
重新啟動虛擬機器,重新載入配置檔案vagrant resume
恢復被掛起的狀態vagrant ssh-config
輸出用於 ssh 連線的一些資訊vagrant status
獲取當前虛擬機器的狀態vagrant suspend
掛起當前的虛擬機器vagrant up
重啟虛擬機器
Vagrant 啟動虛擬機器叢集
前面我們都是透過一個 Vagrantfile 配置啟動單臺機器,如果我們要啟動一個叢集,那麼可以把需要的節點在一個 Vagrantfile 寫好,然後直接就可以透過 vagrant up
同時啟動多個 VM 組成一個叢集。以下示例配置一個 web 節點和一個 db 節點,兩個節點在同一個網段,並且使用同一個 box 啟動:
Vagrant.configure("2") do |config|
config.vm.define :web do |web|
web.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--name", "web", "--memory", "512"]
end
web.vm.box = "ubuntu-server-16.04"
web.vm.hostname = "web"
web.vm.network :private_network, ip: "11.11.1.1"
end
config.vm.define :db do |db|
db.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--name", "db", "--memory", "512"]
end
db.vm.box = "ubuntu-server-16.04"
db.vm.hostname = "db"
db.vm.network :private_network, ip: "11.11.1.2"
end
end
相關連線
- https://www.vagrantup.com/intro/index.html
- https://blog.csdn.net/rickiyeat/article/details/55097687
- https://github.com/astaxie/go-best-practice/blob/master/ebook/zh/01.0.md
相關文章
- Markdown入門指南
- Spring入門指南Spring
- MySQL 入門指南MySql
- Zookeeper入門指南
- RabbitMQ入門指南MQ
- Nginx入門指南Nginx
- CPack 入門指南
- Docker 入門指南Docker
- numpy入門指南
- EOS 入門指南
- CodeMirror入門指南
- Vue 入門指南Vue
- 混沌工程入門指南
- linux命令入門指南Linux
- GitHub Actions 入門指南Github
- Jupyter Notebook入門指南
- Vue 3入門指南Vue
- SpringData 完全入門指南Spring
- KNIME快速入門指南
- Kubernetes Helm入門指南
- Markdown快速入門指南
- 【Android開發入門教程】三.Activity入門指南!Android
- alertmanager告警快速入門指南
- 故障測試入門指南
- Go 快速入門指南 - 序言Go
- Go 快速入門指南 - URLGo
- Go 快速入門指南 - selectGo
- LeetCode入門指南 之 排序LeetCode排序
- 容器快速入門完全指南
- GitHub 簡易入門指南Github
- Kubernetes認證入門指南
- Maven 教程之入門指南Maven
- 【入門指南】node.jsNode.js
- React實戰入門指南React
- SOAR 101 快速入門指南
- [譯] 以太坊入門指南
- 超詳細的 Vagrant 上手指南
- Omi 入坑指南 Third field 事件入門事件