Docker多主机网络(macvlan)

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通信依赖外部网关。