Docker网络之Macvlan

本文介绍了Docker中Macvlan网络模式,包括bridge和802.1q trunk bridge两种模式,强调了Macvlan可能导致的IP地址管理和网络性能问题。此外,还提到了ipvlan作为Macvlan的替代方案以及ipv6的使用方法。

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

  • 容器直接连接物理网络,由物理网络负责分配IP地址,可能的结果是物理网络IP地址被耗尽,另一个后果是网络性能问题,物理网络中接入的主机变多,广播包占比快速升高而引起的网络性能下降问题。
  • 前边说过了,宿主机上的某张网上需要工作在‘混乱模式’下。
  • 从长远来看bridge网络与overlay网络是更好的选择,原因就是虚拟网络应该与物理网络隔离而不是共享。

创建Macvlan网络

Macvlan网络有两种模式:bridge模式与802.1q trunk bridge模式。

  • bridge模式,Macvlan网络流量直接使用宿主机物理网卡。
  • 802.1q trunk bridge模式,Macvlan网络流量使用Docker动态创建的802.1q子接口,对于路由与过虑,这种模式能够提供更细粒度的控制。

bridge模式

命令如下:

$ docker network create -d macvlan \
  --subnet=172.16.86.0/24 \
  --gateway=172.16.86.1  \
  -o parent=eth0 pub_net

上述命令中,-o parent=eth0表示使用的物理网卡名称。问题:应该不需要指定subnet与gateway,这个由物理网络决定。

对于subnet中指定的IP地址段,如果某个IP地址已经被占用,需要将这个地址排除在外,不能让它被分配,命令如下:

$ docker network create -d macvlan  \
  --subnet=192.168.32.0/24  \
  --ip-range=192.168.32.128/25 \
  --gateway=192.168.32.254  \
  --aux-address="my-router=192.168.32.129" \
  -o parent=eth0 macnet32

上述命令指定了子网网段,并且对可以使用的IP地址范围进行了更变更的限制,可使用范围被限制在192.168.32.128/25,并且不允许分配192.168.32.129,因此使用Macvlan网络时要注意IP地址的分配问题。

802.1q trunk bridge模式

命令如下:

$ docker network  create  -d macvlan \
    --subnet=192.168.50.0/24 \
    --gateway=192.168.50.1 \
    -o parent=eth0.50 macvlan50

注意其中的eth0.50,它是物理网卡eth0的从设备,由Docker负责创建。

使用ipvlan替换macvlan 

ipvlan,基于ip地址划分vlan,是一种三层网络虚拟化技术,命令如下:

$ docker network create -d ipvlan \
    --subnet=192.168.210.0/24 \
    --subnet=192.168.212.0/24 \
    --gateway=192.168.210.254  \
    --gateway=192.168.212.254  \
     -o ipvlan_mode=l2 ipvlan210

使用ipv6

命令如下:

$ docker network  create  -d macvlan \
    --subnet=192.168.216.0/24 --subnet=192.168.218.0/24 \
    --gateway=192.168.216.1  --gateway=192.168.218.1 \
    --subnet=2001:db8:abc8::/64 --gateway=2001:db8:abc8::10 \
     -o parent=eth0.218 \
     -o macvlan_mode=bridge macvlan216

原文:https://docs.docker.com/network/macvlan/#use-an-ipvlan-instead-of-macvlan 

### 配置Docker容器使用macvlan网络模式 为了使Docker容器能够利用macvlan网络,需先创建一个基于macvlan驱动的自定义网络。此过程涉及指定子网、网关以及父接口等参数。 对于已配置Docker守护程序支持IPv6的情况,可构建一个兼容IPv4与IPv6的macvlan双栈网络环境[^1]: ```bash $ docker network create -d macvlan \ --subnet=192.168.216.0/24 --subnet=192.168.218.0/24 \ --gateway=192.168.216.1 --gateway=192.168.218.1 \ --subnet=2001:db8:abc8::/64 --gateway=2001:db8:abc8::10 \ -o parent=eth0.218 \ -o macvlan_mode=bridge macvlan216 ``` 上述命令展示了如何创建名为`macvlan216`的新网络,并指定了两个不同范围内的IP地址池作为其可用资源的一部分;同时也设定了相应的默认网关用于路由流量进出该网络。另外还设置了物理主机上的实际网络接口(`parent`)来承载这个虚拟化的MACVLAN层,最后通过选项`macvlan_mode=bridge`表明采用的是桥接模式下的MACVLAN实现方式。 当完成以上操作之后,在启动新的容器实例时就可以关联到之前所建立好的macvlan网络上了。下面给出了一条具体的例子说明怎样运行一个新的CentOS镜像并将其加入至先前创建的那个具有特定名称(如这里假设为`mac1`)的macvlan网络之中[^3]: ```bash [root@lnmp ~]# docker run -itd --name=ztj1 --privileged=true --ip=172.18.0.2 --network=mac1 dokken/centos-7:latest ...... ``` 这条指令里包含了几个重要的部分:首先是给新启动出来的容器赋予了一个独一无二的名字叫做`ztj1`; 接着授予了超级用户权限以便于后续可能涉及到的一些特权级的操作; 然后为其分配了一个静态IP地址即`172.18.0.2`, 并且明确指出要连接上我们前面提到过的那个叫作`mac1` 的macvlan类型的网络。 值得注意的一点是在某些情况下如果想要调整全局性的网络设定的话,则可以通过编辑位于宿主机文件系统中的`daemon.json` 文件来进行更深层次定制化设置,例如修改默认使用的桥接网络的相关属性等等[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值