前面我们通过对虚拟化网络基础知识的一番铺垫后,现在,我们就可以尝试使用这些知识去解构容器间的通信原理了,毕竟运用知识去解决问题,才是学习网络虚拟化的根本目的。
我们先以 Docker 为目标,谈一谈Docker 所提供的容器通信方案。当下节课介绍过 CNI 下的 Kubernetes 网络插件生态后,你也许会觉得 Docker 的网络通信相对简单,对于某些分布式系统的需求来说,甚至是过于简陋了。不过,虽然容器间的网络方案多种多样,但通信主体都是固定的,不外乎没有物理设备的虚拟主体(容器、Pod、Service、Endpoints 等等)、不需要跨网络的本地主机、以及通过网络连接的外部主机三种层次。
所有的容器网络通信问题,其实都可以归结为**本地主机内部的多个容器之间、本地主机与内部容器之间,以及跨越不同主机的多个容器之间的通信问题,其中的许多原理都是相通的(本班同学间交流,本班老师和同学交流,本班同学和外班同学交流)**,所以我认为 Docker 网络的简单,在作为检验前面网络知识有没有理解到位时,倒不失为一种优势。
Docker 的网络方案在操作层面上,是指能够直接通过docker run --network参数指定的网络,或者是先被docker network create创建后再被容器使用的网络。安装 Docker 的过程中,会自动在宿主机上创建一个名为 docker0 的网桥,以及三种不同的 Docker 网络,分别是 bridge、host 和 none,你可以通过docker network ls命令查看到这三种网络,具体如下所示:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
2a25170d4064 bridge bridge local
a6867d58bd14 host host local
aeb4f8df39b1 none null local
事实上,这三种网络,对应着 Docker 提供的三种开箱即用的网络方案,它们分别为:
用过虚拟机的读者应该都知道,设置虚拟机的时候也是这几种模式。
而除了前面三种开箱即用的网络方案以外,Docker 还支持由用户自行创建的网络,比如说:
虚拟化网络是容器编排必不可少的功能,网络的功能和性能,对应用程序各个服务间通讯都有非常密切的关联,这一点你要重点关注。在实际生产中,容器编排系统就是由一批容器通过网络交互来共同对外提供服务的,其中的开发、除错、效率优化等工作,都离不开这些基础的网络知识。
你在使用 Docker 时,有没有关注或者调整过它的容器通讯网络?在哪些需求场景下你做出过调整呢?