這個(gè)章節(jié)脫胎于我早期的blog文章勒葱,訂正了一下句法和準(zhǔn)確性私恬。
原始的文字在 VAGRANT 網(wǎng)絡(luò)配置
接續(xù)上兩章:
網(wǎng)絡(luò)配置
Vagrant可以指定三種網(wǎng)絡(luò):端口轉(zhuǎn)發(fā)(Forwarded Ports)缕陕,私有網(wǎng)絡(luò)(Private Network),公有網(wǎng)絡(luò)(Public Network)疙挺。他們和多數(shù)虛擬機(jī)提供的網(wǎng)絡(luò)是對(duì)應(yīng)的扛邑。
Vagrant 網(wǎng)絡(luò)模型
端口轉(zhuǎn)發(fā):
config.vm.network :forwarded_port, guest: 80, host: 8080
將虛擬機(jī)(被稱作guest)的端口80映射為宿主機(jī)的端口8080。
端口轉(zhuǎn)發(fā)隱含著一個(gè)provider的NAT網(wǎng)絡(luò)將被首先創(chuàng)建铐然。
所以蔬崩,如果你單獨(dú)定義一條端口轉(zhuǎn)發(fā)的配置語句的話,VM將會(huì)自動(dòng)建立NAT網(wǎng)絡(luò)環(huán)境搀暑。
私有網(wǎng)絡(luò):
config.vm.network :private_network, ip: "192.168.1.104"
你可以從宿主機(jī)自由訪問虛擬機(jī)沥阳,但LAN網(wǎng)絡(luò)中的其他人不需要也無法訪問虛擬機(jī)。
值得注意的是自点,ip地址“192.168.1.104”不是隨便指定的桐罕。
首先你可以不指定,這表示虛機(jī)啟動(dòng)時(shí)會(huì)DHCP到一個(gè)可用的IP地址(例如:192.168.33.101)桂敛,這是vagrant通過virtualbox私有網(wǎng)絡(luò)的DHCP機(jī)制獲得的功炮。
如果你要自行指定明確的IP地址,要保證該地址是在恰當(dāng)?shù)木W(wǎng)段中术唬,例如192.168.33.71薪伏。
多臺(tái)虛擬機(jī)在私有網(wǎng)絡(luò)模式下也可以互相訪問,只要設(shè)置為相同的網(wǎng)段就可以粗仓。
本質(zhì)上說嫁怀,這是使用provider的HostOnly模式设捐。
公有網(wǎng)絡(luò):
公有網(wǎng)絡(luò)實(shí)際上是表示將虛擬機(jī)暴露為LAN(例如你的宿主機(jī)所在的辦公室網(wǎng)絡(luò))中的一臺(tái)主機(jī)。
例如使用LAN的DHCP自動(dòng)獲得IP地址:
config.vm.network :public_network
也可以指定LAN網(wǎng)段中的一個(gè)可用的地址塘淑,但需要注意不要和LAN中已有的主機(jī)或者保留的IP地址相沖突萝招。
本質(zhì)上說,這是使用provider的橋接網(wǎng)絡(luò)模式朴爬。
Provider的網(wǎng)絡(luò)模式
對(duì)于vagrant的provider即寒,例如VirtualBox來說,網(wǎng)絡(luò)模式區(qū)分的更細(xì)召噩,但vagrant并不能使用全部vbox網(wǎng)絡(luò)模型母赵。
VirtualBox 的典型網(wǎng)絡(luò)模型:NAT,Hostonly具滴,Bridge以及Internal凹嘲。
這些模式的細(xì)節(jié)我們不再列舉。
借用一張表格來歸納:
NAT | Bridged | Internal | Hostonly | |
---|---|---|---|---|
vm -> host | √ | √ | × | × |
host -> vm | × | √ | × | × |
vm -> others hosts | √ | √ | × | × |
others hosts => vm | × | √ | × | × |
vm <-> vm | × | √ | same subnet | √ |
這張表格描述了virtualbox的網(wǎng)絡(luò)模型构韵。
實(shí)用的網(wǎng)絡(luò)配置
一般來說周蹭,端口轉(zhuǎn)發(fā)足以滿足開發(fā)需要了。
但對(duì)于特殊的需要來說疲恢,你可能需要一臺(tái)完全“真實(shí)”的虛機(jī)凶朗,這臺(tái)虛機(jī)可以被穩(wěn)定地從宿主機(jī)訪問,并且可以訪問LAN中的其他資源显拳。這樣的需求實(shí)際上可以通過配置多塊網(wǎng)卡來解決問題棚愤,例如一塊配置為私有網(wǎng)絡(luò)模式,一塊配置為公有網(wǎng)絡(luò)模式杂数。
vagrant通過配置文件能夠支持virtualbox的NAT宛畦,Bridge以及Hostonly網(wǎng)絡(luò)模型。
默認(rèn)情況
默認(rèn)情況下揍移,我們已經(jīng)知道一個(gè)最簡的流程來啟動(dòng)vagrant:
mkdir /dev
cd /dev
vagrant box add ubuntu/trusty64
vagrant init ubuntu/trusty64
vagrant up
vagrant ssh
vagrant halt
這樣的步驟次和,可以得到一臺(tái)ubuntu 14.04的虛擬機(jī),采用Provider的NAT網(wǎng)絡(luò)模式那伐,在虛擬機(jī)中可以訪問宿主機(jī)踏施,也可以使用宿主機(jī)的外網(wǎng)路由上網(wǎng)。
觀察它生成的默認(rèn)的Vagranfile罕邀,其網(wǎng)絡(luò)配置是未指定的读规。
此時(shí),vagrant建立的vm具有一個(gè)NAT網(wǎng)卡燃少。
橋接網(wǎng)絡(luò)
當(dāng)采用如下配置語句時(shí)束亏,vagrant建立的vm具有一個(gè)Bridged網(wǎng)絡(luò):
# Create a public network, which generally matched to bridged network.
# Bridged networks make the machine appear as another physical device on
# your network.
config.vm.network "public_network"
此時(shí),vm在宿主機(jī)所在的LAN中等價(jià)于一臺(tái)物理機(jī)器阵具。假如你具有LAN Router的管理權(quán)的話碍遍,這是很簡單的一種開發(fā)模型:通過路由器的mac綁定為vm保留一個(gè)固定的dhcp地址定铜,這樣vm無論何時(shí)啟動(dòng)都會(huì)獲取到相同的IP地址,你的開發(fā)和調(diào)試將會(huì)很順利很簡單怕敬。
私有網(wǎng)絡(luò)
當(dāng)采用如下配置語句時(shí)揣炕,vagrant建立的vm具有兩個(gè)hostonly網(wǎng)絡(luò):
config.vm.network "private_network", ip: "192.168.9.10"
config.vm.network "private_network", ip: "192.168.33.10"
標(biāo)識(shí)符“private_network”總是被映射為virtualbox的hostonly模型。
私有網(wǎng)絡(luò)模型是允許宿主機(jī)訪問的东跪,為了便于宿主機(jī)訪問畸陡,我們也可以明確指定一個(gè)適當(dāng)網(wǎng)段的地址。要知道適當(dāng)?shù)木W(wǎng)段是多少虽填,可以這樣查證:
- 通過進(jìn)入虛機(jī)顯示網(wǎng)卡信息和IP地址來了解網(wǎng)段丁恭。
- 打開 VirtualBox 的網(wǎng)絡(luò)配置,檢查HostOnly網(wǎng)絡(luò)的DHCP網(wǎng)段斋日。
混合網(wǎng)絡(luò)
當(dāng)采用如下配置語句時(shí)牲览,vagrant建立的vm具有一個(gè)NAT和一個(gè)hostonly網(wǎng)絡(luò):
config.vm.network "private_network", ip: "192.168.33.10"
標(biāo)識(shí)符“private_network”總是被映射為virtualbox的hostonly模型。
注意 NAT 網(wǎng)絡(luò)將被隱含地創(chuàng)建恶守。
vagrant在創(chuàng)建網(wǎng)卡時(shí)第献,如果配置文件僅配置了一個(gè)private_network,則vagrant自動(dòng)創(chuàng)建NAT網(wǎng)卡兔港,然后在創(chuàng)建配置文件所描述的網(wǎng)絡(luò)庸毫;而如果配置文件指定了兩個(gè)以上的private_network的話,vagrant不再自動(dòng)創(chuàng)建 NAT 網(wǎng)卡了衫樊。
混合網(wǎng)絡(luò)非常適合開發(fā)和測試環(huán)境岔绸,你可以通過NAT和Internet相通,然后多個(gè)vm之間也能相互通信橡伞。
內(nèi)外網(wǎng)絡(luò)
內(nèi)外網(wǎng)絡(luò)
只是我隨便命名的,也就是從vm的角度出發(fā)既有內(nèi)網(wǎng)(VM的私有網(wǎng)絡(luò))晋被,又有外網(wǎng)(宿主機(jī)所在的局域網(wǎng))兑徘。
當(dāng)采用如下配置語句時(shí),vagrant建立的vm具有一個(gè)bridged和一個(gè)hostonly網(wǎng)絡(luò):
config.vm.network "public_network"
config.vm.network "private_network", ip: "192.168.33.10"
這是比較通用的配置模式羡洛,vm既有host主機(jī)所在局域網(wǎng)的ip挂脑,又有一個(gè)私有網(wǎng)絡(luò)的ip地址,因此這些vm之間具有全連通性欲侮。
不過崭闲,一般來說開發(fā)和測試使用較為封閉的網(wǎng)絡(luò)模型是比較好的方式,通常不建議vm配置有 public_network 的網(wǎng)卡威蕉。
小結(jié)
任何
config.vm.network "private_network", ip: "192.168.33.10"
語句都可以改為:
config.vm.network "private_network", type: "dhcp"
這時(shí)virtualbox的網(wǎng)關(guān)負(fù)責(zé)dhcp應(yīng)答和分配IP刁俭。
實(shí)例
nginx服務(wù)
- 建立一個(gè)新的工作目錄
sample-nginx
- 使用
vagrant init ubuntu/xenial64
進(jìn)行初始化 - 修改
Vagrantfile
加入必要的聲明 (見后) - 使用
vagrant up
啟動(dòng)該虛擬機(jī),然后可以SSH進(jìn)入或者curl -i http://localhost:8080/
來嘗試訪問它
完整的 Vagrantfile
如下:
# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
# The most common configuration options are documented and commented below.
# For a complete reference, please see the online documentation at
# https://docs.vagrantup.com.
# Every Vagrant development environment requires a box. You can search for
# boxes at https://vagrantcloud.com/search.
config.vm.box = "ubuntu/xenial64"
# Disable automatic box update checking. If you disable this, then
# boxes will only be checked for updates when the user runs
# `vagrant box outdated`. This is not recommended.
# config.vm.box_check_update = false
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
# NOTE: This will enable public access to the opened port
config.vm.network "forwarded_port", guest: 80, host: 8080
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine and only allow access
# via 127.0.0.1 to disable public access
# config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
# Create a private network, which allows host-only access to the machine
# using a specific IP.
# config.vm.network "private_network", ip: "192.168.33.10"
# Create a public network, which generally matched to bridged network.
# Bridged networks make the machine appear as another physical device on
# your network.
# config.vm.network "public_network"
# Share an additional folder to the guest VM. The first argument is
# the path on the host to the actual folder. The second argument is
# the path on the guest to mount the folder. And the optional third
# argument is a set of non-required options.
# config.vm.synced_folder "../data", "/vagrant_data"
# Provider-specific configuration so you can fine-tune various
# backing providers for Vagrant. These expose provider-specific options.
# Example for VirtualBox:
#
# config.vm.provider "virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
# vb.memory = "1024"
# end
#
# View the documentation for the provider you are using for more
# information on available options.
# Enable provisioning with a shell script. Additional provisioners such as
# Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
# documentation for more information about their specific syntax and use.
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y nginx
SHELL
end
這是一個(gè)相當(dāng)簡單的實(shí)例韧涨。更復(fù)雜的初始化牍戚,可以考慮使用一個(gè)獨(dú)立的腳本文件來完成侮繁,而不是直接放在 Vagrantfile
中。