时间:2021-05-19
一、MacVlan
实现Docker的跨主机网络通信的方案有很多,如之前博文中写到的通过部署 Consul服务实现Docker容器跨主机通信
Macvlan工作原理:
Macvlan是Linux内核支持的网络接口。要求的Linux内部版本是v3.9–3.19和4.0+;
通过为物理网卡创建Macvlan子接口,允许一块物理网卡拥有多个独立的MAC地址和IP地址。虚拟出来的子接口将直接暴露在相邻物理网络中。从外部看来,就像是把网线隔开多股,分别接受了不同的主机上一样;
物理网卡收到包后,会根据收到包的目的MAC地址判断这个包需要交给其中虚拟网卡。
当容器需要直连入物理网络时,可以使用Macvlan。Macvlan本身不创建网络,本质上首先使宿主机物理网卡工作在‘混杂模式',这样物理网卡的MAC地址将会失效,所有二层网络中的流量物理网卡都能收到。接下来就是在这张物理网卡上创建虚拟网卡,并为虚拟网卡指定MAC地址,实现一卡多用,在物理网络看来,每张虚拟网卡都是一个单独的接口。
使用Macvlan注意:
工作示意图:
二、配置实例
实例1(实现容器基于macvlan的单网段跨主机通信)
实现效果:
两台centos 7.3,分别运行着docker服务;
两台docker服务器创建相同的一个MacVlan网络,使docker服务器上的容器可以实现跨主机通信。
开始配置
1、第一台docker服务器配置如下
[root@docker01 ~]# ip link set ens33 promisc on # 开启ens33网卡的混杂模式[root@docker01 ~]# ip link show ens33 # 确定查看的信息包含以下标红的字样2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:9f:33:9f brd ff:ff:ff:ff:ff:ff[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”指定绑定在哪张网卡之上[root@docker01 ~]# docker run -itd --name test1 --ip 172.22.16.10 --network mac_net1 busybox # 基于新创建的macvlan网络运行一个容器,并指定其IP确认运行的容器的IP地址
[root@docker01 ~]# docker exec test1 ip a # 查看IP,确定以下标红与配置的一样1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever6: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:16:10:0a brd ff:ff:ff:ff:ff:ff inet '172.22.16.10/24' brd 172.22.16.255 scope global eth0 valid_lft forever preferred_lft forever2、第二台docker服务器配置如下(与第一台docker服务器基本相似)
[root@docker02 ~]# ip link set ens33 promisc on # 开启混杂模式[root@docker02 ~]# ip link show ens33 2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:b5:bc:ed brd ff:ff:ff:ff:ff:ff[root@docker02 ~]# docker network create -d macvlan --subnet 172.22.16.0/24 --gateway=172.22.16.1 -o parent=ens33 mac_net1#创建一个与第一台docker服务器的网段、网关相同的macvlan。并绑定到物理网卡上。#为了可以直观的看出其他docker服务器上的macvlan和第这台是在同一个网段的。所以,建议设置的网络名称一样。[root@docker02 ~]# docker run -itd --name test2 --ip 172.22.16.11 --network mac_net1 busybox#运行一个容器,并指定是基于macvlan网络的#注意,其IP地址不要与其他docker服务器上的容器IP地址冲突确认运行的容器的IP地址
[root@docker02 ~]# docker exec test2 ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever6: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:16:10:0b brd ff:ff:ff:ff:ff:ff inet '172.22.16.11/24' brd 172.22.16.255 scope global eth0 valid_lft forever preferred_lft forever使用第二台docker服务器上的容器test2对第一台docker服务器上的容器test1进行ping测试
OK,跨主机的容器通信就通过macvlan实现了。由于使用混杂模式会造成物理网卡的MAC地址失效,所以容器并不能通过此模式进行与外网的通信。
实例2(基于macvlan的跨主机网络多网段的解决方案)
实现的效果如下:
开始配置:
1、第一台docker服务器配置如下
[root@docker01 ~]# ip link set ens33 promisc on # 开启ens33网卡的混杂模式#也就是开启网卡的多个虚拟interface(接口) [root@docker01 ~]# ip link show ens33 # 确定查看的信息包含以下标红的字样2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:9f:33:9f brd ff:ff:ff:ff:ff:ff[root@docker01 ~]# modinfo 8021q #查看是否加载8021q模块,如果有信息返回,则表示该模块已经加载modinfo 8021q命令返回的信息如下
2、第二台docker服务器配置如下(基本与第一台操作类似,要注意IP不要冲突)
[root@docker02 ~]# ip link set ens33 promisc on # 开启混杂模式[root@docker02 ~]# ip link show ens33 2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:b5:bc:ed brd ff:ff:ff:ff:ff:ff[root@docker02 ~]# modinfo 8021q返回信息可参考图一[root@docker02 ~]# modprobe 8021q #若没有加载8021q模块,则执行此命令[root@docker02 ~]# cd /etc/sysconfig/network-scripts/[root@docker02 network-scripts]# vim ifcfg-ens33 ...............#省略部分内容BOOTPROTO=manual [root@docker02 network-scripts]# scp root@192.168.171.151:/etc/sysconfig/network-scripts/ifcfg-ens33.* . # 要注意后面的“.”ifcfg-ens33.10 100% 128 83.4KB/s 00:00 ifcfg-ens33.20 100% 124 75.0KB/s 00:00 [root@docker02 network-scripts]# vim ifcfg-ens33.10 BOOTPROTO=noneNAME=ens33.10DEVICE=ens33.10ONBOOT=yesIPADDR=192.168.10.11 # 更改IP,以防和第一台冲突PREFIX=24GATEWAY=192.168.10.2VLAN=yes[root@docker02 network-scripts]# vim ifcfg-ens33.20 BOOTPROTO=noneNAME=ens33.20DEVICE=ens33.20ONBOOT=yesIPADDR=192.168.20.11PREFIX=24GATEWAY=192.168.20.2VLAN=yes[root@docker02 network-scripts]# ifdown ens33;ifup ens33 # 重启网卡 ,使配置生效[root@docker02 network-scripts]# ifup ens33.10 # 启动网卡[root@docker02 network-scripts]# ifup ens33.20#接下来创建macvlan网络,与第一台docker服务器创建的网络一样[root@docker02 ~]# docker network create -d macvlan --subnet 172.10.16.0/24 --gateway 172.10.16.1 -o parent=ens33.10 mac_net10[root@docker02 ~]# docker network create -d macvlan --subnet 172.20.16.0/24 --gateway 172.20.16.1 -o parent=ens33.20 mac_net20 [root@docker02 ~]# docker run -itd --name test3 --network mac_net10 --ip 172.10.16.11 busybox[root@docker02 ~]# docker run -itd --name test4 --network mac_net20 --ip 172.20.16.21 busybox配置至此,即可进行ping测试了,如果配置无误,则test3应该和test1互通(因为其都是基于mac_net10网络);test4应该和test2互通(同理)。
但test3和test1不能和test4和test2互通(因为其不是基于同一个虚拟局域网)。
容器test3 ping 容器test1测试(注意:若是使用vmware虚拟机进行测试,由于vmware的特性,需将其网络适配器改为“桥接模式”,而不是NAT模式等。否则无法通信)
容器test4 ping 容器test2测试:
至此,跨主机网络多网段已经实现,同样,各个容器无法与外网进行通信。若有耐心,还是建议阅读docker官方文档
到此这篇关于Docker 容器跨主机多网段通信解决方案的文章就介绍到这了,更多相关Docker 容器跨主机多网段通信内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、docker跨主机通信docker跨主机网络方案包括:docker原生的overlay和macvlan。第三方方案:常用的包括flannel、weave和c
Docker容器内不能联网的6种解决方案注:下面的方法是在容器内能ping通公网IP的解决方案,如果连公网IP都ping不通,那主机可能也上不了网(尝试ping
docker概述docker是一个开源的软件部署解决方案;docker也是轻量级的应用容器框架;docker可以打包、发布、运行任何的应用,这个也是docker
1、问题描述安装在docker容器里面的storage一直处于退出状态,导致文件无法存储。2、解决方案查看docker中安装的容器dockerps-a尝试启动容
为支持容器跨主机通信,Docker提供了overlaydriver,使用户可以创建基于VxLAN的overlay网络。VxLAN可将二层数据封装到UDP进行传输