《Docker源码分析》笔记

最近几天的时间都在看《Docker源码分析》,买书的时候是觉得需要补补Docker原理方面的知识。因为过多的Docker书籍都偏向于使用,究其原因是Docker本身的工具属性很强。到目前为止,看完了全书大约70%的内容,关于镜像下载和管理部分的内容暂时略过了。

  • 负面评价:

我对本书的整体评价不高,好在本来的期望值也不高。在我看来,这本书主要的问题在于本末倒置。cgroup和namespace作为Docker的基础技术,本书基本没怎么分析和介绍,甚至整个libcontainer都没有花多少篇幅。此外,UnionFS之类的文件系统也算是Docker作为虚拟化产品的一大特色,依然是寥寥数笔就带过了。

  • 正面评价:

正如前文所说,Docker是一个工具性的产品,易用性是它的基本属性。当然这也导致了很少有用户去深入研究Docker实现方面的东西。像我这样好奇心很重却又想偷懒的人,当然是希望有本二手资料来研究研究了。这本书作为研究Docker的入门资料还是可以的,可以了解Docker的基本架构。此外,本书对于流程型知识点叙述得还是很详细的,所以可以帮助读者快速了解常用Docker操作的内在实现流程。

下面整理一下本书的一些知识点。

1. Docker的基本构成

Docker主要由以下几部分构成,Docker Client、Docker Daemon、Docker Registry、Graph、Driver以及libcontainer。

  • Docker Client是用户操作Docker的客户端,Docker Client把用户管理请求发送给Docker Daemon。
  • Docker Daemon是Docker的主干构成。其中Docker Daemon主要由Docker Server、Engine和Job构成。Docker Server就是一个Http Server,它负责接收Docker Client的请求,并执行相应的操作。Engine是Docker的执行引擎,Engine管理着很多容器信息。Job是在Engine内部最基本的工作执行单元,
  • Docker Registry是存储容器镜像的仓库,就是一个远程的服务器,如Docker Hub等。
  • Graph是Docker中管理镜像的组件。
  • Driver是Docker架构中的驱动组件,Driver完成了Docker底层操作;Driver可以分为Graph Driver、Network Driver以及execdriver。顾名思义,graph driver和network driver分别负责对Docker镜像和网络的操作。而exec driver就是完成了对容器的操作,底层可以是libcontainer或者LXC。
2. Docker容器网络

Docker作为一种虚拟化技术,对网络层的虚拟化实现是至关重要的一环。事实上,Docker的网络模式大概有以下几种,bridge,host,other container以及none。bridge模式是比较常见的一种模式。bridge模式的实现方式如下:

  • 首先,Docker Daemon创建一个docker0网桥;
  • 然后,通过iptables配置使能各个方向的数据包转发;
  • 最后,在容器初始化时创建一个veth对,然后把其中一端绑定在docker0网桥上,另一端附加到容器的namespace下。

相比之下,host模式更简单,就是不做虚拟化,直接使用系统的eth0;other container模式就是把其中一个容器的网络命名空间传递到另一个容器之中。Docker的虚拟网络实现貌似并不完美,特别是在大规模docker集群上运行micro service或者SOA的时候。不过,我目前还没有深切理解这个问题,前面看Kubernetes的时候,也在网络实现方面产生了疑问。之后要好好研究一下这个问题。

发表评论