一、MacVlan
实现Docker的跨主机网络通信的方案有很多,如之前博文中写到的通过部署 Consul服务实现Docker容器跨主机通信

    Macvlan工作原理:

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

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

    使用Macvlan注意:

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

工作示意图:
Docker 容器跨主机多网段通信解决方案
二、配置实例
实例1(实现容器基于macvlan的单网段跨主机通信)

    实现效果:

    两台centos 7.3,分别运行着docker服务;
    两台docker服务器创建相同的一个MacVlan网络,使docker服务器上的容器可以实现跨主机通信。

开始配置
1、第一台docker服务器配置如下

[root@docker01 ~]# ip link set ens33 promisc on             # 开启ens33网卡的混杂模式
[root@docker01 ~]# ip link show ens33      # 确定查看的信息包含以下标红的字样
2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:9f:33:9f brd ff:ff:ff:ff:ff:ff
[root@docker01 ~]# docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o pa
rent=ens33 mac_net1
#创建macvlan网络,指定网关、网段等信息,“-o”指定绑定在哪张网卡之上
[root@docker01 ~]# docker run -itd --name test1 --ip 172.22.16.10 --network mac_net1 busybox     # 基于新创建的macvlan网络运行一个容器,并指定其IP

确认运行的容器的IP地址

[root@docker01 ~]# docker exec test1 ip a     # 查看IP,确定以下标红与配置的一样
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
6: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:16:10:0a brd ff:ff:ff:ff:ff:ff
    inet '172.22.16.10/24' brd 172.22.16.255 scope global eth0
       valid_lft forever preferred_lft forever

2、第二台docker服务器配置如下(与第一台docker服务器基本相似)

[root@docker02 ~]# ip link set ens33 promisc on       # 开启混杂模式
[root@docker02 ~]# ip link show ens33
2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:b5:bc:ed brd ff:ff:ff:ff:ff:ff
[root@docker02 ~]# docker network create -d macvlan --subnet 172.22.16.0/24 --gateway=172.22.16.1 -o parent=ens33 mac_net1
#创建一个与第一台docker服务器的网段、网关相同的macvlan。并绑定到物理网卡上。
#为了可以直观的看出其他docker服务器上的macvlan和第这台是在同一个网段的。所以,建议设置的网络名称一样。
[root@docker02 ~]# docker run -itd --name test2 --ip 172.22.16.11 --network mac_net1 busybox
#运行一个容器,并指定是基于macvlan网络的
#注意,其IP地址不要与其他docker服务器上的容器IP地址冲突

确认运行的容器的IP地址

[root@docker02 ~]# docker exec test2 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
6: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:16:10:0b brd ff:ff:ff:ff:ff:ff
    inet '172.22.16.11/24' brd 172.22.16.255 scope global eth0
       valid_lft forever preferred_lft forever

使用第二台docker服务器上的容器test2对第一台docker服务器上的容器test1进行ping测试
Docker 容器跨主机多网段通信解决方案
OK,跨主机的容器通信就通过macvlan实现了。由于使用混杂模式会造成物理网卡的MAC地址失效,所以容器并不能通过此模式进行与外网的通信。

实例2(基于macvlan的跨主机网络多网段的解决方案)

    实现的效果如下:

        两台centos 7.3,分别运行着docker服务;
        每台宿主机创建了两个MacVlan网段供容器使用(172.10.16.0/24和172.20.16.0/24);
        第一台docker服务器上运行容器test1和test2,第二台docker服务器运行容器test3和test4。
        最终实现跨主机的同网段容器互相通信。

开始配置:
1、第一台docker服务器配置如下

[root@docker01 ~]# ip link set ens33 promisc on             # 开启ens33网卡的混杂模式
#也就是开启网卡的多个虚拟interface(接口)  
[root@docker01 ~]# ip link show ens33      # 确定查看的信息包含以下标红的字样
2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:9f:33:9f brd ff:ff:ff:ff:ff:ff
[root@docker01 ~]# modinfo 8021q
 #查看是否加载8021q模块,如果有信息返回,则表示该模块已经加载

modinfo 8021q命令返回的信息如下
Docker 容器跨主机多网段通信解决方案

[root@docker01 ~]# modprobe 8021q     #若没有加载8021q模块,则执行此命令
[root@docker01 ~]# cd /etc/sysconfig/network-scripts/
[root@docker01 network-scripts]# vim ifcfg-ens33  
                     ...................
BOOTPROTO=manual             # 将此配置项改为“manual”,也是手动的意思
[root@docker01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10             # 复制一份网卡配置文件,-p保留原本文件的属性
[root@docker01 network-scripts]# vim ifcfg-ens33.10
BOOTPROTO=none
NAME=ens33.10               #注意更改名称
DEVICE=ens33.10      #注意更改名称
ONBOOT=yes
IPADDR=192.168.10.11             # 给虚拟网卡设置一个IP
PREFIX=24
GATEWAY=192.168.10.2
VLAN=yes
[root@docker01 network-scripts]# cp ifcfg-ens33.10 ifcfg-ens33.20
[root@docker01 network-scripts]# vim ifcfg-ens33.20
BOOTPROTO=none
NAME=ens33.20
DEVICE=ens33.20
ONBOOT=yes
IPADDR=192.168.20.10               #  注意,此处的IP与ens33.10并不在同一网段
PREFIX=24
GATEWAY=192.168.20.2
VLAN=yes
[root@docker01 network-scripts]# ifdown ens33;ifup ens33          #重启网卡,使更改生效
[root@docker01 network-scripts]# ifup ens33.10      # 启动该网卡
[root@docker01 network-scripts]# ifup ens33.20     # 启动
[root@docker01 ~]# docker network create -d macvlan --subnet 172.10.16.0/24 --gateway 172.10.16.1 -o parent=ens33.10 mac_net10
#创建一个macvlan网络,给其定义一个网段、网关及绑定到ens33.10
[root@docker01 ~]# docker network create -d macvlan --subnet 172.20.16.0/24 --gateway 172.20.16.1 -o parent=ens33.20 mac_net20
#创建一个macvlan网络,给其定义一个网段、网关及绑定到ens33.20
#接下来分别基于刚刚创建的macvlan网络运行一个容器

2、第二台docker服务器配置如下(基本与第一台操作类似,要注意IP不要冲突)

[root@docker02 ~]# ip link set ens33 promisc on       # 开启混杂模式
[root@docker02 ~]# ip link show ens33
2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:b5:bc:ed brd ff:ff:ff:ff:ff:ff
[root@docker02 ~]# modinfo 8021q
返回信息可参考图一

[root@docker02 ~]# modprobe 8021q     #若没有加载8021q模块,则执行此命令
[root@docker02 ~]# cd /etc/sysconfig/network-scripts/
[root@docker02 network-scripts]# vim ifcfg-ens33
            ...............#省略部分内容
BOOTPROTO=manual        
[root@docker02 network-scripts]# scp root@192.168.171.151:/etc/sysconfig/network-scripts/ifcfg-ens33.* .                 # 要注意后面的“.”
ifcfg-ens33.10                                                       100%  128    83.4KB/s   00:00    
ifcfg-ens33.20                                                       100%  124    75.0KB/s   00:00  
[root@docker02 network-scripts]# vim ifcfg-ens33.10
BOOTPROTO=none
NAME=ens33.10
DEVICE=ens33.10
ONBOOT=yes
IPADDR=192.168.10.11           # 更改IP,以防和第一台冲突
PREFIX=24
GATEWAY=192.168.10.2
VLAN=yes
[root@docker02 network-scripts]# vim ifcfg-ens33.20

BOOTPROTO=none
NAME=ens33.20
DEVICE=ens33.20
ONBOOT=yes
IPADDR=192.168.20.11
PREFIX=24
GATEWAY=192.168.20.2
VLAN=yes
[root@docker02 network-scripts]# ifdown ens33;ifup ens33         # 重启网卡 ,使配置生效
[root@docker02 network-scripts]# ifup ens33.10     # 启动网卡
[root@docker02 network-scripts]# ifup ens33.20
#接下来创建macvlan网络,与第一台docker服务器创建的网络一样
[root@docker02 ~]# docker network create -d macvlan --subnet 172.10.16.0/24 --gateway 172.10.16.1 -o parent=ens33.10 mac_net10
[root@docker02 ~]# docker network create -d macvlan --subnet 172.20.16.0/24 --gateway 172.20.16.1 -o parent=ens33.20 mac_net20
[root@docker02 ~]# docker run -itd --name test3 --network mac_net10 --ip 172.10.16.11 busybox
[root@docker02 ~]# docker run -itd --name test4 --network mac_net20 --ip 172.20.16.21 busybox

配置至此,即可进行ping测试了,如果配置无误,则test3应该和test1互通(因为其都是基于mac_net10网络);test4应该和test2互通(同理)。
但test3和test1不能和test4和test2互通(因为其不是基于同一个虚拟局域网)。
容器test3 ping 容器test1测试(注意:若是使用vmware虚拟机进行测试,由于vmware的特性,需将其网络适配器改为“桥接模式”,而不是NAT模式等。否则无法通信)
Docker 容器跨主机多网段通信解决方案
容器test4 ping 容器test2测试:
Docker 容器跨主机多网段通信解决方案
至此,跨主机网络多网段已经实现,

Docker 容器跨主机多网段通信解决方案的更多相关文章

  1. Docker容器跨主机通信

    默认情况下Docker容器需要跨主机通信两个主机节点都需要在同一个网段下,这时只要两个Docker容器的宿主机能相互通信并且该容器使用net网络模式,改实现方式为网桥模式通信: 除此之外我们还可以通过 ...

  2. Docker容器跨主机通信之:OVS+GRE

    一.概述 由于docker自身还未支持跨主机容器通信,需要借助docker网络开源解决方案 OVS OpenVSwich即开放式虚拟交换机实现,简称OVS,OVS在云计算领域应用广泛,值得我们去学习使 ...

  3. Docker容器跨主机通信--overlay网络

    一.Docker主机间容器通信的解决方案 Docker网络驱动 Overlay: 基于VXLAN封装实现Docker原生Overlay网络 Macvlan: Docker主机网卡接口逻辑上分为多个子接 ...

  4. Docker容器跨主机通信之:直接路由方式

    一.Docker网络基本原理 直观上看,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)与外界相通,并可以收发数据包:此外,如果不同子网之间要进行通信,需要额外的路由机制. Docker ...

  5. docker容器跨主机网络overlay

    前提:已部署好docker服务服务预计部署情况如下10.0.0.134 Consul服务10.0.0.135 host1  主机名mcw510.0.0.134 host2  主机名mcw6host1与 ...

  6. overlay实现容器跨主机通信

    本节内容: Docker容器跨主机通信方案 环境信息 升级内核 安装docker 防火墙设置和开启内核转发 安装启动consul 启动Docker 创建overlay network 创建容器 测试容 ...

  7. Docker 网络管理及容器跨主机通信

    1.网络模式 docker支持四种网络模式,使用--net选项指定: host,--net=host,如果指定此模式,容器将不会获得一个独立的network namespace,而是和宿主机共用一个. ...

  8. centos7下安装docker(15.5容器跨主机网络--flanneld)

    flannel是由CoreOS研究的一种覆盖网络(overlay network)网络工具,目的是帮助每一个host主机有一个完整的子网: 功能是:让集群中不同节点的主机创建的容器都有一个唯一的虚拟I ...

  9. 【06】循序渐进学 docker:跨主机通信

    写在前面的话 目前解决容器跨主机通信的方案有很多种,这里给出的只是其中的一种,而且还不是最好的方案,不过归根结底,大同小异.在学习 docker swarm 之前,大家可以先看看这种. 啥是 over ...

  10. Docker:跨主机通信

    修改主机docker默认的虚拟网段,然后在各自主机上分别把对方的docker网段加入到路由表中,配合iptables即可实现docker容器夸主机通信.配置方法如下: 设有三台虚拟机 v1: 10.1 ...

随机推荐

  1. 开源即时通讯IM框架 MobileIMSDK v6.2 发布

    一.更新内容简介 本次更新为次要版本更新,进行了若干优化(更新历史详见:码云 Release Nodes).可能是市面上唯一同时支持 UDP+TCP+WebSocket 三种协议的同类开源IM框架. ...

  2. 【Windows】修改虚拟内存位置

    问题:系统优化中,希望将pagefile.sys文件(即虚拟内存)移动到其他盘中,在网上查找解决办法,找了很多,按照方法设置完成后,pagefile.sys文件依然存在,后来,找到了一篇文章解决了,现 ...

  3. w3cschool-memcached教程

    https://www.w3cschool.cn/memcached/ Memcached 教程 Memcached是一个自由开源的,高性能,分布式内存对象缓存系统.   手册简介 Memcached ...

  4. MySQL为Null导致的四大坑

    "兵马未动粮草先行",看完了相关的配置之后,我们先来创建一张测试表和一些测试数据. -- 如果存在 person 表先删除 DROP TABLE IF EXISTS person; ...

  5. DICOM 生成dcm文件

    using Dicom; using Dicom.Imaging; using Dicom.IO.Buffer; using System; using System.Collections.Gene ...

  6. layui table表格单元格动态合并,并设置隔行变色

    layui table表格单元格动态合并,并设置隔行变色,此代码只针对嵌套数组只有一层的时候有效,多个数组嵌套还在冥想当中!! 需求描述 我们知道在layui插件官方平台有个可以无限极单元格合并的模块 ...

  7. Hub PG walkthrough Easy

    刚刚做了一个太难得简直看不懂 现在来做个简单的找回信心 nmap ┌──(root㉿kali)-[/home/ftpuserr] └─# nmap -p- -A 192.168.132.25 Star ...

  8. ctfshow--web13 .user.ini上传和bak源码泄露

    upload.php.bak源码泄露了 审计一下 点击查看代码 <?php header("content-type:text/html;charset=utf-8"); $ ...

  9. LeetCode刷题:AddressSanitizer: heap-buffer-overflow问题请教||全局变量和引用传递的区别

    在刷 https://leetcode.cn/problems/sudoku-solver/description/ 遇到AddressSanitizer: heap-buffer-overflow的 ...

  10. Linux安装Kafka(依赖zookeeper)

    一.版本 kafka:kafka_2.12-2.4.0 zk:zookeeper-3.4.14 二.单机版安装 修改 server.properties ,支持外网访问 [1]创建日志文件夹: mkd ...