最近在想运维自动化的事情,自然就想到了docker, 于是研究了一番,有一些心得还是需要纪录一下。
docker 最近如此之火,关于它能带来哪些改变,以及有什么优点,这里我不太想说。我更想说说它背后实现的原理。
相信大部分听过docker 讲座的人都听过一句话,那就是docker 不是什么新技术,是在原有容器基础上包装了一层对外提供服务。
的确是这样的(后面解释)。
一、 关于docker 的架构
下面这张图就是经典的docker 层次结构。它包含如下几个模块:
docker client: 用户使用的调用接口,负责和docker daemon 以及container 交互的逻辑,docker 是一种典型的c/s结构,这个就是client.
docker daemon: docker 后台的常驻进程,负责接受所有的client 的请求。docker daemon 对于任何的请求都是生成一个job 来处理的,
这里有一个比较重要的点就是,docker server 其实也是一个job. 虽然图中把它单独拿出来了(为了方便理解。)
每一类任务都有对应的handle.
docker registry: 存储docker images 的地方,images 是什么? 其实就是rootfs. 因为生成一个新的container 的时候,image 负责的就是
初始化rootfs. 关于 images 如果做到 layer 叠 layer 的还需要继续研究。
driver 层: graphdriver 负责和本地的graph(本地存储image的东西) 交互。
network 负责初始化容器的网络参数等。
exec docker 容器的执行驱动。
libcontainer: 这个是重点,它实现了linux 内核态容器技术对外的api 接口,也就是说,docker 最后容器是由linux 来实现的。
libcontainer 屏蔽了linux 的实现细节,至于libcontainer 通过namespace 实现隔离,以及通过cgroups 实现资源限制,
都是实现细节,从这个我们也可以看出,docker 整个架构是完全的松耦合的,对于跨平台,只需要实现另一个平台的libcontaniner .
整体来说,就是这样的。
