Docker跨主机网络方案之MacVlan
实验环境:
docker01 | 192.168.1.70 |
---|---|
docker02 | 192.168.1.50 |
关闭防火墙和禁用selinux,更该主机名:
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# hostnamectl set-hostname docker01
[root@localhost ~]# su -
macvlan的单网络通信
1)打开网卡的混杂模式
//需要在docker01和docker02上都进行操作
[root@docker01 ~]# ip link set ens33 promisc on
[root@docker01 ~]# ip link show ens33
2)在docker01上创建macvlan网络
在这里插入代码片[root@docker01 ~]# docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1
[root@docker01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
e6860af70e90 mac_net1 macvlan local
PS:-o parent=绑定在哪张网卡之上
3)基于创建的macvlan网络运行一个容器
[root@docker01 ~]# docker run -itd --name bbox1 --ip 172.22.16.10 --network mac_net1 busybox
4)在docker02上创建macvlan网络,注意与docker01上的macvlan网络一摸一样
[root@docker02 ~]# docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1
5)在docker02上,基于创建的macvlan网络运行一个容器,验证与docker01上容器的通信
[root@docker02 ~]# docker run -itd --name bbox2 --network mac_net1 --ip 172.22.16.20 busybox
macvlan的多网络通信
1)docker01和docker02验证内核模块8021q封装
macvlan需要解决的问题:基于真实的ens33网卡,生产新的虚拟网卡
[root@docker01 ~]# modinfo 8021q
//如果内核模块没有开启,运行下边命令导入一下
[root@docker01 ~]# modprobe 8021q
2)基于ens33创建虚拟网卡
//修改ens33网卡配置文件:
[root@docker01 ~]# cd /etc/sysconfig/network-scripts/
[root@docker01 network-scripts]# vim ifcfg-ens33
//修改:
BOOTPROTO=manual //手动模式
//手动添加虚拟网卡配置文件
[root@docker01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10
//PS:-p 保留源文件或目录的属性
[root@docker01 network-scripts]# vim ifcfg-ens33.10
BOOTPROTO=none
IPADDR=192.168.10.10
PREFIX=24
GATEWAY=192.168.10.1
NAME=ens33.10
DEVICE=ens33.10
ONBOOT=yes
VLAN=yes
//PS:这里注意,IP要和ens33网段做一个区分,保证网关和网段IP的一致性,设备名称和配置文件的一致性,并且打开VLAN支持模式
//创建第二个虚拟网卡配置文件
[root@docker01 network-scripts]# cp -p ifcfg-ens33.10 ifcfg-ens33.20
[root@docker01 network-scripts]# vim ifcfg-ens33.20
BOOTPROTO=none
IPADDR=192.168.20.20
PREFIX=24
GATEWAY=192.168.20.1
NAME=ens33.20
DEVICE=ens33.20
ONBOOT=yes
VLAN=yes
3)docker01上的操作,启用创建的虚拟网卡
[root@docker01 network-scripts]# ifup ifcfg-ens33.10
[root@docker01 network-scripts]# ifup ifcfg-ens33.20
4)基于虚拟网卡,创建macvlan网络
[root@docker01 ~]# docker network create -d macvlan --subnet 172.16.10.0/24 --gateway 172.16.10.1 -o parent=ens33.10 mac_net10
[root@docker01 ~]# docker network create -d macvlan --subnet 172.16.20.0/24 --gateway 172.16.20.1 -o parent=ens33.20 mac_net20
5)基于创建的虚拟网卡,创建macvlan网络
[root@docker02 ~]# docker network create -d macvlan --subnet 172.16.10.0/24 --gateway 172.16.10.1 -o parent=ens33.10 mac_net10
[root@docker02 ~]# docker network create -d macvlan --subnet 172.16.20.0/24 --gateway 172.16.20.1 -o parent=ens33.20 mac_net20
6)docker02上也创建虚拟网卡,并启用
[root@docker01 ~]# scp /etc/sysconfig/network-scripts/ifcfg-ens33.10 /etc/sysconfig/network-scripts/ifcfg-ens33.20 root@192.168.1.50:/etc/sysconfig/network-scripts/
[root@docker02 network-scripts]# vim ifcfg-ens33
BOOTPROTO=manual
[root@docker02 network-scripts]# vim ifcfg-ens33.10
BOOTPROTO=none
IPADDR=192.168.10.11
PREFIX=24
GATEWAY=192.168.10.1
NAME=ens33.10
DEVICE=ens33.10
ONBOOT=yes
VLAN=yes
[root@docker02 network-scripts]# vim ifcfg-ens33.20
BOOTPROTO=none
IPADDR=192.168.20.21
PREFIX=24
GATEWAY=192.168.20.1
NAME=ens33.20
DEVICE=ens33.20
ONBOOT=yes
VLAN=yes
[root@docker02 network-scripts]# ifup ifcfg-ens33.10
[root@docker02 network-scripts]# ifup ifcfg-ens33.20
7)基于macvlan网络创建容器,并指定IP地址,不过这里要注意,运行的同期与网络对应的网段相符合,还需要注意IP地址的唯一性
//docker01
[root@docker01 ~]# docker run -itd --name bbox10 --network mac_net10 --ip 172.16.10.10 192.168.1.70:5000/busybox:v1
[root@docker01 ~]# docker run -itd --name bbox20 --network mac_net20 --ip 172.16.20.20 192.168.1.70:5000/busybox:v1
//docker02
[root@docker02 ~]# docker run -itd --name bbox11 --network mac_net10 --ip 172.16.10.11 192.168.1.70:5000/busybox:v1
[root@docker02 ~]# docker run -itd --name bbox21 --network mac_net20 --ip 172.16.20.21 192.168.1.70:5000/busybox:v1
8)将VMware虚拟机的网络改为桥接
9)进入容器测试通信
在docker01上进入容器bbox10和docker02上的bbox11进行通信
在docker01上进入容器bbox20和docker02上的bbox21进行通信
[root@docker01 ~]# docker exec -it bbox10 /bin/sh
/ # ping 172.16.10.11
PING 172.16.10.11 (172.16.10.11): 56 data bytes
64 bytes from 172.16.10.11: seq=0 ttl=64 time=0.668 ms
64 bytes from 172.16.10.11: seq=1 ttl=64 time=0.335 ms
[root@docker01 ~]# docker exec -it bbox20 /bin/sh
/ # ping 172.16.20.21
PING 172.16.20.21 (172.16.20.21): 56 data bytes
64 bytes from 172.16.20.21: seq=0 ttl=64 time=0.584 ms
64 bytes from 172.16.20.21: seq=1 ttl=64 time=0.365 ms