Docker 镜像为什么能秒启:分层存储与写时复制
【摘要】 第一次用 Docker 的人多半会惊讶:一个带着完整运行环境的镜像,启动只要一两秒,跟开虚拟机完全不是一个量级。秘密不在 CPU,而在它存文件的方式:分层。【镜像是一层一层叠出来的】构建镜像时,每条指令生成一层。比如先铺一层操作系统基础文件,再铺运行库,再铺你的应用代码。每层只记录跟上一层相比变了什么,没变的文件不重复存。这带来两个直接好处:一是下载和分发时,本地已有的层不用再下;二是很多镜...
第一次用 Docker 的人多半会惊讶:一个带着完整运行环境的镜像,启动只要一两秒,跟开虚拟机完全不是一个量级。秘密不在 CPU,而在它存文件的方式:分层。
【镜像是一层一层叠出来的】
构建镜像时,每条指令生成一层。比如先铺一层操作系统基础文件,再铺运行库,再铺你的应用代码。每层只记录跟上一层相比变了什么,没变的文件不重复存。这带来两个直接好处:一是下载和分发时,本地已有的层不用再下;二是很多镜像共用同一个基础层,磁盘上只占一份。
【容器启动时只加薄薄一层】
容器跑起来,并不是把镜像复制一份,而是在镜像的只读层之上,再叠一个可写层,进程看到的是合并后的统一视图。加一层空目录当然是瞬间的事,这就是秒启的由来。
【写文件时才真的花成本:写时复制】
进程读文件,直接读下面只读层的数据,零成本。一旦要改某个文件,系统先把整个文件复制到可写层,再在副本上修改,这叫写时复制(Copy-on-Write)。原文件不动,所以删掉容器后镜像干干净净;代价是第一次写大文件会有一次完整复制,频繁改大文件的场景下这层开销不能忽略。
【这解释了几个日常现象】
为什么容器删了数据就没了:数据写在可写层,它随容器一起销毁,想留数据必须挂卷。为什么镜像能做到几十 MB:层层去重加上精简基础镜像。为什么改一行代码重建镜像很快:只有变化的那层和它之后的层重建,前面的层全部走缓存。
理解了分层和写时复制,Docker 的快和省就都不是魔法了,只是把「不变的东西只存一份、变化的东西用到时再复制」贯彻到底。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)