两个容器为什么能通信
  yyka2UPIbcp2 2023年11月02日 37 0

1网络命名空间信息解读

我在我docker机器,先不允许任何容器,如果有退出状态的容器,先把它给删除。保证了没有任何容器存在,我们来看看Linux本虚拟机的网络命名空间信息。

两个容器为什么能通信_命名空间

上面截图有三个接口,我都用红圈给圈出来。我们先来解释前面两个接口的具体含义,docker0这个肯定是安装了docker之后才有的,是吧。这个是我们最近几篇文章学习的核心。

  1. 第一个接口 lo,中文叫做环回。Lo是英文单词loopback的缩写,loop是循环的意思,所以叫环回,也有人叫回环。
  2. 第二个接口 ensXX, 注意哈,由于我这里是安装虚拟机,如果是实体机,这个接口可能是eth0,eh0表示第一块网卡,同理eth2表示第二块网卡。这里ens33肯定也是一个网卡接口的名称,我大胆猜测,ensXX是使用了vmware虚拟化服务才会叫这个名称。这个接口的state是UP状态。
  3. 第三个接口 docker0, 这个很重要。只要安装了docker,就一定有这个,而且名称就是docker0,不会有什么docker1之类的哈。这个docker0是Down的状态,也有IP地址和广播地址。

1.1启动一个容器查询ip add的效果

上面是没有启动容器的效果,下面我启动一个容器,看看这个效果。

两个容器为什么能通信_IP_02

发现启动了一个容器就产生一个新的网络接口,这个接口顺序不要管,我这里是46,还有一个特点,只要有容器运行,docker0这个接口的状态就由DOWN变成了UP。

1.2网络命名空间主要作用就是网络隔离

怎么理解这句网络隔离的话呢?

那么,我利用exec命令进入到这个容器,看看容器里面查询ip add会得到什么。

两个容器为什么能通信_IP_03

两张图对比,我们发现,容器里面也有网络命名空间,也有lo环回,还有eth0这个接口,并且还看得到ipv4地址。我们知道linux本机最后一个接口vethxxxxx这个是和我们运行容器有关系的,但是这个vethxxx和容器里面查询的网络命名空间信息不一样。这个不一样,就是网络命名空间起的隔离作用。

问题:外层linux 执行ifconfig查询最后一个接口veth74f458d@if45中的if45 和我们运行的容器查询的eth0@if46,这两个if45和if46有什么关系?

在这里,他们确实有关系,关系是成对出现,也就是if6和if7是一对。或者叫一根绳子上的两个节点,这样去描述。

验证if45和if46是一对

为了验证这个结果,我再启动一个容器,这个容器叫test2,启动命令是docker run -it  -d --name=test2 busybox

1.3在linux外层查询ip a的最新信息

两个容器为什么能通信_docker_04

到这里,外层由于新增一个运行容器,产生一个网络接口,这里我简称叫if47,那么test2容器里面ip add是不是有一个叫if48的呢?

两个容器为什么能通信_docker_05

我们果然看到了if47和if48是成对出现。这种成对关系,就避免了if45 和if46 或者if47和if48产生配对连接。这里,我们把绳子上两个节点这句话改一下,绳子换成网络中的线路,两个节点换成路由,所以这种成对出现,说明容器和容器外是可以进行网络通信的。If48能通和if47之间通信,而if47接口只能和docker0通信,同样if46也能通过if45找到docker0。

结论:docker0是多个容器之间能通信的关键点

1.4通过ping来验证docker0是通信的关键

我们上面截图,两个容器都有自己的IP地址,我们随便进入一个容器,来ping另外一个容器的IP,看看结果。

两个容器为什么能通信_docker_06

有两个容器,一个IP是0.2,另外一个是0.3,通过ping工具,说明两个IP的可达性。下面画一个图,来说明两个docker容器之间互相通信的原理。

两个容器为什么能通信_docker_07


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论