1网络命名空间信息解读
我在我docker机器,先不允许任何容器,如果有退出状态的容器,先把它给删除。保证了没有任何容器存在,我们来看看Linux本虚拟机的网络命名空间信息。
上面截图有三个接口,我都用红圈给圈出来。我们先来解释前面两个接口的具体含义,docker0这个肯定是安装了docker之后才有的,是吧。这个是我们最近几篇文章学习的核心。
- 第一个接口 lo,中文叫做环回。Lo是英文单词loopback的缩写,loop是循环的意思,所以叫环回,也有人叫回环。
- 第二个接口 ensXX, 注意哈,由于我这里是安装虚拟机,如果是实体机,这个接口可能是eth0,eh0表示第一块网卡,同理eth2表示第二块网卡。这里ens33肯定也是一个网卡接口的名称,我大胆猜测,ensXX是使用了vmware虚拟化服务才会叫这个名称。这个接口的state是UP状态。
- 第三个接口 docker0, 这个很重要。只要安装了docker,就一定有这个,而且名称就是docker0,不会有什么docker1之类的哈。这个docker0是Down的状态,也有IP地址和广播地址。
1.1启动一个容器查询ip add的效果
上面是没有启动容器的效果,下面我启动一个容器,看看这个效果。
发现启动了一个容器就产生一个新的网络接口,这个接口顺序不要管,我这里是46,还有一个特点,只要有容器运行,docker0这个接口的状态就由DOWN变成了UP。
1.2网络命名空间主要作用就是网络隔离
怎么理解这句网络隔离的话呢?
那么,我利用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
1.3在linux外层查询ip a的最新信息
到这里,外层由于新增一个运行容器,产生一个网络接口,这里我简称叫if47,那么test2容器里面ip add是不是有一个叫if48的呢?
我们果然看到了if47和if48是成对出现。这种成对关系,就避免了if45 和if46 或者if47和if48产生配对连接。这里,我们把绳子上两个节点这句话改一下,绳子换成网络中的线路,两个节点换成路由,所以这种成对出现,说明容器和容器外是可以进行网络通信的。If48能通和if47之间通信,而if47接口只能和docker0通信,同样if46也能通过if45找到docker0。
结论:docker0是多个容器之间能通信的关键点
1.4通过ping来验证docker0是通信的关键
我们上面截图,两个容器都有自己的IP地址,我们随便进入一个容器,来ping另外一个容器的IP,看看结果。
有两个容器,一个IP是0.2,另外一个是0.3,通过ping工具,说明两个IP的可达性。下面画一个图,来说明两个docker容器之间互相通信的原理。