本文QQ空间链接:http://user.qzone.qq.com/29185807/blog/1462342295
本文CSDN博客链接:http://blog.csdn.net/screscent/article/details/51314497
1、简介
镜像无疑是docker中的一个重要角色。在分析源码之前,我们先要了解下image的一些概念。可以参考 http://www.sel.zju.edu.cn/?p=549
docker中,为了复用image,将image做成,可继承的方式。子image可以继承父image的rootfs,通过分层的方式一层一层的进行继承复用,减少镜像的大小,提高存储复用。
这里有几个概念
1、rootfs,是容器启动的时候,其所可以用到的是文件系统目录。
2、image,是一个只读的文件系统。通过继承父image的文件系统,然后union mount到一起,形成一个rootfs。
3、layer,image的各个分层就属于layer,由于所有的image中的文件系统都是只读的。所以另外再在最顶层的image上面再添加一个read-write层。整个构成容器的运行环境。
在源代码中是怎么实现这些的呢。通过graphdriver与作为中间模块,实现与底层的layer的文件系统打交道。而graph模块通过graphdriver来对image进行管理。下面我们来看源码。
2、graphdriver
源码在docker\docker\daemon.go
在mainDaemon中初始化
d, err := daemon.NewDaemon(daemonCfg, eng)
我们继续跟进
源码在docker\daemon\daemon.go
在NewDaemonFromDirectory函数中
初始化了graphdriver,初始化流程到这里。下面我们具体的去看下graphdriver源码。
2.1 driver接口
driver一共有两部分的接口
protodriver,是比较基础部分的,直接与文件存储打交道。从上面的函数名我们就能看出来提供的作用。如
Create:用于创建一个新的layer。
Removeÿ