为了实现多主机Docker容器的VLAN划分,把宿主机上的网卡桥接到各自的OVS网桥上,然后再为容器配置IPVLAN就可以了。我们实验环境如下,主机AB各有一块网卡enp0s3IP地址分别为10.10.101.105/2410.10.101.106/24。在主机A上创建两个容器test1test2,分别在VLAN 100VLAN 200上。在主机B上创建test3test4,分别在VLAN 100VLAN 200 上。最终,test1可以和test3通信,test2可以和test4通信。

拓扑图如下所示

Docker 网络 多主机Docker容器的VLAN划分_第1张图片

在主机A
创建Docker容器
docker run -itd --name test1 ubuntu /bin/bash

docker run -itd --name test2 ubuntu /bin/bash
划分VLAN
pipework ovs0 test1 192.168.0.1/24 @100

pipework ovs0 test2 192.168.0.2/24 @200
eth0桥接到ovs0
ip addr add 10.10.101.105/24 dev ovs0

ip addr del 10.10.101.105/24 dev eth0;

ovs-vsctl add-port ovs0 eth0
ip route del default

ip route add default gw 10.10.101.254 dev ovs0
在主机B
创建Docker容器
docker run -itd --name test3 ubuntu /bin/bash

docker run -itd --name test4 ubuntu /bin/bash
划分VLAN
pipework ovs0 test1 192.168.0.3/24 @100

pipework ovs0 test2 192.168.0.4/24 @200
eth0桥接到ovs0
ip addr add 10.10.101.106/24 dev ovs0

ip addr del 10.10.101.106/24 dev eth0;

ovs-vsctl add-port ovs0 eth0

ip route del default

ip route add default gw 10.10.101.254 dev ovs0
完成上面的步骤后,主机A上的test1和主机B上的test3容器就划分到了一个VLAN中,并且与主机A上的test2和主机B上的test4隔离(主机eth0网卡需要设置为混杂模式,连接主机的交换机端口应设置为trunk模式,即允许VLAN 100VLAN 200的包通过)。

注:除此之外,pipework还支持使用macvlan设备、设置网卡MAC地址等功能。不过,pipework有一个缺陷,就是配置的容器在关掉重启后,之前的设置会丢失。

Docker 网络 多主机Docker容器的VLAN划分_第2张图片

其中promisc表示网卡混杂模式

其他参数的含义:

UP: 表示网卡开启状态;
BROADCAST: 表示支持广播;
promisc: 表示网卡混杂模式;
RUNNING: 表示网卡的网线被接上;
MULTICAST: 表示支持组播;
MTU: 表示MaximumTrasmission Unit 最大传输单元(字节),即此接口一次所能传输的最大封包;
RX: 表示网络由激活到目前为止接收的数据包;
TX: 表示网络由激活到目前为止发送的数据包;
collisions: 表示网络信号冲突的情况;
txqueuelen: 表示传输缓冲区长度大小;

 

设置网卡工作模式

#ifconfig 网卡名 promisc 设置混杂

#ifconfig 网卡名 -promisc 取消混杂

Docker 网络 多主机Docker容器的VLAN划分_第3张图片

网卡工作模式有4种,分别是:
广播(Broadcast)模式
多播(Multicast)模式
单播模式(Unicast
混杂模式(Promiscuous
在混杂模式下的网卡能够接收一切通过它的数据,而不管该数据目的地址是否是它。如果通过程序将网卡的工作模式设置为“混杂模式”,那么网卡将接受所有流经它的数据帧,这实际上就是Sniffer工作的基本原理:让网卡接收一切他所能接收的数据。Sniffer就是一种能将本地网卡状态设成混杂(promiscuous)状态的软件,当网卡处于这种"混杂"方式时,它对所有遇到的每一个数据帧都产生一个硬件中断以便提醒操作系统处理流经该物理媒体上的每一个报文包。可见,Sniffer工作在网络环境中的底层,它会拦截所有的正在网络上传送的数据,并且通过相应的软件处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体布局。