Docker基础-13-网络-两个容器为什么能通信

本篇继续来学习Linux中的网络命名空间的知识。本篇不展开网络命名空间的学习,先来看看docker环境下的不同场景下(容器里和linux主机外层)网络命名空间的变化,有几个特点先拿出来,重点说明为什么两个容器很互相访问。

网络命名空间信息解读

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

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

 

第一个接口 lo,中文叫做环回。Lo是英文单词loopback的缩写,loop是循环的意思,所以叫环回,也有人叫回环。

第二个接口 ensXX, 注意哈,由于我这里是安装虚拟机,如果是实体机,这个接口可能是eth0,eh0表示第一块网卡,同理eth2表示第二块网卡。这里ens33肯定也是一个网卡接口的名称,我大胆猜测,ensXX是使用了vmware虚拟化服务才会叫这个名称。这个接口的state是UP状态。

第三个接口 docker0, 这个很重要。只要安装了docker,就一定有这个,而且名称就是docker0,不会有什么docker1之类的哈。这个docker0是Down的状态,也有IP地址和广播地址。

 

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

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

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

 

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

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

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

两张图对比,我们发现,容器里面也有网络命名空间,也有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 

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

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

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

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

 

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

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

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

这个图对比前面截图,就好理解了,为什么两个docker容器能互相通信的问题了。

发布了439 篇原创文章 · 获赞 149 · 访问量 64万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 精致技术 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览