• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    docker部署Macvlan实现跨主机网络通信的实现

    基本概念:

    Macvlan工作原理:

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

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

    使用Macvlan需要注意以下几点:

    项目环境:

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

    项目操作:

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

    docker01:

    (1)开启ens33网卡的混杂模式,开启网卡的多个虚拟interface(接口)

    [root@sqm-docker01 ~]# ip link set ens33 promisc on
    ##查看网卡的状态:
    [root@sqm-docker01 ~]# ip link show ens33

    (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
    

    docker02:(与docker01相同操作)

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

    //创建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)测试两个主机间的两个容器相互通信:

    注意事项:

    能ping通的原因是两个容器都是基于真实的ens33网卡的,所以宿主机上的ens33网卡必须能够相互通信。这种方式只能够ping通ip地址,是无法ping通容器名的。

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

    (1)首先查看主机内核的8021q模块:

    [root@sqm-docker01 ~]# modinfo 8021q

    ##如果没有查看到该模块,需要执行以下命令进行加载:
    [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:

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


    [root@sqm-docker01 network-scripts]# vim ifcfg-ens33

    基于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
    ##只保留以下选项:

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

    (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

    (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 

    [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


    [root@sqm-docker02 network-scripts]# vim ifcfg-ens33.20

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    [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

    //确保容器正常运行

    (6)测试容器之间能够跨主机通信:(注意:如果你是vmware环境的话,由于VMware虚拟机的原因,必须将两台主机默认的NAT模式修改为桥接模式才能够正常通信)
    test3与test1通信(相同网段):

    test4与test2通信(相同网段):

    排错思路:如果部署完主机间无法通信的话,首先确认防火墙或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

    [root@sqm-docker03 ~]# docker run -it --name t2 --network container:t1 busybox

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


    然后在t2容器中也可以看到此服务:

    以上就是部署网络栈的基本内容,自己也不是经常用到,就是为了实现其他容器能够共享其中一个容器中的资源。

    上一篇:解决Centos7 安装腾达U12无线网卡驱动问题
    下一篇:Nginx负载均衡/SSL配置的实现
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    docker部署Macvlan实现跨主机网络通信的实现 docker,部署,Macvlan,实现,跨,