vagrant 使用一个 ruby 语法的配置文件:Vagrantfile。

这个配置文件可以通过默认启动的方式自动生成一个。通常的教程会这么讲:

# 新建并切换到一个工作目录
mkdir /dev && cd /dev

# 拉回box镜像(略)
vagrant box add ubuntu/trusty64
# 使用想要的box进行工作目录的初始化,这个过程中将会创建出一个新的Vagrantfile,并且你可以在启动虚拟机前修改它。
# 同时,如果box尚未存在,这一过程中也会尝试去拉取box;不过大陆还是省了吧,具体我不介绍了。
vagrant init ubuntu/trusty64

# 启动虚拟机
vagrant up

# 进入虚拟机
vagrant ssh

通过上面的缺省步骤,你可以新建一个ubuntu 14的虚拟机,并且具有NAT网络配置,所以进入虚拟机后不仅能够正常上网,也能访问宿主机(IP)。

Vagrant所支持的网络模型实际上是依赖于Provider的,多数情况下采用Virtualbox作为provider时自然也就是支持virtualbox的典型网络模型:NAT,Hostonly,Bridge以及Internal。

下面摘抄Ubuntu论坛中的帖子关于这些网络模型的表述:

第一种 NAT模式

解释:
NAT模式是最简单的实现虚拟机上网的方式,你可以这样理解:Vhost访问网络的所有数据都是由主机提供的,vhost并不真实存在于网络中,主机与网络中的任何机器都不能查看和访问到Vhost的存在。
虚拟机与主机关系:
只能单向访问,虚拟机可以通过网络访问到主机,主机无法通过网络访问到虚拟机。
虚拟机与网络中其他主机的关系:
只能单向访问,虚拟机可以访问到网络中其他主机,其他主机不能通过网络访问到虚拟机。
虚拟机与虚拟机之间的关系:
相互不能访问,虚拟机与虚拟机各自完全独立,相互间无法通过网络访问彼此。
IP:10.0.2.15
网关:10.0.2.2
DNS:10.0.2.3
一台虚拟机的多个网卡可以被设定使用 NAT, 第一个网卡连接了到专用网 10.0.2.0,第二个网卡连接到专用网络 10.0.3.0,等等。默认得到的客户端ip(IP Address)是10.0.2.15,网关(Gateway)是10.0.2.2,域名服务器(DNS)是10.0.2.3,可以手动参考这个进行修改。
NAT方案优缺点:
笔记本已插网线时: 虚拟机可以访问主机,虚拟机可以访问互联网,在做了端口映射后(最后有说明),主机可以访问虚拟机上的服务(如数据库)。
笔记本没插网线时: 主机的“本地连接”有红叉的,虚拟机可以访问主机,虚拟机不可以访问互联网,在做了端口映射后,主机可以访问虚拟机上的服务(如数据库)。

第二种 Bridged Adapter模式

解释:
网桥模式是我最喜欢的用的一种模式,同时,模拟度也是相当完美。你可以这样理解,它是通过主机网卡,架设了一条桥,直接连入到网络中了。因此,它使得虚拟机能被分配到一个网络中独立的IP,所有网络功能完全和在网络中的真实机器一样。
虚拟机与主机关系:
可以相互访问,因为虚拟机在真实网络段中有独立IP,主机与虚拟机处于同一网络段中,彼此可以通过各自IP相互访问。
虚拟机于网络中其他主机关系:
可以相互访问,同样因为虚拟机在真实网络段中有独立IP,虚拟机与所有网络其他主机处于同一网络段中,彼此可以通过各自IP相互访问。
虚拟机于虚拟机关系:
可以相互访问,原因同上。
IP:一般是DHCP分配的,与主机的“本地连接”的IP 是同一网段的。虚拟机就能与主机互相通信。
笔记本已插网线时:(若网络中有DHCP服务器)主机与虚拟机会通过DHCP分别得到一个IP,这两个IP在同一网段。 主机与虚拟机可以ping通,虚拟机可以上互联网。
笔记本没插网线时:主机与虚拟机不能通信。主机的“本地连接”有红叉,就不能手工指定IP。虚拟机也不能通过DHCP得到IP地址,手工指定IP后,也无法与主机通信,因为主机无IP。
这时主机的VirtualBox Host-Only Network 网卡是有ip的,192.168.56.1。虚拟机就算手工指定了IP 192.168.56.*,也ping不能主机。

第三种 Internal模式

解释:
内网模式,顾名思义就是内部网络模式,虚拟机与外网完全断开,只实现虚拟机于虚拟机之间的内部网络模式。
虚拟机与主机关系:
不能相互访问,彼此不属于同一个网络,无法相互访问。
虚拟机与网络中其他主机关系:
不能相互访问,理由同上。
虚拟机与虚拟机关系:
可以相互访问,前提是在设置网络时,两台虚拟机设置同一网络名称。如上配置图中,名称为intnet。
IP: VirtualBox的DHCP服务器会为它分配IP ,一般得到的是192.168.56.101,因为是从101起分的,也可手工指定192.168.56.*。
笔记本已插网线时:虚拟机可以与主机的VirtualBox Host-Only Network 网卡通信
这种方案不受主机本地连接(网卡)是否有红叉的影响。

第四种 Host-only Adapter模式

解释:
主机模式,这是一种比较复杂的模式,需要有比较扎实的网络基础知识才能玩转。可以说前面几种模式所实现的功能,在这种模式下,通过虚拟机及网卡的设置都可以被实现。
我们可以理解为Vbox在主机中模拟出一张专供虚拟机使用的网卡,所有虚拟机都是连接到该网卡上的,我们可以通过设置这张网卡来实现上网及其他很多功能,比如(网卡共享、网卡桥接等)。
虚拟机与主机关系
默认不能相互访问,双方不属于同一IP段,host-only网卡默认IP段为192.168.56.X 子网掩码为255.255.255.0,后面的虚拟机被分配到的也都是这个网段。通过网卡共享、网卡桥接等,可以实现虚拟机于主机相互访问。
虚拟机与网络主机关系
默认不能相互访问,原因同上,通过设置,可以实现相互访问。
虚拟机与虚拟机关系
默认可以相互访问,都是同处于一个网段。
虚拟机访问主机 用的是主机的VirtualBox Host-Only Network网卡的IP:192.168.56.1 ,不管主机“本地连接”有无红叉,永远通。
主机访问虚拟机,用是的虚拟机的网卡3的IP: 192.168.56.101 ,不管主机“本地连接”有无红叉,永远通。
虚拟机访问互联网,用的是自己的网卡2, 这时主机要能通过“本地连接”有线上网,(无线网卡不行)

看起来很晃眼的是不是?

实际上用表格的话也还是很清晰的:

NAT Bridged Internal Hostonly
vm -> host × ×
host -> vm × × ×
vm -> others hosts × ×
others hosts => vm × × ×
vm <-> vm × same subnet  √

这张表格描述了virtualbox的网络模型。

Vagrant如何支持

vagrant通过配置文件能够支持virtualbox的NAT,Bridge以及Hostonly网络模型。

默认情况

当采用前文的缺省初始化和启动步骤是,vagrant建立的vm具有一个NAT网卡。

桥接网络

当采用如下配置语句时,vagrant建立的vm具有一个Bridged网络:

# 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"

此时,vm在宿主机所在的LAN中等价于一台物理机器。假如你具有LAN Router的管理权的话,这是很简单的一种开发模型:通过路由器的mac绑定为vm保留一个固定的dhcp地址,这样vm无论何时启动都会获取到相同的IP地址,你的开发和调试将会很顺利很简单。

私有网络

当采用如下配置语句时,vagrant建立的vm具有两个hostonly网络:

config.vm.network "private_network", ip: "192.168.9.10"
config.vm.network "private_network", ip: "192.168.33.10"

标识符“private_network”总是被映射为virtualbox的hostonly模型。

混合网络

当采用如下配置语句时,vagrant建立的vm具有一个NAT和一个hostonly网络:

config.vm.network "private_network", ip: "192.168.33.10"

标识符“private_network”总是被映射为virtualbox的hostonly模型。

vagrant在创建网卡时,如果配置文件仅配置了一个private_network,则vagrant自动创建NAT网卡,然后在创建配置文件所描述的网络;而如果配置文件指定了两个以上的private_network的话,vagrant不再自动创建 NAT 网卡了。

混合网络非常适合开发和测试环境,你可以通过NAT和Internet相通,然后多个vm之间也能相互通信。

内外网络

当采用如下配置语句时,vagrant建立的vm具有一个bridged和一个hostonly网络:

config.vm.network "public_network"
config.vm.network "private_network", ip: "192.168.33.10"

这是比较通用的配置模式,vm既有host主机所在局域网的ip,又有一个私有网络的ip地址,因此这些vm之间具有全连通性。

不过,一般来说开发和测试使用较为封闭的网络模型是比较好的方式,通常不建议vm配置有 public_network 的网卡。

小结

任何

config.vm.network "private_network", ip: "192.168.33.10"

语句都可以改为:

config.vm.network "private_network", type: "dhcp"

这时virtualbox的网关负责dhcp应答和分配IP。