设为首页 收藏本站
查看: 1272|回复: 0

[经验分享] Docker镜像内有啥,存哪?

[复制链接]

尚未签到

发表于 2015-10-13 11:18:37 | 显示全部楼层 |阅读模式
  据说重要的事情要说三遍,那我再表述一下个人观点:Docker镜像是Docker的灵魂所在。
  前两讲关于Docker镜像的描述,已经从宏观的角度涉及一二。一旦掌握Docker对于镜像的层级管理方式,以及Docker镜像大小的真实情况之后,再来了解Docker镜像包含的内容以及存储,就显得简单很多。
Docker镜像内容
  对于Docker镜像的认识总会有第一次,自那时开始,当然也少不了成长,笔者本人的认识过程不妨和大家一起分享:
  1.初次接触Docker:相信很多爱好者都会和我一样,有这样一个认识:Docker镜像代表一个容器的文件系统内容;
  2.初步接触联合文件系统:联合文件系统的概念,让我意识到镜像层级管理的技术,每一层镜像都是容器文件系统内容的一部分。
  3.研究镜像与容器的关系:容器是一个动态的环境,每一层镜像中的文件属于静态内容,然而Dockerfile中的ENV、VOLUME、CMD等内容最终都需要落实到容器的运行环境中,而这些内容均不可能直接坐落到每一层镜像所包含的文件系统内容中,那这部分内容Docker该如何管理?
  另外,在上述第三个步骤中,还有一种情况,相信大家并不陌生:很多个镜像层大小为0,镜像层内部不存在任何文件内容。这又是怎么一回事?
  大家可以回忆一下《一图看尽Docker容器文件系统内容》中,关于空镜像的生成部分,其中提到“更新镜像的 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,结果如下:
DSC0000.jpg
  图中显示ubuntu:14.04镜像共有4个镜像层。
镜像层文件内容存储
  Docker镜像层的内容一般在Docker根目录的aufs路径下,为/var/lib/docker/aufs/diff/,具体情况如下:
DSC0001.jpg
  图中显示了镜像ubuntu:14.04的4个镜像层内容,以及每个镜像层内的一级目录情况。需要额外注意的是:镜像层d2a0ecffe6fa中没有任何内容。
镜像json文件存储
  对于每一个镜像层,Docker都会保存一份相应的json文件,json文件的存储路径为/var/lib/docker/graph,ubuntu:14.04所有镜像层的json文件存储路径展示如下:
DSC0002.jpg
  除了json文件,大家还看到每一个镜像层还包含一个layersize文件,该文件主要记录镜像层内部文件内容的总大小。既然谈到了镜像json文件,为了给下文铺垫,以下贴出ubuntu:14.04中空镜像层d2a0ecffe6fa的json文件:
DSC0003.jpg
  由于该镜像层的对应的Dockerfile指令为CMD,所以镜像层的内容为空,而改镜像层的json文件会更新Cmd域,获取新的Cmd值,以便后续通过该镜像运行容器时,使用更新后的Cmd。
总结
  联合文件系统的使用,是Docker镜像技术的精髓,然而除此之外,对于镜像的元数据管理(即镜像json文件)打通了通过Docker镜像直接运行Docker容器的捷径。
DSC0004.jpg
  欢迎关注[Docker源码分析]微信公众号,更多精彩即将呈现。
         版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-126221-1-1.html 上篇帖子: docker “FATA[0162] ... connection timed out" 错误改正方法 下篇帖子: Docker 使用自定义网桥
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表