docker 还开发了另一个支持跨主机容器网络的 driver:macvlan。

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

macvlan 的最大优点是性能极好,相比其他实现,macvlan 不需要创建 Linux bridge,而是直接通过以太 interface 连接到物理网络。下面我们就来创建一个 macvlan 网络。

准备测试环境

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

ip link set eth0 promisc on

[root@fdfs- ~]# ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN group default qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
inet6 ::/ scope host
valid_lft forever preferred_lft forever
: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu qdisc pfifo_fast state UP group default qlen
link/ether :::3e:3c:ef brd ff:ff:ff:ff:ff:ff
inet 192.168.16.6/ brd 192.168.16.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80:::ff:fe3e:3cef/ scope link
valid_lft forever preferred_lft forever

在两台主机上分别执行以下命令,创建macvlan 网卡(由于我们kvm主机没有做vlan配置,macvlan 复刻host的ip配置)

docker network create -d macvlan --subnet=192.168.16.0/ --gateway=192.168.16.1 -o parent=eth0 manet_1

启动两个 alpine 容器进行ping测试

[root@fdfs- ~]# docker run -d --network=manet_1 --ip=192.168.16.111 --name test1 alpine sleep
58c9e529e491689b6b4f2b6dc6c58103b4b9b84a77db2df7047eb5513205f2d7
[root@fdfs- ~]# docker run -d --network=manet_1 --ip=192.168.16.112 --name test2 alpine sleep
d5e23bf52dd149259ff5fee8cd777c0cee40fb789bc507e10b2cc54813db9e0d

 [root@fdfs-1 ~]# docker exec test1 ping 192.168.16.112
  PING 192.168.16.112 (192.168.16.112): 56 data bytes
  64 bytes from 192.168.16.112: seq=0 ttl=64 time=0.370 ms
  64 bytes from 192.168.16.112: seq=1 ttl=64 time=0.364 ms
  64 bytes from 192.168.16.112: seq=2 ttl=64 time=0.439 ms

 

[root@fdfs-2 ~]# docker exec test2 ping 192.168.16.111
  PING 192.168.16.111 (192.168.16.111): 56 data bytes
  64 bytes from 192.168.16.111: seq=0 ttl=64 time=1.418 ms
  64 bytes from 192.168.16.111: seq=1 ttl=64 time=0.403 ms
  64 bytes from 192.168.16.111: seq=2 ttl=64 time=0.409 ms

成功跨主机通信

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

 

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

但主机的网卡数量是有限的,如何支持更多的 macvlan 网络

好在 macvlan 不仅可以连接到 interface(如 eth0),也可以连接到 sub-interface(如 eth0.xxx)。

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

Linux 的网卡也能支持 VLAN(apt-get install vlan),同一个 interface 可以收发多个 VLAN 的数据包,不过前提是要创建 VLAN 的 sub-interface。

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

在交换机上,如果某个 port 只能收发单个 VLAN 的数据,该 port 为 Access 模式,如果支持多 VLAN,则为 Trunk 模式,所以接下来实验的前提是:

eth0 要接在交换机的 trunk 口上。不过我们用的是 VirtualBox 虚拟机,则不需要额外配置了。

     

docker网络 macvlan的更多相关文章

  1. centos7下安装docker(15.3跨主机网络-macvlan)

    除了ovrlay,docker还开发了另一个支持跨主机容器的driver:macvlan macvlan本身是linu kernel模块,其功能是允许在同一物理网卡上配置多了MAC地址,即:多个int ...

  2. VMWare Workstation 配置docker多macvlan网络方法

    VMWare Workstation 配置docker多macvlan网络方法 答案就是.....换VirtualBox 噗... VMWare Workstation host-only网络,三台虚 ...

  3. 【转】Docker网络详解及pipework源码解读与实践

    好文必转 原文地址: http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-prac ...

  4. Docker网络(五)--技术流ken

    本章内容 1.dokcer默认自带的几种网络介绍 2. 自定义网络 3. 容器间通信 4. 容器与外界交互 docker网络分为单个主机上的容器网络和多个主机上的哇网络,本文主要讲解单个主机上的容器网 ...

  5. 第 8 章 容器网络 - 072 - 一文搞懂各种 Docker 网络

    Docker 起初只提供了简单的 single-host 网络,显然这不利于 Docker 构建容器集群并通过 scale-out 方式横向扩展到多个主机上. 跨主机网络方案: Docker Over ...

  6. Docker 网络背后的原理探索

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 知其然而不知其 ...

  7. Docker网络和容器的通信

    Docker的本地网络实现其实就是利用了Linux上的网络命名空间和虚拟网络设备(特别是veth pair). 基本原理 直观上看,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)与外界 ...

  8. 5、Docker网络配置(单机)

    一.概述 以下内容参考:https://docs.docker.com/network/#network-drivers Docker容器和服务如此强大的原因之一是您可以将它们连接在一起,或者将它们连 ...

  9. docker 网络实践

    #docker 网络模式 环境 centos7. , Docker version -ce docker自带网络类型 bridge,host,none,container,overlay,macvla ...

随机推荐

  1. APIO2019 题解

    APIO2019 题解 T1 奇怪装置 题目传送门 https://loj.ac/problem/3144 题解 很容易发现,这个东西一定会形成一个环.我们只需要求出环的长度就解决了一切问题. 设环的 ...

  2. 解决使用脚手架构建项目缺失node_modules文件夹文件问题

    昨晚,在教我前端交流群里面的朋友搭建vue开发环境和构建vue项目的时候发现我自己之前能正常构建vue项目的现在却不行了,排查之下发现 通过脚手架构建项目的时候项目缺失了node_modules文件夹 ...

  3. Quantitative Strategies for Achieving Alpha(一)

    1. 怎么构建测试 所有的测试五等分,表明我们的回测的universe被分为五个组,根据我们要测试的公司因子的值. Quintiles provide a clear answer to that q ...

  4. 如何解决DEDE织梦友情链接字数限制与链接个数限制的问题?

    如何解决DEDE织梦友情链接字数限制与链接个数限制的问题!织梦网站非常适合网站搭建以及网站优化,而友情链接是做优化必不可少的模块,我们经常搭建织梦网站发现织梦系统的友情链接模板有时候会限制字数不显示以 ...

  5. 在 Postman 中报错:Self-signed SSL certificates are being blocked 的分析与解决

    http://www.shuijingwanwq.com/2019/02/18/3171/

  6. jquery获取元素

       let $lis = $('#sidebar-menu li[to]')//获取sidebar-menu下包含to属性的li

  7. 如何使 C++ 的 StringBuilder 提升 4350% 的性能?

    介绍 经常出现客户端打电话抱怨说:你们的程序慢如蜗牛.你开始检查可能的疑点:文件IO,数据库访问速度,甚至查看web服务. 但是这些可能的疑点都很正常,一点问题都没有. 你使用最顺手的性能分析工具分析 ...

  8. 【CF1247F】Tree Factory(构造)

    题意:给定一棵n个点的树,要求将一条可以随意标号的链通过若干次操作变成这棵树 一次操作是指若v不为根且v的父亲不为根,则将v以及v的子树移到v的父亲的父亲上 要求给出标号方案,操作次数以及方案 n&l ...

  9. 一文读懂跨平台框架 Flutter 的搭建与运行

    作者:个推iOS开发工程师 伊泽瑞尔 Flutter是Google推出的跨平台的解决方案,用以帮助开发者在 Android 和 iOS 两个平台开发高质量原生应用的全新移动 UI 框架. 之前我们为大 ...

  10. Matlab中imfilter()函数的用法

    Matlab中imfilter()函数的用法 功能:对任意类型数组或多维图像进行滤波.用法:B = imfilter(A,H) B = imfilter(A,H,option1,option2,... ...