Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)

1.跨主机网络解决方案

docker原生的overlay和macvlan
第三方的flannel、weave、calico

众多网络方案是如何与docker集成在一起的?

libnetwork docker容器网络库
CNM (Container Network Model)这个模型对容器网络进行了抽象

Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第1张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第2张图片

2.macvlan网络方案的实现

Macvlan是一个新的尝试,是真正的网络虚拟化技术的转折点。
Linux实现非常轻量级,因为与传统的Linux Bridge隔离相比,
它们只是简单地与一个Linux以太网接口或子接口相关联,以实现网络之间的分离和与物理网络的连接。
Macvlan提供了许多独特的功能,并有充足的空间进一步创新与各种模式。
这些方法的两个高级优点是绕过Linux网桥的正面性能以及移动部件少的简单性。
删除传统上驻留在Docker主机NIC和容器接口之间的网桥留下了一个非常简单的设置,包括容器接口,直接连接到Docker主机接口。
由于在这些情况下没有端口映射,因此可以轻松访问外部服务。
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第3张图片

3.实验准备

(1)两台虚拟机
(2)两台虚拟机上添加两块虚拟网卡,并安装好相应的docker服务(因为我们模拟的是docker容器的跨主机访问)
清除两台主机上之前有关网络的设置,并激活新添加的网卡ens3。

[root@server1 ~]# docker network prune
[root@server1 ~]# docker network rm my_net1 my_net2
[root@server1 ~]# docker network ls 
NETWORK ID          NAME                DRIVER              SCOPE
f3aff7e4dad5        bridge              bridge              local
c5f20e91b8ca        host                host                local
0e8b7355d807        none                null                local
[root@server1 ~]# ip link set up eth1
[root@server1 ~]# ip addr

Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第4张图片
在这里插入图片描述
发现server1只有一块网卡
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第5张图片
发现server2也只有一块网卡
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第6张图片
在这里插入图片描述
给server1再添加一块网卡
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第7张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第8张图片
给server2再添加一块网卡
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第9张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第10张图片
添加完之后查看
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第11张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第12张图片

4.演示跨主机的容器之间的通信

macvlan本身是linxu kernel的模块,本质上是一种网卡虚拟化技术。
其功能是允许在同一个物理网卡上虚拟出多个网卡,通过不同的MAC地址在数据链路层进行网络数据的转发,
一块网卡上配置多个 MAC 地址(即多个 interface),每个interface可以配置自己的IP,
Docker的macvlan网络实际上就是使用了Linux提供的macvlan驱 动。
因为多个MAC地址的网络数据包都是从同一块网卡上传输,所以需要打开网卡的混杂模式ip link set eth1 promisc on。

Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第13张图片
打开server1和server2的ens3网卡的混杂模式
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第14张图片

[root@server1 ~]# ip link set ens3 promisc on
[root@server1 ~]# ip addr show | grep ens3

Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第15张图片

[root@server2 ~]# ip link set ens3 promisc on
[root@server2 ~]# ip addr show | grep ens3

在这里插入图片描述
注意:如果不开启混杂模式,会导致macvlan网络无法访问外界
具体在不使用vlan时,表现为无法ping通路由,无法ping通同一网络内其他主机

在两台主机上各创建macvlan网络

Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第16张图片
创建macvlan网络不同于桥接模式,需要指定网段和网关(因为要保证跨主机上网段和网关是相同的),并且都得是真实存在的
server1:

[root@server1 ~]# docker network create -d macvlan  --subnet 172.20.0.0/24 --gateway 172.20.0.1 -o parent=ens3 mac_net1
[root@server1 ~]# docker network ls 

Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第17张图片
server2:

[root@server1 ~]# docker network create -d macvlan  --subnet 172.20.0.0/24 --gateway 172.20.0.1 -o parent=ens3 mac_net1
[root@server1 ~]# docker network ls 

Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第18张图片
macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络
vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094

在两台主机上分别使用创建的macvlan1运行一个容器
server1:

[root@server1 ~]# docker run -it --name vm1 --network=mac_net1 --ip=172.20.0.10 ubuntu
root@12542041d9de:/# ip a

Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第19张图片
server2:

[root@server2 ~]# docker run -it  --name vm1  --network=mac_net1  --ip=172.20.0.11  ubuntu
root@f58a460f3e12:/# ip a

Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第20张图片
访问测试:sever2容器vm2中ping server1的vm1容器
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第21张图片
其实这就实现了不同宿主机上的容器之间的通信
macvlan模式不依赖网桥,所以brctl show查看并没有创建新的bridge
但是查看容器的网络,会看到虚拟网卡对应了一个interface是17

[root@server1 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.024290f2797b	no		
[root@server1 ~]# docker attach vm1
root@12542041d9de:/# ip a

Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第22张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第23张图片

查看宿主机的网络,17正是虚机的eth1网卡
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第24张图片
可见,容器的 eth0 就是宿主机的eth1通过macvlan虚拟出来的interface
容器的interface直接与主机的网卡连接,这种方案使得容器无需通过NAT和端口映射就能与外网直接通信(只要有网关)
在网络上看起来与其他独立主机没有区别
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第25张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第26张图片

macvlan会独占主机的网卡的解决方案

前面说过macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络
vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094
我们只需要在创建容器时使用vlan子接口就可以i解决:

查看server2的ip
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第27张图片
查看server1的ip
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第28张图片
在这里插入图片描述
在这里插入图片描述
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第29张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第30张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第31张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第32张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第33张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第34张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第35张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第36张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第37张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第38张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第39张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第40张图片
实现了同一宿主机上不同网段容器之间的通信
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第41张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第42张图片
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第43张图片
实现了不同宿主机上的容器之间的通信,也解决了独占网卡的问题
Docker学习(14)——Docker的跨主机网络访问(不同宿主机上的容器之间的通信)_第44张图片

你可能感兴趣的:(linux运维——企业实战)