docker01 | docker02 |
---|---|
192.168.1.11 | 192.168.1.13 |
关闭防火墙和禁用selinux,更改主机名
[root@localhost ~]# hostnamectl set-hostname docker01 [root@localhost ~]# su - 上一次登录:二 12月 17 08:20:36 CST 2019从 192.168.1.1pts/0 上 [root@docker01 ~]# systemctl stop firealld Failed to stop firealld.service: Unit firealld.service not loaded. [root@docker01 ~]# setenforce 0 setenforce: SELinux is disabled [root@docker01 ~]# systemctl daemon-reload [root@docker01 ~]# systemctl restart docker 4.1 macvlan的单网络通信
4.1 macvlan的单网络通信
1) 打开网卡的混杂模式
//需要在docker01和docker02_上都进行操作。 [root@docker01 ~]# ip link show ens33 //查看网卡模式
[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 // 创建一个macvlan模式的网络 -o parent=绑定在哪张网卡之上 [root@docker01 ~]# docker network ls //查看网卡信息
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 [root@docker02 ~]# docker network ls
5)在docker02. 上,基于创建的macvlan网络运行一个容器,验证与docker01.上容器的通信。
[root@docker02 ~]# docker run -itd --name bbox2 --network mac_net1 --ip 172.22.16.20 busybox //基于busybox创建一个容器 [root@docker02 ~]# docker exec -it bbox2 /bin/sh //进入bbox2容器 / # ping 172.22.16.10 //ping一下docker01的主机
4.2macvlan的多网络通信
1) docker01和docker02验证内核模块8021q封装
macvlan需要解决的问题:基于真实的ens33网卡,生产新的虚拟网卡。
[root@docker01 ~]# modinfo 8021q //验证内核模块8021q封装
[root@docker01 ~]# modprobe 8021q //如果内核模块没有开启,运行上边的命令导入一下
2)docker01基于ens33创建虚拟网卡
修改ens33网卡配置文件
[root@docker01 ~]# cd /etc/sysconfig/network-scripts/ [root@docker01 network-scripts]# vim ifcfg-ens33
手动添加虚拟网卡配置文件
[root@docker01 ~]# cd /etc/sysconfig/network-scripts/ [root@docker01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10 //-p保留源文件或目录的属性 [root@docker01 network-scripts]# vim ifcfg-ens33.10 //修改ens33.10网卡配置文件 BOOTPROTO=none NAME=ens33.10 DEVICE=ens33.10 ONBOOT=yes IPADDR=192.168.10.10 PREFIX=24 GATEWAY=192.168.10.2 VLAN=yes
这里注意,IP要和ens33网段做一个区分, 保证网关和网段IP的一致性,设备名称和配置文件的-致性,并且打开VLAN支持模式。
创建第二个虚拟网卡配置文件
[root@docker01 network-scripts]# cp -p ifcfg-ens33.10 ifcfg-ens33.20 [root@docker01 network-scripts]# vim ifcfg-ens33.20 //修改ens33.20网卡配置文件 BOOTPROTO=none NAME=ens33.20 DEVICE=ens33.20 ONBOOT=yes IPADDR=192.168.20.20 PREFIX=24 GATEWAY=192.168.20.2 VLAN=yes
docker01上的操作,启用创建的虚拟网卡:
[root@docker01 network-scripts]# ifup ifcfg-ens33.10 [root@docker01 network-scripts]# ifup ifcfg-ens33.20 [root@docker01 network-scripts]# ifconfig //查看IP
3)docker02基于ens33创建虚拟网卡
修改ens33网卡配置文件
[root@docker02 ~]# cd /etc/sysconfig/network-scripts/ [root@docker02 network-scripts]# vim ifcfg-ens33
手动添加虚拟网卡配置文件
[root@docker02 ~]# cd /etc/sysconfig/network-scripts/ [root@docker02 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10 //-p保留源文件或目录的属性 [root@docker02 network-scripts]# vim ifcfg-ens33.10 //修改ens33.10网卡配置文件 BOOTPROTO=none NAME=ens33.10 DEVICE=ens33.10 ONBOOT=yes IPADDR=192.168.10.11 PREFIX=24 GATEWAY=192.168.10.2 VLAN=yes
这里注意,IP要和ens33网段做一个区分, 保证网关和网段IP的一致性,设备名称和配置文件的-致性,并且打开VLAN支持模式。
创建第二个虚拟网卡配置文件
[root@docker02 network-scripts]# cp -p ifcfg-ens33.10 ifcfg-ens33.20 [root@docker02 network-scripts]# vim ifcfg-ens33.20 //修改ens33.20网卡配置文件 BOOTPROTO=none NAME=ens33.20 DEVICE=ens33.20 ONBOOT=yes IPADDR=192.168.20.21 PREFIX=24 GATEWAY=192.168.20.2 VLAN=yes
docker02上的操作,启用创建的虚拟网卡:
[root@docker02 network-scripts]# systemctl restart network [root@docker02 network-scripts]# ifup ifcfg-ens33.10 [root@docker02 network-scripts]# ifup ifcfg-ens33.20 [root@docker02 network-scripts]# ifconfig //查看IP
4)docekr01和docker02基于虚拟网卡,创建macvlan网络
[root@docker02 network-scripts]# docker network create -d macvlan --subnet 172.16.10.0/24 --gateway 172.16.10.1 -o parent=ens33.10 mac_net10 //创建一个新的网卡基于ens33.10 [root@docker02 network-scripts]# docker network create -d macvlan --subnet 172.16.20.0/24 --gateway 172.16.20.1 -o parent=ens33.20 mac_net20 //创建一个新的网卡基于ens33.20
5)Docker01部署一个私有仓库
Docker01
docker pull registry //下载registry镜像 docker run -itd --name registry -p 5000:5000 --restart=always registry:latest //基于registry镜像,启动一台容器 docker tag busybox:latest 192.168.1.11:5000/busybox:v1 //把容器重命名一个标签 docker ps
vim /usr/lib/systemd/system/docker.service #13行修改 ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000 systemctl daemon-reload systemctl restart docker.service //重启docker docker push 192.168.1.11:5000/busybox:v1 //上传容器到私有仓库 docker images
Docker02
vim /usr/lib/systemd/system/docker.service #13行修改 ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000 systemctl daemon-reload systemctl restart docker.service //重启docker docker pull 192.168.1.11/busybox:v1 //下载刚刚上传的镜像
6)docker01和docker02基于busybox:v1镜像和网卡mac_net10,mac_net20,创建容器。
Docker01
[root@docker01 ~]# docker run -itd --name bbox10 --network mac_net10 --ip 172.16.10.10 192.168.1.11:5000/busybox:v1 [root@docker01 ~]# docker run -itd --name bbox20 --network mac_net20 --ip 172.16.20.20 192.168.1.11:5000/busybox:v1 **Docker02**
[root@docker02 ~]# docker run -itd --name bbox10 --network mac_net10 --ip 172.16.10.10 192.168.1.11:5000/busybox:v1 [root@docker02 ~]# docker run -itd --name bbox20 --network mac_net20 --ip 172.16.20.20 192.168.1.11:5000/busybox:v1
***这里只需注意,我们在这里的操作跟在docker01和上面的操作是一模一样的,操作顺序大致为:
验证8021q内核封装
基于ens33网卡创建新的虚拟网卡,ens33.10和ens33.20 (注意和docker01. 上的ens33.10和ens33.20必须是在同一-网段,且IP不能冲突)基于此网络运行容器。(注意和docker01 上的容器,都是基于刚刚创建的macvlan网络,但IP地址不能冲突)
7)验证
在docker01.上进入容器bbox10和docker02.上的bbox11进行通信。
在docker01.上进入容器bbox20和docker02.上的bbox21进行通信。
注意: VMware的网络必须设置为Bridge模式。
现在把docker01和docker02的网络模式设置为桥接模式
测试一下相同网卡的主机是否能ping通
[root@docker01 ~]# docker exec -it bbox10 /bin/sh / # ping 172.16.20.20
[root@docker02 ~]# docker exec -it bbox20 /bin/sh / # ping 172.16.20.20
5.Macvlan 的局限性
Macvlan 是将 VM 或容器通过二层连接到物理网络的近乎理想的方案,但它也有一些局限性:
1.Linux 主机连接的交换机可能会限制同一个物理端口上的 MAC 地址数量。虽然你可以让网络管理员更改这些策略,但有时这种方法是无法实行的(比如你要去给客户做一个快速的 PoC 演示)。
2.许多 NIC 也会对该物理网卡上的 MAC地址数量有限制。超过这个限制就会影响到系统的性能。
3.IEEE 802.11 不喜欢同一个客户端上有多个 MAC 地址,这意味着你的 Macvlan 子接口在无线网卡或 AP 中都无法通信。可以通过复杂的办法来突破这种限制,但还有一种更简单的办法,那就是使用 Ipvlan,感兴趣可以自己查阅相关资料。
6.总结
macvlan是一种网卡虚拟化技术,能够将一张网卡虚拟出多张网卡。
macvlan的特定通信模式,常用模式是bridge。
在Docker中,macvlan只支持bridge模式。
相同的macvlan可以通信,不同的macvlan二层无法通信,可以通过三层路由完成通信。
思考一下:
macvlan bridge和bridge的异同点
还有一种类似的技术,多张虚拟网卡共享相同MAC地址,但有独立的IP地址,这是什么技术?
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。