前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker镜像详谈(3): 镜像内容存放在哪里?

Docker镜像详谈(3): 镜像内容存放在哪里?

作者头像
Henry Zhang
发布2019-04-12 17:54:48
8.1K0
发布2019-04-12 17:54:48
举报
文章被收录于专栏:亨利笔记亨利笔记

题图摄于王府井:圣诞灯饰

编者注:继上周《Docker镜像详谈(2): 深入理解镜像大小》文章之后,本周介绍容器镜像在宿主机存放的方式。注意:文章以Unbuntu 14.04和aufs为例子说明个中原理,在其他Linux和文件系统中,目录和文件的位置可能会有所不同。

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

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

Docker 镜像内容

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

  1. 初次接触 Docker:相信很多爱好者都会和我一样,有这样一个认识:Docker 镜像代表一个容器的文件系统内容;
  2. 初步接触联合文件系统:联合文件系统的概念,让我意识到镜像层级管理的技术,每一层镜像都是容器文件系统内容的一部分。
  3. 研究镜像与容器的关系:容器是一个动态的环境,每一层镜像中的文件属于静态内容,然而 Dockerfile 中的 ENV、VOLUME、CMD 等内容最终都需要落实到容器的运行环境中,而这些内容均不可能直接坐落到每一层镜像所包含的文件系统内容中,那这部分内容 Docker 该如何管理?

另外,在上述第三个步骤中,还有一种情况,相信大家并不陌生,很多个镜像层大小为 0,镜像层内部不存在任何文件内容。这又是怎么一回事?

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

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

  1. 记录 Docker 镜像中与容器动态信息相关的内容
  2. 记录父子 Docker 镜像之间真实的差异关系
  3. 弥补 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,结果如下:

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

镜像层文件内容存储

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

图中显示了镜像 ubuntu:14.04 的 4 个镜像层内容,以及每个镜像层内的一级目录情况。需要额外注意的是,镜像层 d2a0ecffe6fa 中没有任何内容。

镜像 json 文件存储

对于每一个镜像层,Docker 都会保存一份相应的 json 文件,json 文件的存储路径为 /var/lib/docker/graph,ubuntu:14.04 所有镜像层的 json 文件存储路径展示如下:

除了 json 文件,大家还看到每一个镜像层还包含一个 layersize 文件,该文件主要记录镜像层内部文件内容的总大小。既然谈到了镜像 json 文件,为了给下文铺垫,以下贴出 ubuntu:14.04 中空镜像层 d2a0ecffe6fa 的 json 文件:

由于该镜像层的对应的 Dockerfile 指令为 CMD,所以镜像层的内容为空,而改镜像层的 json 文件会更新 Cmd 域,获取新的 Cmd 值,以便后续通过该镜像运行容器时,使用更新后的 Cmd。

欢迎通过留言交流。 本文已获授权发表,转载请与作者联系。

相关文章

  1. Docker镜像的核心价值
  2. Docker实用情况的报告
  3. VMware开源云控制平面: 光子控制器
  4. VMware的云原生应用战略
  5. 虚拟机即容器-Project Bonneville详解
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-12-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 亨利笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Docker 镜像内容
  • Docker 镜像存储位置
  • 查看镜像层组成
  • 镜像层文件内容存储
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档