快捷搜索:  汽车  科技

docker网络模式及原理(你知道docker容器间网络通信如何实现吗)

docker网络模式及原理(你知道docker容器间网络通信如何实现吗)通过ip a 我们可以查看当前用户主机的连接端口,前面是正常的接口我就不截图了我们主要关注下这两个接口,一个是docker0,另一个我们看名称是一个直连接口veth-pair,应该是与容器间的端口。ip l s veth0 netns test1 #veth0 端口加到test1 ip l s veth1 netns test2 #veth1 端口加到test2给veth0、veth1 配上IP 并启用[root@localhost hechong]# ip netns exec test1 ip a a 192.168.1.1/24 dev veth0 [root@localhost hechong]# ip netns exec test2 ip a a 192.168.1.2/24 dev veth1 [root@localhost hechong]# ip netns

docker容器间的通信使用Linux网络命名空间实现,下面我通过一个实验模拟下这个过程

docker网络模式及原理(你知道docker容器间网络通信如何实现吗)(1)

测试

下面我创建两个测试容器先做个实验

创建测试容器

docker run -d --name test1 busybox /bin/sh -c "while true;do sleep 3600;done"

docker run -d --name test2 busybox /bin/sh -c "while true;do sleep 3600;done"

不需要关注busybox image的作用,只需要知道这个容器会一直循环,使用这个容器的目的只是为了测试两个容器间的通讯

查询测试容器ip

docker网络模式及原理(你知道docker容器间网络通信如何实现吗)(2)

测试网络通信

这里我们测试下两个容器间的通信

docker网络模式及原理(你知道docker容器间网络通信如何实现吗)(3)

两容器通信正常,同主机下创建conrainer默认是可以通信的。

命名空间通信方式创建两个网络命名空间

docker网络模式及原理(你知道docker容器间网络通信如何实现吗)(4)

查看网络命名空间网络状况

docker网络模式及原理(你知道docker容器间网络通信如何实现吗)(5)

连通两个命名空间

想要连通两个命名空间,我们需要引入虚拟设备接口veth-pair,veth-pair都是成对出现的,连接两端。我们在这里使用veth-pair做桥梁,连接两个namespace.

docker网络模式及原理(你知道docker容器间网络通信如何实现吗)(6)

创建一对veth-pair veth0 veth1

ip l a veth0 type veth peer name veth1

我们在创建前先行查看了宿主机的端口,现在可以看到多了两个端口

docker网络模式及原理(你知道docker容器间网络通信如何实现吗)(7)

将端口加入test1 test2 命名空间

ip l s veth0 netns test1 #veth0 端口加到test1 ip l s veth1 netns test2 #veth1 端口加到test2给veth0、veth1 配上IP 并启用

[root@localhost hechong]# ip netns exec test1 ip a a 192.168.1.1/24 dev veth0 [root@localhost hechong]# ip netns exec test2 ip a a 192.168.1.2/24 dev veth1 [root@localhost hechong]# ip netns exec test1 ip l s veth0 up [root@localhost hechong]# ip netns exec test2 ip l s veth1 up测试连通

docker网络模式及原理(你知道docker容器间网络通信如何实现吗)(8)

docker容器间通信方式

有了上面直连两个命名空间的知识铺垫下面我们就可以来说说docker的容器通行方式了。在一台主机上的多个独立的容器,容器间会使用bridge模式。我们可以从图看,两个容器都连接到了docker0,连接方式就是veth-pair,docker0相当于一台交换机使得两容器间可以通信。

docker网络模式及原理(你知道docker容器间网络通信如何实现吗)(9)

主机接口

通过ip a 我们可以查看当前用户主机的连接端口,前面是正常的接口我就不截图了我们主要关注下这两个接口,一个是docker0,另一个我们看名称是一个直连接口veth-pair,应该是与容器间的端口。

docker网络模式及原理(你知道docker容器间网络通信如何实现吗)(10)

查询bridge连接

[root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE cb38d9e42a8c bridge bridge local 08eb693c2315 host host local 595580ae3010 none null local [root@localhost ~]# docker network inspect cb38d9e42a8c

docker网络模式及原理(你知道docker容器间网络通信如何实现吗)(11)

查询容器接口

docker网络模式及原理(你知道docker容器间网络通信如何实现吗)(12)

我们可以看到test1有eth0@if8 端口,我们再创建一个容器看看主机端口是否有增加。

docker网络模式及原理(你知道docker容器间网络通信如何实现吗)(13)

我们可以看到多了一个接口,这个接口就是新的容器与主机间的直连接口

作者:Maybe_ch

原文链接:https://blog.csdn.net/Maybe_ch/article/details/105528384

猜您喜欢: