===============================
VirtualBox常用网络
===============================
NetworkAddress Translation(NAT)
NAT 是VirtualBox建立的虚拟机默认的形式. 虚拟机之间无法沟通, 虚拟机能连接外部网络. GuestOS只能看到从Host发来的数据请求, 但主机不能访问GuestOS(可以通过端口转发来访问虚拟机). 对于大数据平台, 虚拟机之间的数据传递是必要的, 因此不能使用NAT.

NAT Network或叫做NAT Service(注意不是NAT, 而是NAT Network)
这是在VirtualBox4.3时引入的一种新的NAT类型模式。虚拟机之间可以彼此连接, 但主机只能通过端口转发来访问虚拟机. 官网上说, NAT Network下虚拟机可以访问 Internet, 但我测试是不行的.
NAT service的工作原理和家用的路由器相似,系统群组在网络中应用这种模式来防止外部网络的直接访问,但能让系统内部通过TCP和UDP协议实现互访或访问系统外部网络。

Host-only 主机网络
则是虚拟机只能与主机彼此连接, 但不能访问外部网络.

Bridged networking 桥接网络
会将虚拟机添加到主机所在的局域网. 不好的是, 外部网络也能连接到虚拟机, 对虚拟机的安全不利.

Internal networking
可用于创建不同的虚拟机之间的访问机制,但是不能够访问物理主机和外部网路中的机器。

各个网络形式的特点, 看下图就能直观了.

官网上说, NAT Network下虚拟机可以访问 Internet, 但我测试是不行的.

===============================
网络形式选择和集群规划
===============================
不管是微服务集群还是大数据集群, 我们都希望各个机器都能相互连通. 效果最好是: VM1<->VM2, VM1(VM2)->Internet, VM1(VM2)<->Host

因办公环境IP限制, 所以不能采用 Bridged networking 桥接网络,
1. 为了实现 VM1(VM2)->Internet, GuestOS增加网卡1(eth0), 选择 NAT .
2. 为了实现 VM1(VM2)<->Host, GuestOS增加网卡2(eth1), 选择 Host-only 网络形式, 两个VM可关联Host的同一个Host-only网卡.
3. 为了实现 VM1<->VM2, GuestOS增加网卡3(eth2), 选择 NAT Network.

用下图能很清楚说明了各个网卡的作用.

一般的Linux集群都需要三个以上机器, 下面是集群的网络规划:

操作系统 机器名 集群内IP 办公网络IP
Windows hostos 192.168.1.1 10.224.1.100
Linux vm1 192.168.1.11 
Linux vm2 192.168.1.12
Linux vm3 192.168.1.13

===============================
配置实战
===============================

步骤1: 准备 VM1

虚拟机操作系统, 我选用的 boot2docker, 因为它非常小巧(不到100M), 同时预装了docker服务, boot2docker不好的地方是,  没法为将集群中的机器加到 /etc/hosts 文件中.

先使用如下命令创建vm1 的GuestOS母版, VM2和VM3 将都是VM1 的克隆版.
docker-machine create --driver virtualbox vm1

docker-machine 创建的 VM 过程, 会完成很多工作, 首先在Host主机上创建一个VirtualBox Host-Only虚拟网卡(IP被设置为 192.168.99 网段), 然后创建了虚机VM1, 并为VM1配置了两个网卡, 网卡1为NAT连接形式, 网卡2为Host-Only连接形式, 网卡2已开启了DHCP服务, 也就是说VM1的IP可能会变化, 稍后需将其修改为静态IP.

步骤2: 修改 VM1 eth1网卡的IP

使用下面命令获取 VM1 的初始IP,
docker-machine env vm1

获得IP为192.168.99.100, 然后用 putty 登陆 VM1, user/password 为 docker/tcuser

可以使用ifconfig eth1 192.168.1.12 命令设置eth1的IP, 但这中方法在Linux重启之后, IP信息将丢失.
不同Linux 发行版永久设置静态地址的方法不一样, 这里先说明修改 Docker2Boot VM的方法, 一般Linux的操作方法稍后介绍.

对于Boot2Docker 虚拟机, 每次启动都会重置/etc 和 /opt 目录, 所以不能像普通发行版操作, 我们增加一个 /var/lib/boot2docker/bootlocal.sh 文件, 在其中通过 ifconfig 设置 eth1 的IP地址.

sudo -i   # 先切换到 root账号
vi /var/lib/boot2docker/bootlocal.sh
#bootlocal.sh 内容如下:
ifconfig eth1 192.168.1.11 netmask 255.255.255.0 broadcast 192.168.1.255 up
hostname vm1
vi /var/lib/boot2docker/etc/hostname
#下行是内容
vm1

最后, 然后关闭vm1

步骤3: 修改HostOS主机上Host-Only adapter的IP
到目前为止, vm1的 Host-Only 连接形式的 ip 已经被修改为 192.168.1.11, 但Host主机的VirtualBox Host-Only虚拟网卡IP仍为 192.168.99.1, 不在一个网段, 是时候修改主机的IP为 192.168.1.1 .

操作步骤为: VirtualBox 界面的管理-全局设定, 然后选择网络, 然后选择"仅主机HostOnly网络", 选定那个 VirtualBox Host-Only Ethernet Adapter, 修改IP地址为: 192.168.1.1, 网络掩码为 255.255.255.0, 关闭DHCP服务器, 以确保GuestOS有一个固定的IP.

上面的步骤和下面的截图都是VirtualBox 4的, VirtualBox 5.2的配置和截图稍有变化, 主要是默认情况下HostOnly的 Ipv4 是自动分配, 我们需要修改注意这个为"手工分配", 设定 IP v4的地址, 这个IP地址就是HostOS的地址, 比如设置为 192.168.1.1

步骤4: 将 VM1 复制一份为 VM2

打开Virtualbox 软件, 在UI 上关闭VM1虚拟机, 复制一份为VM2并启动它, 修改 IP 和 hostname.

sudo -i   # 先切换到 root账号
vi /var/lib/boot2docker/bootlocal.sh
#bootlocal.sh 内容如下:
ifconfig eth1 192.168.1.12 netmask 255.255.255.0 broadcast 192.168.1.255 up
hostname vm2
vi /var/lib/boot2docker/etc/hostname
#下行是内容
vm2

最后, 然后关闭vm2.

步骤5: 将 VM1 复制一份为 VM3

操作方法同上.

===============================
CentOS Linux修改IP的方法
===============================
对于 RHEL/CentOS, 可修改 ifcfg-eth1 配置文件, 然后执行 service network restart 命令,
完整文件名为: /etc/sysconfig/network-scripts/ifcfg-eth1
文件内容如下:

DEVICE=eth1
IPADDR=192.168.1.11
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet NM_CONTROLLED=yes
PREFIX=
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
ARPCHECK=no

关于设置的说明:
ONBOOT 意思是开机即启动本网络设备
BOOTPROTO 可以取值为dhcp或none, 即是否启用dhcp

===============================
参考
===============================
http://xintq.net/2014/09/05/virtualbox/ , 很好的教程
http://xintq.net/2016/06/29/virtualbox-networking/ , 图文并茂显示各个网络的机制
https://bridge.grumpy-troll.org/2017/11/boot2docker-xhyve-dns/
https://segmentfault.com/a/1190000005650099

搭建VirtualBox虚拟机集群的更多相关文章

  1. centos6.6 虚拟机集群搭建

    1.centosos6.6下载 windows 64位: thunder://QUFodHRwOi8vbGludXguemh1YW5neGl0b25nLmNvbTo4MDgvMjAxNTAxL0Nlb ...

  2. 虚拟机搭建Zookeeper服务器集群完整笔记

    虚拟机搭建Zookeeper服务器集群完整笔记 本笔记主要记录自己搭建Zookeeper服务器的全过程,默认已经安装部署好Centos7. 一.虚拟机下Centos无法联网解决方案 1.首先调整虚拟机 ...

  3. 部署CentOS虚拟机集群

    1.在虚拟机中安装CentOS (1)使用CentOS-6.5-i386-minimal.iso.(2)创建虚拟机:打开Virtual Box,点击“新建”按钮,点击“下一步”,输入虚拟机名称为esh ...

  4. 超快速使用docker在本地搭建hadoop分布式集群

    超快速使用docker在本地搭建hadoop分布式集群 超快速使用docker在本地搭建hadoop分布式集群 学习hadoop集群环境搭建是hadoop入门的必经之路.搭建分布式集群通常有两个办法: ...

  5. hadoop搭建伪分布式集群(centos7+hadoop-3.1.0/2.7.7)

    目录: Hadoop三种安装模式 搭建伪分布式集群准备条件 第一部分 安装前部署 1.查看虚拟机版本2.查看IP地址3.修改主机名为hadoop4.修改 /etc/hosts5.关闭防火墙6.关闭SE ...

  6. CentOS 7 搭建PXC 数据库集群

    CentOS 7 搭建PXC 数据库集群 PXC( Percona XtraDB Cluster ) 特点如下: 1.同步复制,事务要么在所有节点提交或不提交,保证了数据的强一致性. 2.多主复制,可 ...

  7. 超详细!CentOS 7 + Hadoop3.0.0 搭建伪分布式集群

    超详细!CentOS 7 + Hadoop3.0.0 搭建伪分布式集群 ps:本文的步骤已自实现过一遍,在正文部分避开了旧版教程在新版使用导致出错的内容,因此版本一致的情况下照搬执行基本不会有大错误. ...

  8. 使用Vagrant创建多节点虚拟机集群

    摘要: 在前一篇博客中,我介绍了使用Vagrant快速创建虚拟机,但是所创建的只是单个虚拟机.这篇博客将介绍使用Vagrant创建多节点虚拟机集群,可以作为Hadoop,Spark以及Storm等分布 ...

  9. 使用docker搭建hadoop分布式集群

    使用docker搭建部署hadoop分布式集群 在网上找了非常长时间都没有找到使用docker搭建hadoop分布式集群的文档,没办法,仅仅能自己写一个了. 一:环境准备: 1:首先要有一个Cento ...

随机推荐

  1. Hdoj 2018.母牛的故事 题解

    Problem Description 有一头母牛,它每年年初生一头小母牛.每头小母牛从第四个年头开始,每年年初也生一头小母牛.请编程实现在第n年的时候,共有多少头母牛? Input 输入数据由多个测 ...

  2. 使用 sizeof 获取字符串数组的大小

    @2018-11-1 字符串组成的数组存放于指针数组中,使用 sizeof 获取数组大小 [验证] #include <stdio.h> #define BootScreen " ...

  3. luogu5019 [NOIp2018]铺设道路 (贪心)

    和NOIp2013 积木大赛一模一样 我在堆一格的时候,我把它尽量地往右去延伸 于是如果对于一个i,a[i-1]<a[i],那i在之前一定只堆过a[i-1]那么多,所以要再堆a[i]-a[i-1 ...

  4. [SCOI2008]奖励关(期望dp)

    你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃). 宝 ...

  5. ACM-ICPC 2018 南京赛区网络预赛 G Lpl and Energy-saving Lamps(线段树)

    题目链接:https://nanti.jisuanke.com/t/30996 中文题目: 在喝茶的过程中,公主,除其他外,问为什么这样一个善良可爱的龙在城堡里被监禁Lpl?龙神秘地笑了笑,回答说这是 ...

  6. java 判断元素是否在数组内

    一,先转为List,再使用contains()方法 String[] strArr = new String[] { "a", "b", "c&quo ...

  7. 洛谷P1848 书架

    好,我一直以为书架是splay,然后发现还有个优化DP的书架.妃的书架 蓝书和PPT上面都讲了,应该比较经典吧. 题意: 有n个物品,每个都有宽,高. 把它们分成若干段,使得每段的最大值的总和最小.且 ...

  8. [hdu6183][Color it]

    题目链接 题目大意 有一个矩阵,总共有4种操作 0:清空这个矩阵 1 x y c:将\((x,y)(1 \leq x ,y\leq 10^6)\)这个点加上一种颜色c\((0\leq c \leq 5 ...

  9. vcftools报错:Writing PLINK PED and MAP files ... Error: Could not open temporary file.解决方案

    一般来说有两种解决方案. 第一种:添加“--plink-tped”参数: 用vcftools的“--plink”参数生成plink格式文件时,小样本量测试可以正常生成plink格式,用大样本量时产生W ...

  10. increment/decrement/dereference操作符

    标题以上分别对于++/--/* #include <iostream> #include <cstddef> using namespace std; class INT { ...