docker部署Macvlan实现跨主机网络通讯

基本概念:

Macvlan工做原理:linux

  • Macvlan是Linux内核支持的网络接口。要求的Linux内部版本是v3.9–3.19和4.0+;
  • 经过为物理网卡建立Macvlan子接口,容许一块物理网卡拥有多个独立的MAC地址和IP地址。虚拟出来的子接口将直接暴露在相邻物理网络中。从外部看来,就像是把网线隔开多股,分别接受了不一样的主机上同样;
  • 物理网卡收到包后,会根据收到包的目的MAC地址判断这个包须要交给其中虚拟网卡。

当容器须要直连入物理网络时,可使用Macvlan。Macvlan自己不建立网络,本质上首先使宿主机物理网卡工做在‘混杂模式’,这样物理网卡的MAC地址将会失效,全部二层网络中的流量物理网卡都能收到。接下来就是在这张物理网卡上建立虚拟网卡,并为虚拟网卡指定MAC地址,实现一卡多用,在物理网络看来,每张虚拟网卡都是一个单独的接口。docker

  • 使用Macvlan须要注意如下几点:
  • 容器直接链接物理网络,由物理网络负责分配IP地址,可能的结果是物理网络IP地址被耗尽,另外一个后果是网络性能问题,物理网络中接入的主机变多,广播包占比快速升高而引发的网络性能降低问题;
  • 宿主机上的某张网上须要工做在‘混乱模式’下;
  • 前面说到,工做在混乱模式下的物理网卡,其MAC地址会失效,因此,此模式中运行的容器并不能与外网进行通讯,可是不会影响宿主机与外网通讯;
  • 从长远来看bridge网络与overlay网络是更好的选择,缘由就是虚拟网络应该与物理网络隔离而不是共享。

项目环境:

两台docker主机:(centos7)
docker01: 172.16.1.30
docker02: 172.16.1.31vim

项目操做:

实例一:macvlan跨主机单网络解决方案:

docker01:centos

(1)开启ens33网卡的混杂模式,开启网卡的多个虚拟interface(接口)
[root@sqm-docker01 ~]# ip link set ens33 promisc on
##查看网卡的状态:
[root@sqm-docker01 ~]# ip link show  ens33

docker部署Macvlan实现跨主机网络通讯

(2)建立macvlan网络:
[root@sqm-docker01 ~]# docker network  create -d macvlan --subnet 172.16.100.0/24 --gateway 172.16.100.1 -o parent=ens33 mac_net1

参数解释:
-o: 绑定在哪张网卡之上(基于ens33网卡)网络

(3)基于刚建立的网络运行一个容器:
[root@sqm-docker01 ~]# docker run -itd --name box1 --ip 172.16.100.10 --network mac_net1 busybox

docker部署Macvlan实现跨主机网络通讯

docker02:(与docker01相同操做)ide

开启混杂模式
[root@sqm-docker02 ~]# ip link set ens33 promisc on
[root@sqm-docker02 ~]# ip link  show ens33

docker部署Macvlan实现跨主机网络通讯

//建立macvlan网络
[root@sqm-docker02 ~]# docker network  create  -d macvlan --subnet  172.16.100.0/24 --gateway 172.16.100.1 -o parent=ens33 mac_net1
//运行一个容器:
[root@sqm-docker02 ~]# docker run -itd --name box2 --network mac_net1 --ip 172.16.100.20 busybox

(4)测试两个主机间的两个容器相互通讯:
docker部署Macvlan实现跨主机网络通讯性能

注意事项:
能ping通的缘由是两个容器都是基于真实的ens33网卡的,因此宿主机上的ens33网卡必须可以相互通讯。这种方式只可以ping通ip地址,是没法ping通容器名的。
测试

实例二:macvlan跨主机多网络解决方案:

(1)首先查看主机内核的8021q模块:
[root@sqm-docker01 ~]# modinfo  8021q

docker部署Macvlan实现跨主机网络通讯

##若是没有查看到该模块,须要执行如下命令进行加载:
[root@sqm-docker01 ~]# modprobe  8021q
开启路由转发:
[root@sqm-docker01 ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf 
[root@sqm-docker01 ~]# sysctl -p
net.ipv4.ip_forward = 1

(2)修改网络配置信息:
docker01:centos7

[root@sqm-docker01 ~]# cd /etc/sysconfig/network-scripts/
[root@sqm-docker01 network-scripts]# ls

docker部署Macvlan实现跨主机网络通讯
[root@sqm-docker01 network-scripts]# vim ifcfg-ens33
docker部署Macvlan实现跨主机网络通讯3d

基于ens33网卡进行建立子网卡:

[root@sqm-docker01 network-scripts]# cp -p ifcfg-ens33  ifcfg-ens33.10  #网卡名称自定义
[root@sqm-docker01 network-scripts]# cp -p ifcfg-ens33  ifcfg-ens33.20

-p:表示保留原有属性(权限)

//修改ens33.10网卡:
[root@sqm-docker01 network-scripts]# vim ifcfg-ens33.10
##只保留如下选项:

docker部署Macvlan实现跨主机网络通讯

//修改ens33.20网卡:
[root@sqm-docker01 network-scripts]# vim ifcfg-ens33.20 
配置与ens33.10相同,只需修改ip地址:

docker部署Macvlan实现跨主机网络通讯

(3)启动子网卡

[root@sqm-docker01 network-scripts]# ifup ifcfg-ens33.10 
[root@sqm-docker01 network-scripts]# ifup ifcfg-ens33.20
//查看网络信息
[root@sqm-docker01 network-scripts]# ifconfig

docker部署Macvlan实现跨主机网络通讯

(4)基于ens33.10和ens33.20建立macvlan网络:
注意:网段不一样,网络名称不一样

[root@sqm-docker01 ~]# docker network  create -d macvlan --subnet 172.16.200.0/24 --gateway 172.16.200.1 -o parent=ens33.10 mac_net10

[root@sqm-docker01 ~]# docker network  create -d macvlan --subnet 172.16.210.0/24 --gateway 172.16.210.1 -o parent=ens33.20 mac_net20

(5)基于以上网络分别运行2个容器:

[root@sqm-docker01 ~]# docker run -itd --name test1 --ip 172.16.200.10 --network mac_net10 busybox

[root@sqm-docker01 ~]# docker run -itd --name test2 --ip 172.16.210.10 --network mac_net20 busybox

部署docker02:
基本与docker01操做相同,注意网段的相同,但主机ip得不一样。
#如下操做将不作解释:

开启路由转发:
[root@sqm-docker01 ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf 
[root@sqm-docker01 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@sqm-docker02 network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@sqm-docker02 network-scripts]# vim ifcfg-ens33

docker部署Macvlan实现跨主机网络通讯

[root@sqm-docker02 network-scripts]# cp -p ifcfg-ens33  ifcfg-ens33.10
[root@sqm-docker02 network-scripts]# cp -p ifcfg-ens33  ifcfg-ens33.20

[root@sqm-docker02 network-scripts]# vim ifcfg-ens33.10
docker部署Macvlan实现跨主机网络通讯
[root@sqm-docker02 network-scripts]# vim ifcfg-ens33.20
docker部署Macvlan实现跨主机网络通讯

[root@sqm-docker02 network-scripts]# ifup ifcfg-ens33.10 
[root@sqm-docker02 network-scripts]# ifup ifcfg-ens33.20
//建立macvlan网络:
[root@sqm-docker02 ~]# docker network  create  -d macvlan  --subnet 172.16.200.0/24 --gateway 172.16.200.1 -o parent=ens33.10 mac_net10

[root@sqm-docker02 ~]# docker network  create  -d macvlan  --subnet 172.16.210.0/24 --gateway 172.16.210.1 -o parent=ens33.20 mac_net20
//运行容器(ip地址不一样):
[root@sqm-docker02 ~]# docker run -itd --name  test3 --network mac_net10 --ip 172.16.200.11  busybox

[root@sqm-docker02 ~]# docker run -itd --name  test4 --network mac_net20 --ip 172.16.210.11  busybox

//确保容器正常运行
docker部署Macvlan实现跨主机网络通讯

(6)测试容器之间可以跨主机通讯:(注意:若是你是vmware环境的话,因为VMware虚拟机的缘由,必须将两台主机默认的NAT模式修改成桥接模式才可以正常通讯)
test3与test1通讯(相同网段):
docker部署Macvlan实现跨主机网络通讯

test4与test2通讯(相同网段):
docker部署Macvlan实现跨主机网络通讯

排错思路:若是部署完主机间没法通讯的话,首先确认防火墙或iptables规则是否关闭或放行,是否禁用selinux,其次排查ens33的网卡配置文件及其子网卡内容是否修改错误,最后排查你建立macvlan网络是是否网段定义错误,或者在运行容器是否ip地址指定不正确。

----------------------macvlan多网络跨主机实现通讯部署完毕---------------------

扩展知识点:
假设咱们运行了一个t1容器,而后t2容器使用t1容器的网络栈。

[root@sqm-docker03 ~]# docker run -itd --name   t1 busybox
[root@sqm-docker03 ~]# docker exec t1 ip a

docker部署Macvlan实现跨主机网络通讯

[root@sqm-docker03 ~]# docker run -it --name t2 --network container:t1 busybox
docker部署Macvlan实现跨主机网络通讯

//接下来在t1容器中操做:
[root@sqm-docker03 ~]# docker exec -it   t1 bin/sh

docker部署Macvlan实现跨主机网络通讯
而后在t2容器中也能够看到此服务:
docker部署Macvlan实现跨主机网络通讯

以上就是部署网络栈的基本内容,本身也不是常常用到,就是为了实现其余容器可以共享其中一个容器中的资源。

———————— 本文至此结束,感谢阅读 ————————

相关文章
相关标签/搜索