除了ovrlay,docker还开发了另一个支持跨主机容器的driver:macvlan

macvlan本身是linu kernel模块,其功能是允许在同一物理网卡上配置多了MAC地址,即:多个interface,每个interface可以配置自己的ip。macvlan本身是一种网卡虚拟化技术,Docker用macvlan实现容器网络就不奇怪了

macvlan最大的优点是性能极好,相比其他方案,macvlan不需要创建Linux bridge,而是直接通过以太interface连接到物理网络

准备实验环境:

我们会使用docker1和docker2上单独的网卡ens192和ens160创建macvlan。为保证多个MAC地址网络包都可以从ens190或者ens160通过,我们需要打开网卡的混杂模式

因为docker1号docker2是虚拟机,所以在网卡配置选项中设置混杂模式(注:我使用的是esxi的虚拟机,没有做这一步也可以)

当前试验环境如下:盗图

创建macvlan网络

docker network create -d macvlan --subnet 192.168.2.1/24 --gateway 192.168.2.1 -o parent=ens160 macnet1

注:macvlan网络是local网络,为了保证跨主机能够通信,用户需要自己管理IP subnet

与其他网络不同,docker 不会为macvlan网络创建网关,这里的网关应该是真实存在的,否则路由无法通

-o parent指定使用的网络interface

在docker2中也要执行相同的命令:docker network create -d macvlan --subnet 192.168.2.1/24 --gateway 192.168.2.1 -o parent=ens160 macnet1

在docker1中运行容器

docker network create -d macvlan --subnet 192.168.2.1/24 --gateway 192.168.2.1 -o parent=ens160 macnet1

在docker2中执行同样的操作:

验证docker1上的mac1与docker2上的mac2的连通性

两个不同主机之间的容器可以相互ping通,但是不能解析容器的主机名,可见docker没有为macvlan提供dns服务,这点与overlay是不同的

注:macvlan是物理中实实在在存在的网络,macvlan实际就是我们常用的网卡的子接口,类似于:eth0:1

macvlan网络结构分析:

macvlan不依赖linux bridge,brctl show可以确认macvlan没有创建新的bridge

查看一下容器mac1的网络设备:

除了lo,容器只有一个eth0,请注意:eth0后面还有@if2,表明该网卡有一个对应的interface,全局编号为2,。根据macvlan的原理,我们猜测这个interface就是ens192,

确认如下:

可见,容器的eth0就是ens192通过macvlan虚拟出来的interface。容器的interface直接与主机的网卡连接,这种方案是的容器无需通过NAT和端口映射就能与外网直接通信(只要有网关)在网络上与其他独立的主机没有区别

当前网络如图所示:

用sub-interface实现多macvlan网络

macvlan会独占主机的网卡,也就是说一个网卡只能创建一个macvlan网络,否则会报错:

但是主机host的网卡是有限的,如何支持更多的macvlan呢?

好在macvlan不仅可以连接到interface(如ens192)还可以连接到sub-interface(如:ens192.xxx)

VLAN是现代网络常用的网络虚拟化技术,它可以将物理的二层网络划分成多达4094个逻辑网络,这些网络在二层上是隔离的,每个逻辑网络(即VLAN)由VLAN ID区分,VLAN ID的取值唯1-4094

linux的网卡也能支持VLAN,同一个interface可以收发多个VLAN数据包,不过前提是要创建VLAN的sub-interface

比如:希望ens192同时支持VLAN10和VLAN20,则需要创建sub-interface ens192.10和ens192.20

在交换机上,如果某个port只能收发单个VLAN数据,该port为Access模式,如果支持多VLAN,则为trunk模式,因为我们在虚拟机上,所以无需配置

下面演示如何在ens192.10和ens192.20上创建macvlan网络

1.首先在docker1和docker2上创建vlan

2.创建网络

3.运行容器,分别使用macnet1和macnet2网络

4.验证网络的连通性

在mac1去ping mac2无法ping通,毕竟他们不在同一个网段 ,下面我们在docker1上做同样的操作

1.配置vlan

2.创建macvlan网络

3.运行容器,分别使用macnet3和macney4

4.验证容器的连通性

macnet3ping不通macnet4

我们再来试试docker1上的macnet3能不能ping通docker2上的macnet1,因为他们是在同一个网段

按正常来说他们是能够正常进行通信的,但是由于我的是在esxi的虚拟机上面做的实验,需要在esxi中设置ens192为trunk口,允许所有vlan通过后试验才会生效

即:同一个macvlan下的网络能ping通,不同的macvlan网络之间不能通信。但是更准确的说法是:不同的macvlan网络不能在二层上通信。在三层可以通过网关进行通信

现在的拓扑如下:盗图

下面测试通过启用网关的形式,使不同网段的macvlan打通

1.先将192。168.7.222配置成一个虚拟记得路由,设置网关并转发VLAN10和VLAN20的流量。当然使用物理路由也可以达到这种效果

确保192.168.7.222的IP Forwarding已经启用

sysctl net.ipv4.ip_forward查看是否开启转发,1表示开启,0表示没有开启

sysctl -w net.ipv4.ip_forward=1设置开启

2.在/etc/sysconfig/network-scripts/下设置192.168.7.222的sub-interface

3.将网关的IP配置到sub-interface:

ifconfig ens192.10 192.168.10.1 netmask 255.255.255.0 up

ifconfig ens192.10 192.168.20.1 netmask 255.255.255.0 up

4.设置防火墙规则;

iptables -t nat -A POSTROUTING -o eth2.10 -j MASQUERADE

iptables -t nat -A POSTROUTING -o eth2.20 -j MASQUERADE

iptables -A FORWARD -i eth2.10 -o eth2.20 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth2.20 -o eth2.10 -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A FORWARD -i eth2.10 -o eth2.20 -j ACCEPT
iptables -A FORWARD -i eth2.20 -o eth2.10 -j ACCEPT

5.当前的网络拓扑:盗图

现在不同的macvlan之间也可以进行通信

下面的图是容器之间的通信过程:盗图

1.因为容器在不同的网段,所以使用路由进行转发

macvlan网络的连通性和隔离性完全依赖VLAN,IP subnet和路由,docker 本身不做任何限制,用户可以像管理传统VLAN网络那样管理macvlan

centos7下安装docker(15.3跨主机网络-macvlan)的更多相关文章

  1. centos7下安装docker(12.2自定义网络)

    通常默认的情况下我们使用的是docker的bridge的网络,用户也可以根据自己的业务需要,创建user-defined docker 提供三种user-defined网络驱动:bridge,over ...

  2. docker(一) Centos7下安装docker

    docker(一) Centos7下安装dockerdocker(二) windows10下安装dockerdocker(三) 镜像和容器常用命令 docker(四) 使用Dockerfile构建镜像 ...

  3. CentOS7下安装docker(Docker系列1)

    CentOS7下安装docker 系统要求 为了安装docker,需要准备 64-bit的CentOS 7 删除非官方的Docker包 yum的仓库中有一个很旧的Docker包, 现在Docker官方 ...

  4. centos7下安装docker与镜像加速

    1.背景 centos7下安装docker 2.安装 第一步:检查是否为centos7版本 第二步:依赖环境安装 执行如下两个命令: yum -y install gcc yum -y install ...

  5. centos7下安装docker(15.2跨主机网络-overlay)

    为支持容器跨主机通信,Docker提供了overlay driver,使用户可以创建基于VxLAN的overlay网络.VxLAN可将二层数据封装到UDP进行传输,VxLAN提供与VLAN相同的以太网 ...

  6. centos7 下安装docker报错:You could try using...

    搞了台VPS,想要装docker,发现死活装不上,各种报错.之前系统是centos6,发现官方现在已经不支持centos6了,遂升级到centos7,然后还是出现下面这个错误. Error: Pack ...

  7. Docker系列04—跨主机网络方案(overlay/weave)

    在前面详细讲解了几种网络模式:none,host,bridge,container.他们解决了单个主机间的容器的通信问题,并不能实现多个主机容器之间的通信. 跨主机网络方案包括两大类: 1,docke ...

  8. centos7下安装docker(15.4跨主机网络-flannel)

    flannel是CoreOS开发的容器网络解决方案,flannel为每一个host分配一个subnet,容器从这些subnet中分配IP,这些IP可以在host之间路由,容器无需NAT和port ma ...

  9. centos7下安装docker(15.6docker跨主机网络---Weave)

    Weave是weaveworks开发的容器网络解决方案.weave创建的虚拟网络可以将部署在多个主机上的容器连接起来.对于容器来说,weave就像一个巨大的网络交换机,容器可以直接通信,无需NAT和端 ...

随机推荐

  1. codeM美团编程大赛初赛B轮D题(考验你的数学思维!)

    [编程题] 模 时间限制:1秒空间限制:32768K 给定四个正整数a,b,c,k,回答是否存在一个正整数n,使得a*n在k进制表示下的各位的数值之和模b为c.输入描述:第一行一个整数T(T < ...

  2. java算法-单向队列

    队列是一种:先进先出,后进后出的数据结构 单项队列: 从前面删除元素,从后面插入元素,跟现实中排队是一样的道理 这里我们用指针移动位置的方法.因为数组删除元素,如果我们要跟现实中排队效果一样,就需要移 ...

  3. canvas-7globleCompositeOperation.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. clipboard.js -- js实现将文本复制到剪贴板的方法

    资源 推荐使用:clipboard.js 官方教程地址:https://clipboardjs.com/#example-text 官方github地址:https://github.com/zeno ...

  5. Python Python实现批量安装android apk包

    基于Python实现批量安装android apk包 by:授客 QQ:1033553122 1.相关软件包及文件下载 下载地址:adb软件包及批量安装apk包的py文件.zip 2.测试环境 Win ...

  6. loadrunner脚本优化-ParameterList参数类型介绍

    脚本优化-Parameter List参数类型介绍 by:授客 QQ:1033553122 篇幅问题,这里采用网盘下载的方式和大家分享: 百度网盘分享: 链接: http://pan.baidu.co ...

  7. Visualization of Detail Point Set by Local Algebraic Sphere Fitting

    Refers to Dynamic Sampling and Rendering of Algebraic Point Set Surfaces Growing Least Squares for t ...

  8. leetcode-58.最后一个单词的长度

    leetcode-58.最后一个单词的长度 题意 给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但 ...

  9. .net 前端gb2312编码,后台获取参数乱码(因为表单提交的时候是utf-8编码 则在后台读取参数时会出现乱码)

    在表单中设置编码 ' accept-charset="utf-8"  '即可: <form id="login_submit" action=" ...

  10. java中的数据类型,运算符,字符串,输入输出,控制流,大数值,数组; 《java核心技术卷i》 第三章:java基本程序结构;

    <java核心技术卷i> 第三章:java基本程序结构: 每次看书,去总结的时候,总会发现一些新的东西,这次对于java的数组有了更深的了解: java中的数据类型,运算符,字符串,输入输 ...