Docker 初识 macvlan网络

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

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

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

准备实验环境


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

ip link set enp0s9 promisc on

确保 enp0s9 状态 UP 并且 promisc 模式已经生效。

                       

因为 host1 和 host2 是 VirtualBox 虚拟机,还需要在网卡配置选项页中设置混杂模式。

                           

当前实验环境如图所示:

扫描二维码关注公众号,回复: 11617059 查看本文章

                           

准备就绪,我们创建 macvlan 网络。

创建 macvlan 网络


准备好环境,今天在 host1 和 host2 中创建 macvlan 网络 mac_net1:

                    
注意:在 host2 中也要执行相同的命令

① -d macvlan 指定 driver 为 macvlan。

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

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

④ -o parent 指定使用的网络 interface。

在 host1 中运行容器 bbox1 并连接到 mac_net1。

                         

由于 host1 中的 mac_net1 与 host2 中的 mac_net1 本质上是独立的,为了避免自动分配造成 IP 冲突,我们最好通过 --ip 指定 bbox1 地址为 172.16.86.10。

在 host2 中运行容器 bbox2,指定 IP 172.16.86.11。

                         

验证 bbox1 和 bbox1 的连通性。

                          

bbox2 能够 ping 到 bbox1 的 IP 172.16.86.10,但无法解析 “bbox1” 主机名。

                          

可见 docker 没有为 macvlan 提供 DNS 服务,这点与 overlay 网络是不同的。

 

macvlan 网络结构分析


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

                     

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

                     

除了 lo,容器只有一个 eth0,请注意 eth0 后面的 @if4,这表明该 interface 有一个对应的 interface,其全局的编号为 4。根据 macvlan 的原理,我们有理由猜测这个 interface 就是主机的 enp0s9,确认如下:

                     

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

                         

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/108299393