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

一、跨主机网络解决方案

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

1.2这些解决方案怎么和docker集成在一起?
libnetwork(docker容器网络库,
其中CNM (ContainerNetworkModel)是它的核心,它对容器网络进行了抽象)
docker(容器)——跨主机网络访问(不同宿主机上的容器之间的通信)_第1张图片
1.3macvlan网络方案实现(使用的是linux内核虚拟化技术,无需桥接,直接使用物理接口, 性能极好)

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

[root@server1 ~]# docker network prune  删除所有没有用的网卡
WARNING! This will remove all networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
my_net2
my_net1

[root@server1 ~]# docker network ls  
NETWORK ID          NAME                DRIVER              SCOPE
786dfb545dfd        bridge              bridge              local
18863c9f4ba7        host                host                local
0e2c1989739c        none                null                local

两台虚拟机上添加两块虚拟网卡,,并激活新添加的网卡;并安装好相应的docker服务(因为我们模拟的是docker容器的跨主机访问)

[root@server1 ~]# ip addr show  查看添加的网卡

在这里插入图片描述

[root@server2 ~]# ip addr show

在这里插入图片描述

激活网卡
[root@server2 ~]#  ip link set up ens38
[root@server1 ~]# ip link set up ens39
打开网卡混杂模式
[root@server2 ~]# ip link set ens38 promisc on
[root@server1 ~]# ip link set ens39 promisc on

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

三、开始在两台主机上各创建macvlan网络
3.1创建macvlan网络不同于桥接模式,需要指定网段和网关(因为要保证跨主机上网段和网关是相同的),并且都得是真实存在的
在server1上

[root@server1 ~]# docker network create -d macvlan --subnet 172.20.0.0/24 --gateway 172.20.0.1 -o parent=ens39 macvlan1
99b8434a4a3386377ab39d113c385d538fbbf641316039b754e729f682c6e088
[root@server1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
786dfb545dfd        bridge              bridge              local
18863c9f4ba7        host                host                local
99b8434a4a33        macvlan1            macvlan             local
0e2c1989739c        none                null                local

在server2上

[root@server2 ~]# docker network create -d macvlan --subnet 172.20.0.0/24 --gateway 172.20.0.1 -o parent=ens38 macvlan1
63394560a92b87f517f235f64a95797ab6f6d5ed9585b8f82eb1b3bcdc9e67ab
[root@server2 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
43a7f9cc642b        bridge              bridge              local
ec8757b5c70e        host                host                local
63394560a92b        macvlan1            macvlan             local
c73db7e6bb7d        none                null                local

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

运行容器,macvlan模型这里必须手动指定ip地址,如果不指定会自动分配,单调 递增,可能会冲突
[root@server2 ~]# docker run -it --name vm2 --network macvlan1 --ip 172.20.0.12 ubuntu
[root@server1 ~]# docker run -it --name vm1 --network macvlan1 --ip 172.20.0.11 ubuntu

docker(容器)——跨主机网络访问(不同宿主机上的容器之间的通信)_第2张图片
docker(容器)——跨主机网络访问(不同宿主机上的容器之间的通信)_第3张图片
访问测试:sever2容器vm2中ping server1的vm1容器
其实这就实现了不同宿主机上的容器之间的通信
macvlan模式不依赖网桥,所以brctl show查看并没有创建新的bridge

[root@server1 ~]# brctl show  没有桥接在br0上' 
bridge name	bridge id		STP enabled	interfaces
docker0		8000.024289ff8a42	no	
容器接口直接与主机网卡相连,无需NAT或端口映射	

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

[root@server1 ~]# docker network  create -d macvlan --subnet 172.21.0.0/24 --gateway 172.21.0.1 -o parent=ens39.1 macvlan2
125da079356597981b114bc96d0862b6d2cb3211f5b21a3739de4e9d351a69c0
[root@server1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
786dfb545dfd        bridge              bridge              local
18863c9f4ba7        host                host                local
99b8434a4a33        macvlan1            macvlan             local
125da0793565        macvlan2            macvlan             local
0e2c1989739c        none                null                local

docker(容器)——跨主机网络访问(不同宿主机上的容器之间的通信)_第4张图片
server2上

[root@server2 ~]# docker network  create -d macvlan --subnet 172.21.0.0/24 --gateway 172.21.0.1 -o parent=ens38.1 macvlan2
ef5870a887a94d360b305df25f3f9476c65f1c8f8ac53b7881dad056dac6f194
[root@server2 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
43a7f9cc642b        bridge              bridge              local
ec8757b5c70e        host                host                local
63394560a92b        macvlan1            macvlan             local
ef5870a887a9        macvlan2            macvlan             local
c73db7e6bb7d        none                null                local

docker(容器)——跨主机网络访问(不同宿主机上的容器之间的通信)_第5张图片

[root@server1~]# docker run -it --name vm3 --network macvlan2 --ip 172.21.0.11 ubuntu 
[root@server2 ~]# docker run -it --name vm5 --network macvlan2 --ip 172.21.0.12 ubuntu

docker(容器)——跨主机网络访问(不同宿主机上的容器之间的通信)_第6张图片
docker(容器)——跨主机网络访问(不同宿主机上的容器之间的通信)_第7张图片
实现了不同宿主机上的容器之间的通信,也解决了独占网卡的问题
两个容器互相ping对方ip
注意macvlan网络在二层是隔离的,所以不同macvlan容器不能通信,可以在三层通设置过网关连接(加路由),docker本身不做任何限制,像传统vlan那样管理即可。网络选型时对网络比较熟悉,选macvlan较好,因为只需要把网络设备调整好,docker方面基本不用做 什么调整’ 。

你可能感兴趣的:(网络,docker)