基本需求
-
VM能够上网:用于VM安装软件
-
Host能够访问VM,且VM有固定IP:用于Host远程调试VM
-
VM之间能够互相访问:用于构成分布式环境
-
VM间文件共享
VirtualBox的网络模式
VirtualBox支持四种网络模式,常用的是NAT和Host-only两种,下图对四种网络模式进行了对比:
NAT | Bridged | Internal | Host-only(默认) | Host-only(共享) | Host-only(桥接) | |
---|---|---|---|---|---|---|
VM->Host | y | y | n | y(到Host-only Adapter) | y(虚拟机配置Host-only Adapter为网关) | y(无线网卡不行) |
Host->VM | n | y | n | y(从Host-only Adapter) | y(从Host-only Adapter) | y |
VM->Other Host | y | y | n | n | y | y |
Other Host->VM | n | y | n | n | n | y |
VM<->VM | n | y | 同网络名下可以 | y | y | y |
-
NAT
NAT相关有NAT和NAT 网络两个选项,其区别是前者使用内置的NAT网络,网段为10.0.2.0/24,用户无法修改;后者可以用户定制,通过全局设定中进行配置,如下图。
-
Host-only
Host-only比较复杂,通过配置可以实现各种不同效果,有三种情况:
-
默认
-
共享
这种情况在默认的基础上,为VM增加了连通外网效果。
-
桥接
这种情况和VirtualBox的桥接网络模式实现了一样的效果。这时HOST的网卡不能为无线网卡,在启用802.1x认证的网络也不行。
-
Vagrant的网络模式
Vagrant有三种网络模式,并不会覆盖具体虚拟机provider的所有网络模式。
网络模式 | 示例 | 对应VirtualBox网络模式 |
---|---|---|
Forwarded port | config.vm.network “forwarded_port”, guest: 80, host: 8080, protocol: “udp” | NAT |
Private network | config.vm.network “private_network”, ip: “192.168.50.4” | Host-only |
Public network | config.vm.network “public_network”, :bridge => ‘en1: Wi-Fi (AirPort)’ | Bridged |
如果只配置一个Private network,则vagrant会自动创建一个NAT和一个Host-only网络。
如果配置多余一个Private network,则vagrant就不会自动创建NAT,而是对应的多个Host-only网络。
虚拟机间文件共享
最简单的方式是将Host的某个文件夹映射到所有虚拟机中,通过Vagrant很容易做到这点:
1 | config.vm.synced_folder "./share", "/share", create:true, mount_options:["dmode=775","fmode=664"] |
默认情况下,vagrant总是将Vagrantfile所在目录文件通过rsync同步到虚拟机的/vagrant目录,这个同步是单向的,上述配置禁用了这一点。然后配置了Vagrantfile所在目录下的share目录映射到虚拟机的/share目录,这是mount进去的,因此是双向的。
要映射文件夹,还需要在虚拟机中安装VirtualBox Guest Additions,以centos7为例,安装方法如下:
安装内核开发文件:
1 | sudo yum install "kernel-devel-uname-r == $(uname -r)" |
如果找不到对应内核开发文件,则更新内核:
1 | sudo yum update kernel -y |
安装编译工具:
1 | sudo yum install kernel-devel gcc make -y |
下载VirtualBox Guest Additions:
1 | curl -L -O http://download.virtualbox.org/virtualbox/6.0.10/VBoxGuestAdditions_6.0.10.iso |
安装VirtualBox Guest Additions:
1 | sudo mkdir -p /mnt/iso |
开发环境搭建
为了实现最开始的基本需求,我们只需要选择private_network即可,这时vagrant会为我们创建一个NAT网络和一个Host-only网络,前者可用于上网,后者用于虚拟机之间以及虚拟机和Host的互连,具体Vagrantfile文件如下:
1 | # -*- mode: ruby -*- |
- 虚拟机选用的centos7
- 使用了multi-machine特性,在一个Vagrantfile中定义多个虚拟机,如上定义了3个虚拟机
- 在VirtualBox中创建Host-only Adapter,其网段为10.10.0.0/16,这样以上虚拟机会自动选择这个Host-only Adapter
- 如果虚拟机的ip+netmask和Host-only Adapter不是一个网段,则vagrant会自动创建一个Host-only Adapter,要避免这种情况,以便所有虚拟机使用的一个Host-only Adapter
使用方法:
启动所有虚拟机
1 | vagrant up |
关闭所有虚拟机
1 | vagrant halt |
启动某个虚拟机
1 | vagrant up master |
关闭某个虚拟机
1 | vagrant halt master |
登陆某个虚拟机
1 | vagrant ssh master |