Docker - Bridge网络实现原理

         最近一直在恶补以前欠下没掌握的知识点,好久没写原理向的博客了。今天正好看到Docker Bridge网络这一块,感觉挺有意思的,拿出来和各位分享下,小弟初来乍到,如果写错还望各位大佬海涵,小弟必闭门思过,痛改前非。

Docker - Bridge网络实现原理

1.Docker0是什么?

2.Docker容器内部是否可以ping同宿主机?

3.Docker是如何处理容器间的网络通信的?

---------------------------------------------------------------------------------------------------------------------------

1.Docker0是什么?

       Docker0在哪里呢?在保证当前没有任何容器正在运行的时候,我们执行ip addr指令,可以看到如下三个网络接口

Docker - Bridge网络实现原理

lo:linux本机回环接口,可以看到ip地址为回环地址127.0.0.1。回环地址:不属于任何一个有类别地址类。在不安装网卡前就可以ping通这个地址。可以用它来检查本地网络协议、基本数据接口等功能是否正常。

eth0:linux网络接口,光纤以太网接口卡,俗称网卡,可以看到ip地址为阿里云内网地址172.16.252.21。

docker0:docker容器网络采用Bridge(桥接模式)形式下的网络接口,可以看到ip为172.17.0.1。

       总结下docker0是什么呢?docker0是docker在默认情况下创建的虚拟网桥,如果内部容器网络连接方式采用Bridge模式,那么这些容器都会链接到docker0上。

2.Docker容器内部是否可以ping同宿主机?

       大家猜也猜得到,肯定可以ping通啦,宿主机自己创建的东西自己都ping不通,都失联了还搞个锤子。那为什么可以ping通嘞,首先我们创建一个实例,创建一个nginx容器:docker run -it --name mynginx nginx:1.10,然后执行下:ip addr命令

Docker - Bridge网络实现原理

       可以看到多了一个以veth开头的网络接口,使用命令查看容器内部ip:docker exec -it 82be0f7b7636 ip addr

Docker - Bridge网络实现原理

       可以看到容器内部除了有回环接口以外,还有一个和宿主机很类似的网络接口。这东西看起来很像Java里面的通道嘛,我们大胆猜想,这两个玩意莫非就是Docker间网络通信的法宝么?

       还真的是,其实我们每启动一个容器,如果不显示的使用--network来指定其网络连接模式的话,就会默认采用Bridge模式。在Bridge网络模式下,使用的技术为evth-pair技术:一对虚拟设备接口,一端连着协议,一端彼此相连,可以通信。画个图大致就是这个样子:

Docker - Bridge网络实现原理

3.Docker是如何处理容器间的网络通信的?

了解了docker容器是如何和宿主机通信的,那我们再大胆猜测一下,docker容器间的通信是否也是用的evth-pair呢?我们再创建一个nginx容器,然后看一下宿主机的ip:

Docker - Bridge网络实现原理

果不其然,又多出了一个虚拟网络接口,同样进入容器内部我们也可以看到容器内部也产生了与之对应的虚拟网络接口

Docker - Bridge网络实现原理

由此可见,在Bridge网络模式下,容器间的通信是依靠docker0作为中间桥梁来进行通信的,示意图如下:

Docker - Bridge网络实现原理