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

 

网络命名空间信息解读

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

docker 两个容器 拷贝文件 docker两个容器之间不通_命名空间

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

 

第一个接口 lo,中文叫做环回。Lo是英文单词loopback的缩写,loop是循环的意思,所以叫环回,也有人叫回环。lo其实是一个系统虚拟的环回接口,它的IP地址是127.0.0.1,利用这个接口可以实现系统内部发送和接收数据。上面我们看到环回接口的IPV4地址是127.0.0.1,这个所有linux环回都是这个IP地址。至于这个state后面紧跟着的是UNKNOW,为什么是这个,而不是UP或者DOWN呢?如果这个接口没有开启,那么这里是DOWN,如果这个接口开启之后还是显示UNKNOW, 那么说明这个接口需要和其他接口成对连接,这个状态才能改变。其他信息 如物理网卡地址,广播地址。Ipv6信息自己看看就好,其他字段不深究。

 

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

 

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

 

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

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

docker 两个容器 拷贝文件 docker两个容器之间不通_docker 两个容器 拷贝文件_02

发现启动了一个容器就产生一个新的网络接口,这个接口顺序不要管,我这里是7,说明之前我启动容器有接口顺序为4 5 6的。发现容器产生接口和这个docker0是有关系,具体什么关系,我们现在还不清楚。还有一个特点,只要有容器运行,docker0这个接口的状态就由DOWN变成了UP。

 

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

怎么理解这句网络隔离的话呢?上面我们Linux本机ip a得到了下图的网络命令空间信息

docker 两个容器 拷贝文件 docker两个容器之间不通_Docker基础_03

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

docker 两个容器 拷贝文件 docker两个容器之间不通_Docker网络_04

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

 

问题:外层linux 执行ip a查询最后一个接口veth2f33958@if6中的if6 和我们运行的容器查询的eth0@if7,这两个if6和if7有什么关系?

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

 

验证if6和if7是一对

为了验证这个结果,我再启动一个容器,这个容器叫test2,启动命令是docker run -d --name=test2 busybox /bin/sh -c "while true; do sleep 3600; done"

docker 两个容器 拷贝文件 docker两个容器之间不通_Docker基础_05

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

docker 两个容器 拷贝文件 docker两个容器之间不通_Docker基础_06

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

docker 两个容器 拷贝文件 docker两个容器之间不通_Docker网络_07

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

 

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

 

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

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

docker 两个容器 拷贝文件 docker两个容器之间不通_docker_08

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

docker 两个容器 拷贝文件 docker两个容器之间不通_Docker基础_09

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