1. 程式人生 > >使用Vagrant 和 VirtualBox 搭建虛擬機器

使用Vagrant 和 VirtualBox 搭建虛擬機器

VirtualBox 安裝

       VirtualBox 是 Oracle 開源的虛擬化系統,和 VMware 是同類產品,支援多個平臺,可以到官方網站:https://www.virtualbox.org/wiki/Downloads 下載適合你平臺的 VirtualBox 最新版本並安裝。

Vagrant 安裝

       到官方網站下載相應系統平臺的安裝包:http://www.vagrantup.com/downloads.html 
直接根據嚮導進行操作即可完成安裝,安裝完後就可以在終端輸入 vagrant

 命令了。

使用Vagrant 和box 搭建虛擬機器

      使用vagrant 需要準備.box檔案,就跟VmWare需要repo映象倉庫一樣,box是一個打包好的作業系統,是一個字尾名為 .box 的檔案,其實是一個壓縮包,裡面包含了 Vagrant 的配置資訊和 VirtualBox 的虛擬機器映象檔案。

VagrantBox官網下載地址 : http://www.vagrantbox.es/

我這邊下的是centos-7.0-x86_64.box

1 新增box檔案到vagrant中

新增 box

 命令格式:vagrant box add <本地 box 名稱> <box 檔案>

  • 本地 box 名稱:自定義名稱,該名稱是本地 vagrant 管理時使用的名稱;
  • box 檔案:前面下載的 vagrant box 檔案或者遠端 box url 地址;
PS F:\vagrant-test> vagrant box add test centos-7.0-x86_64.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'test' (v0) for provider:
    box: Unpacking necessary files from: file://F:/vagrant-test/centos-7.0-x86_64.box
    box: Progress: 100% (Rate: 1013M/s, Estimated time remaining: --:--:--)
==> box: Successfully added box 'test' (v0) for 'virtualbox'!

2 檢視 box 是否新增成功 
檢視當前 vagrant 中有哪些 boxvagrant box list

PS F:\vagrant> vagrant box list
centos-7.0  (virtualbox, 0)
test (virtualbox, 0)

3 初始化上面新增的 box

初始化命令格式:vagrant init <本地 box 名稱> 
本地 box 名稱:第 2 步中新增的 box 名稱 
這裡初始化前面新增的 box,初始化後會在當前目錄生產一個 Vagrantfile 檔案,裡面包含了虛擬機器的各種配置。

PS F:\vagrant-test> vagrant init 'test'
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.

4 啟動虛擬機器

虛擬機器啟動命令:vagrant up 
啟動虛擬機器時會自動將當前目錄(即 Vagrantfile 檔案所在目錄),和虛擬機器的 /vagrant 目錄共享

PS F:\vagrant-test> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'test'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: vagrant-test_default_1545741903935_21710
==> default: Clearing any previously set forwarded ports...
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2200 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2200
    default: SSH username: vagrant
    default: SSH auth method: private key
...
    default: Guest Additions Version: 4.3.28
    default: VirtualBox Version: 5.2
==> default: Mounting shared folders...
    default: /vagrant => F:/vagrant-test

vagrant up 報錯

There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.
    
Stderr: VBoxManage.exe: error: VT-x is disabled in the BIOS for all CPU modes (VERR_VMX_MSR_ALL_VMX_DISABLED)

原因是 系統的虛擬化技術沒有開啟

按F2進入到Bios介面,然後settings–>configuration-IntelVirtualTechnology設定為[ENABLED]

檢測是否開啟: 工作管理員–>效能–>cpu -> 虛擬化: 開啟

5 連線虛擬機器 

命令格式:vagrant ssh

PS F:\vagrant-test> vagrant ssh
Last login: Thu Jul 16 08:48:31 2015 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
[[email protected] ~]$

6 檢視 Vagrant 共享目錄

進入虛擬機器後執行 df -h 可以看到 Vagrant 預設把宿主機 Vagrantfile 所在的目錄和虛擬機器的 /vagrant 目錄共享,可以通過 ls /vagrant/ 檢視該目錄內容,內容和宿主機對應目錄一致。

[[email protected] ~]$ df -h
Dateisystem             Größe Benutzt Verf. Verw% Eingehängt auf
/dev/mapper/centos-root  8,4G    1,1G  7,4G   13% /
devtmpfs                 488M       0  488M    0% /dev
tmpfs                    497M       0  497M    0% /dev/shm
tmpfs                    497M    6,5M  491M    2% /run
tmpfs                    497M       0  497M    0% /sys/fs/cgroup
/dev/sda1                497M    118M  379M   24% /boot
none                     201G    6,2G  195G    4% /vagrant
[[email protected] ~]$ ls /vagrant/
centos-7.0-x86_64.box  Vagrantfile
[[email protected] ~]$ ls
base.sh  cleanup.sh  puppet.sh  vagrant.sh  virtualbox.sh  zerodisk.sh
[[email protected] ~]$

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 新增box
  • vagrant init 初始化 box
  • vagrant up 啟動虛擬機器
  • vagrant ssh 登入虛擬機器
  • vagrant box list 列出 Vagrant 當前 box 列表
  • vagrant box remove 刪除相應的 box
  • vagrant destroy 停止當前正在執行的虛擬機器並銷燬所有建立的資源
  • vagrant halt 關機
  • vagrant package 把當前的執行的虛擬機器環境進行打包為 box 檔案
  • vagrant plugin 安裝解除安裝外掛
  • vagrant reload 重新啟動虛擬機器,重新載入配置檔案
  • vagrant resume 恢復被掛起的狀態
  • vagrant status 獲取當前虛擬機器的狀態
  • vagrant suspend 掛起當前的虛擬機器
  • vagrant global-status 檢視當前 vagrant 管理的所有 vm 資訊
$ vagrant global-status                                                                                                                                
id       name    provider   state   directory
------------------------------------------------------------------------
aeb2f19  default virtualbox running /Users/haohao/vagrant
2cd1f42  default virtualbox aborted /Users/haohao/vagrant-test
943c1bf  default virtualbox aborted /Users/haohao/work/vm
  • vagrant ssh-config 輸出用於 ssh 連線的一些資訊
$ vagrant ssh-config                                                                                                                                   
Host default
  HostName 127.0.0.1
  User ubuntu
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/haohao/vagrant/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

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://blog.csdn.net/qianghaohao/article/details/80038096