出自http://mp.weixin.qq.com/s/VVcgilf1iG6wANwkyagvpw


问题:镜像分层平面化

以下回答来自:蜗牛大神


首先,docker p_w_picpaths --tree 这个命令,是很早很早就废弃了的,1.4以前至少。最初废弃并非因为镜像结构改变,而是因为这个不应该属于核心功能,应该有第三方工具实现。因此即使1.9的文档,你也应该找不到 --tree 的介绍。

然后,说说 docker p_w_picpaths --tree 是干嘛的。这个是将 Docker 镜像的目录,也就是 /var/lib/docker/layers 下的东西显示出来。在 1.10 以前,每个镜像都有自己独立的镜像层,即使两个镜像共享了同一个基础镜像,他们也是独立的层。


因此 docker p_w_picpaths --tree 会把每个镜像的各层列出来,长得和 dockviz 并不一样。


比如 nginx 的基础镜像是 debian,openjdk 的基础镜像是 debian,而 tomcat 的基础镜像是 openjdk。那么如果我们用 nginx → debian 来粗略表示层依赖关系的话。那么旧的 docker p_w_picpaths --tree 显示的是:


nginx → debian

openjdk → debian

tomcat → openjdk → debian


这里可以看到 debian 出现了3次,openjdk 出现了2次,这在1.9及其以前,就是如此。

1小时前

 2

Mike  置顶

 因为镜像不可寻址,所以无法判定 nginx 的 debian 就是 openjdk 的 debian。


所以 docker p_w_picpaths --tree 显示的是这种依赖关系。


而从1.10开始,Docker 镜像存储结构改变,每一层不再使用随机生成的 UUID,而是使用对该层进行SHA256签名校验值。


因此可以确保校验值一致的层,就是同一个层。因此存储的时候,不再像前面列出的那样,每一个镜像有自己的一组分层目录。而是所有的层都在同一个目录,这就是平面化。不再是树形目录,而是同一个目录。


每一个镜像内部,去指向这些不同的层即可。


所以 docker p_w_picpaths --tree 如果还存在,将显示为:


nginx

debian

openjdk

tomcat


根本失去了层依赖关系了。


因为镜像已经平面化了,不再是树形目录表示层依赖关系了。


而 dockviz 则是通过读取镜像每一个层的 SHA256 的 ID,然后组合在一起,形成树形结构。这其实没有反应实际目录存储结构,和 docker p_w_picpaths --tree 不一样。但是满足了显示镜像依赖关系的需求。