0%

使用vagrant搭建分布式开发环境

基本需求

  • 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

    1568794799340

    NAT相关有NAT和NAT 网络两个选项,其区别是前者使用内置的NAT网络,网段为10.0.2.0/24,用户无法修改;后者可以用户定制,通过全局设定中进行配置,如下图。

    1568794685915

  • Host-only

    Host-only比较复杂,通过配置可以实现各种不同效果,有三种情况:

    • 默认

      1569048847567

    • 共享

      1569048891151

      这种情况在默认的基础上,为VM增加了连通外网效果。

    • 桥接

      1569048981963

      这种情况和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
2
config.vm.synced_folder "./share", "/share", create:true, mount_options:["dmode=775","fmode=664"]
config.vm.synced_folder ".","/vagrant",disabled:true

默认情况下,vagrant总是将Vagrantfile所在目录文件通过rsync同步到虚拟机的/vagrant目录,这个同步是单向的,上述配置禁用了这一点。然后配置了Vagrantfile所在目录下的share目录映射到虚拟机的/share目录,这是mount进去的,因此是双向的。

要映射文件夹,还需要在虚拟机中安装VirtualBox Guest Additions,以centos7为例,安装方法如下:

安装内核开发文件:

1
sudo yum install "kernel-devel-uname-r == $(uname -r)"

如果找不到对应内核开发文件,则更新内核:

1
2
sudo yum update kernel -y
init 6

安装编译工具:

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
2
3
4
sudo mkdir -p /mnt/iso
sudo mount -o loop VBoxGuestAdditions_6.0.10.iso /mnt/iso
cd /mnt/iso
sudo ./VBoxGuestAdditions.run

开发环境搭建

为了实现最开始的基本需求,我们只需要选择private_network即可,这时vagrant会为我们创建一个NAT网络和一个Host-only网络,前者可用于上网,后者用于虚拟机之间以及虚拟机和Host的互连,具体Vagrantfile文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

config.vm.synced_folder "./share", "/share", create:true, mount_options:["dmode=775","fmode=664"]

config.vm.synced_folder ".","/vagrant",disabled:true

config.vm.define "master" do |master|
master.vm.box = "centos/7"
master.vm.network "private_network", ip: "10.10.10.14", netmask: "255.255.0.0"
end
config.vm.define "node1" do |node1|
node1.vm.box = "centos/7"
node1.vm.network "private_network", ip: "10.10.10.15", netmask: "255.255.0.0"
end
config.vm.define "node2" do |node2|
node2.vm.box = "centos/7"
node2.vm.network "private_network", ip: "10.10.10.16", netmask: "255.255.0.0"
end
end
  • 虚拟机选用的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
-------------本文结束感谢您的阅读-------------