Docker的跨主机网络

一、overlay的解决方案

为支持容器跨主机通信,Docker 提供了 overlay driver,使用户可以创建基于 VxLAN 的 overlay 网络。VxLAN 可将二层数据封装到 UDP 进行传输,VxLAN 提供与 VLAN 相同的以太网二层服务,但是拥有更强的扩展性和灵活性。

Docerk overlay 网络需要一个 key-value 数据库用于保存网络状态信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是Docker 支持的 key-vlaue 软件,我们这里使用 Consul。

环境限制:

必须安装key-value存储服务,如consul

宿主机已经安装docker engine

宿主机的hostname必须不同

实验环境:
docker01: 192.168.1.20
docker02: 192.168.1.21
docker03: 192.168.1.22

暂时不考虑防火墙和selinux安全问题。

将3台dockerhost防火墙和selinux全部关闭,并且分别更改主机名称。

在docker01上的操作。
//运行consul服务。

[root@docker01 ~]# docker run -d -p 8500:8500 -h consul --name consul --restart always progrium/consul -server -bootstrap

PS: 容器生产之后,我们可以通过浏览器访问consul服务,验证consul服务是否正常。访问dockerHost加映射端口。
在这里插入图片描述
修改docker02和docker03的docker配置文件
两台都修改

[root@docker02 ~]# vim /usr/lib/systemd/system/docker.service 
修改:
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.1.20:8500 --cluster-advertise=ens33:2376
[root@docker02 ~]# systemctl daemon-reload 
[root@docker02 ~]# systemctl restart docker

PS:返回浏览器consul服务界面,找到KEY/VALUE----> DOCKER---->NODES,会看到刚刚加入的docker02的信息。
在这里插入图片描述
在docker02上创建一个自定义网络

[root@docker02 ~]# docker network create -d overlay ov_net1

[root@docker02 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
16b11f2adc85        ov_net1             overlay             global

在docker02上创建的网络,我们可以看到它的SCOPE定义的是global(全局),意味着加入到consul这个服务的docker服务,都可以看到我们自定义的网络。

同理如果是用此网络创建的容器,会有两张网卡。
默认这张网卡的网段是10.0.0.0网段,如果想要docker01也可能看到这个网络,那么也只需在docker01的docker配置文件添加相应内容即可。

同理,因为是自定义网络,符合自定义网络的特性,可以直接通过docker容器的名称相互通信,当然也可以在自定义网络的时候,指定它的网段,那么使用此网络的容器也可以指定IP地址。
在这里插入图片描述

二、Docker跨主机网络方案之MacVlan

除了overlay,docker 还开发了另一个支持跨主机容器网络的 driver:macvlan。

macvlan 本身是 Linux kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址,即多个 interface,每个 interface 可以配置自己的 IP。macvlan 本质上是一种网卡虚拟化技术,Docker 用 macvlan 实现容器网络就不奇怪了。

macvlan 的最大优点是性能极好,相比其他实现,macvlan 不需要创建Linux bridge,而是直接通过以太 interface 连接到物理网络。下面我们就来创建一个 macvlan 网络。

实验环境:
dockert01: 192.168.1.20
docker02: 192.168.1.21
关闭防火墙和禁用selinux,更改主机名。

1、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
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

2.macvlan的多网络通信

在这里插入图片描述
1)docker01和docker02验证内核模块8021q封装

macvlan需要解决的问题:基于真实的ens33网卡,生产新的虚拟网卡。
~]# modinfo 8021q
 //如果内核模块没有开启,运行下边的命令导入一下 
 ~]# modprobe 8021q

2)基于ens33创建虚拟网卡

修改ens33网卡配置文件

[root@docker01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 

在这里插入图片描述
手动添加虚拟网卡配置文件

[root@docker01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10 
PS: -p 保留源文件或目录的属性 
[root@docker01 network-scripts]# vim ifcfg-ens33.10

在这里插入图片描述
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

在这里插入图片描述
3)docker01上的操作,启用创建的虚拟网卡

[root@docker01 network-scripts]# ifup ifcfg-ens33.10 
[root@docker01 network-scripts]# ifup ifcfg-ens33.20 
PS: 如果此时有重启网卡的操作,注意验证ens33.10和ens33.20网卡必须是 启用的,正在运行的,如果没有则再次开启即可。

4)基于虚拟网卡,创建macvlan网络

[root@docker01 network-scripts]# docker network create -d macvlan -- subnet 172.16.10.0/24 --gateway 172.16.10.1 -o parent=ens33.10 mac_net10 

[root@docker01 network-scripts]# docker network create -d macvlan -- subnet 172.16.20.0/24 --gateway 172.16.20.1 -o parent=ens33.20 mac_net20

5)基于上述创建的macvlan网络,运行对应的容器,不过这里需要注意,运行的容器与网络对应的网段相符合,还需要注意,IP地址的唯一性。

~]# docker run -itd --name bbox10 --network mac_net10 --ip 172.16.10.10 192.168.1.100:5000/busybox:v1 

~]# docker run -itd --name bbox20 --network mac_net20 --ip 172.16.20.20 192.168.1.100:5000/busybox:v1

6)在docker02上进行操作,创建网络及容器
这里只需注意,我们在这里的操作跟在docker01上的操作是一模一样的,操作顺序大致为:

1)验证8021q内核封装 
2)基于ens33网卡创建新的虚拟网卡,ens33.10和 ens33.20(注意和docker01上的ens33.10和ens33.20必须是在同一网段, 且IP不能冲突) 
3)基于此网络运行容器。(注意和docker01上的 容器,都是基于刚刚创建的macvlan网络,但IP地址不能冲突)

7)验证:
在docker01上进入容器bbox10和docker02上的bbox11进行通信。
在docker01上进入容器bbox20和docker02上的bbox21进行通信。

注意:VMware 的网络必须设置为Bridge模式。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hjyhjy0/article/details/113758186