出自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 不一样。但是满足了显示镜像依赖关系的需求。