docker 版本:Docker version 17.10.0-ce, build f4ffd25
操作系统版本:centos7.3
物理网卡虚拟化技术,将一张物理网卡虚拟化出多个网卡,每个都用独立的mac地址和ip地址
docker用macvlan优点:1、性能好,相比其他的实现,macvlan不需要创建linux bridge、直接通过物理网卡出去
缺点:vlan子接口和需要自己提前划出来,ip地址使用需要自己手动去配置。
准备
交换机:
1、创建vlan 这里使用vlan 100和vlan 200。
2、将两台container host连接的交换机口配置为trunk模式允许vlan 100和vlan200通过。
注意
1、使用macvlan网络时因为不使用bridge了所有网卡都是一个真实的物理设备,能进行三层转发。
服务器
1、使用container-1和container-2的eth0连接交换机;
操作
container-1和container-2分别执行
1 | vconfig add eth0 100 |
1 | vconfig add eth0 200 |
1 | ip link set eth0.100 up |
1 | ip link set eth0.200 up |
创建macvlan网络
在container-1和container-2上执行
1 | docker network create -d macvlan --subnet=192.168.100.0/24 --gateway=192.168.100.1 -o parent=eth0.100 mac_net100 |
1 | docker network create -d macvlan --subnet=192.168.200.0/24 --gateway=192.168.200.1 -o parent=eth0.200 mac_net200 |
mac_net100和mac_net200本质上是独立的,为了避免ip冲突,在run时手动指定ip ;
container-1上运行容器
1 | docker run -itd --name mac_net1 --ip=192.168.100.10 --network mac_net100 busybox |
1 | docker run -itd --name mac_net2 --ip=192.168.200.10 --network mac_net200 busybox |
container-2上运行容器
1 | docker run -itd --name mac_net3 --ip=192.168.100.20 --network mac_net100 busybox |
1 | docker run -itd --name mac_net4 --ip=192.168.200.20 --network mac_net200 busybox |
正常情况是container-1上的mac_net1能够container-2上的mac_net3通新,mac_net2能根mac_net4通信;
原理
1、mac_net100 ping mac_net300
2、因为macvlan的包是直接走子接口出去的,所以不用桥,也不用通过封包。
IPAM
MACVLAN需要用户自己管理subnet,自己分配地址,不同subnet通信依赖外部网关。