说明

据说重要的事情要说三遍,那我再表述一下个人观点:Docker 镜像 是 Docker 的灵魂所在。

前两讲关于 Docker 镜像的描述,已经从宏观的角度涉及一二。一旦掌握 Docker 对于镜像的层级管理方式,以及 Docker 镜像大小的真实情况之后,再来了解 Docker 镜像包含的内容以及存储,就显得简单很多。

Docker 镜像内容

对于 Docker 镜像的认识总会有第一次,自那时开始,当然也少不了成长,笔者本人的认识过程不妨和大家一起分享:

初次接触 Docker:相信很多爱好者都会和我一样,有这样一个认识:Docker 镜像代表一个容器的文件系统内容; 初步接触联合文件系统:联合文件系统的概念,让我意识到镜像层级管理的技术,每一层镜像都是容器文件系统内容的一部分。 研究镜像与容器的关系:容器是一个动态的环境,每一层镜像中的文件属于静态内容,然而 Dockerfile 中的 ENV、VOLUME 、CMD 等内容最终都需要落实到容器的运行环境中,而这些内容均不可能直接坐落到每一层镜像所包含的文件系统内容中,那这部分内容 Docker 该如何管理? 另外,在上述第三个步骤中,还有一种情况,相信大家并不陌生,很多个镜像层大小为 0,镜像层内部不存在任何文件内容。这又是怎么一回事?

大家可以回忆一下《一图看尽 Docker 容器文件系统内容》中,关于空镜像的生成部分,其中提到「更新镜像的 json 文件」。其实,前文埋下的伏笔,即暗示了真相—— Docker 镜像内容由镜像层文件内容 和镜像 json 文件 组成,不论静态内容还是动态信息,Docker 均为将其在 json 文件中更新。

Docker 每一层镜像的 json 文件,都扮演着一个非常重要的角色,其主要的作用如下:

记录 Docker 镜像中与容器动态信息相关的内容 记录父子 Docker 镜像之间真实的差异关系 弥补 Docker 镜像内容的完整性与动态内容的缺失 Docker 镜像的 json 文件可以认为是镜像的元数据信息,其重要性不言而喻,本系列将在下一篇文章重点分析 Docker 镜像 json 文件。敬请期待。

Docker 镜像存储位置

Docker 镜像内容的理论分析,看着多少有些云里雾里,不论 Docker 镜像层的文件,还是 json 文件,读来都稍显乏味。倘若可以一窥 Docker 中的真实环境,相信对于镜像技术的理解定会有不少的帮助。

我们直奔主题,从 Docker 镜像的存储入手,看看这些镜像层文件内容 与镜像 json 文件 分别存储于何处。(以下展示的实验环境:宿主机操作系统为 Ubuntu 14.04、Docker 版本为 1.7.1、graphdriver 类型为 aufs,仅包含 ubuntu:14.04 一个镜像。)

查看镜像层组成

我们可以通过命令 docker history ubuntu:14.04 查看 ubuntu:14.04 ,结果如下:

https://zhangshoufu-images.oss-cn-hangzhou.aliyuncs.com/image-20200517111822703.png

图中显示 ubuntu:14.04 镜像共有 4 个镜像层。

镜像层文件内容存储

Docker 镜像层的内容一般在 Docker 根目录的 aufs 路径下,为 /var/lib/docker/aufs/diff/ ,具体情况如下:

https://zhangshoufu-images.oss-cn-hangzhou.aliyuncs.com/image-20200517111929031.png