Docker从入门到精通——Docker镜像加载原理

Docker镜像加载原理

  • 前言
  • Docker镜像加载原理
    • UnionFs(联合文件系统)
    • 镜像加载原理
    • UnionFs(联合文件系统)的好处
  • 参考资料

前言

再上一篇博客总结了Docker的常用命令,并且介绍了如何学习Docker命令。感兴趣可以访问Docker常用命令

Docker镜像加载原理

Docker镜像为什么是一种轻量级,并且包含了运行某一个软件需要的一些代码、运行环境、配置文件等等,让你将所有的应用以及环境直接打包为镜像就可以直接运行。都是依赖于Docker中的UnionFs(联合文件系统)

UnionFs(联合文件系统)

unionfs是一种为Linux,FreeBSD和NetBSD操作系统设计的把其他文件系统联合到一个联合挂载点的文件系统服务。它使用branch把不同文件系统的文件和目录“透明地”覆盖,形成一个单一一致的文件系统。这些branches或者是read-only或者是read-write的,所以当对这个虚拟后的联合文件系统进行写操作的时候,系统是真正写到了一个新的文件中。看起来这个虚拟后的联合文件系统是可以对任何文件进行操作的,但是其实它并没有改变原来的文件,这是因为unionfs用到了一个重要的资管管理技术叫写时复制。

写时复制(copy-on-write,下文简称CoW),也叫隐式共享,是一种对可修改资源实现高效复制的资源管理技术。它的思想是,如果一个资源是重复的,但没有任何修改,这时候并不需要立即创建一个新的资源;这个资源可以被新旧实例共享。创建新资源发生在第一次写操作,也就是对资源进行修改的时候。通过这种资源共享的方式,可以显著地减少未修改资源复制带来的消耗,但是也会在进行资源修改的时候增减小部分的开销。

Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。

镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
典型的Linux启动到运行需要两个FS – bootfs + rootfs

Docker从入门到精通——Docker镜像加载原理
每一个对readonly层文件/目录的修改都只会存在于上层的writeable层中。这样由于不存在竞争, 多个container可以共享readonly的layer。
所以docker将readonly的层称作 “image” – 对于container而言整个rootfs都是read-write的,但事实上所有的修改都写入最上层的writeable层中,

上层的image依赖下层的image,因此docker中把下层的image称作父image,没有父image的image称作base image

想要从一个image启动一个container,docker会先加载其父image直到base image,用户的进程运行在writeable的layer中。所有parent image中的数据信息以及ID、网络和lxc管理的资源限制等具体container的配置,构成一个docker概念上的container

Docker从入门到精通——Docker镜像加载原理

UnionFs(联合文件系统)的好处

1.节省存储空间 – 多个container可以共享base image存储
2.快速部署 – 如果要部署多个container,base image可以避免多次拷贝
3.内存更省 – 因为多个container共享base image, 以及OS的disk缓存机制,多个container中的进程命中缓存内容的几率大大增加
4.升级更方便 – 相比于 copy-on-write 类型的FS,base-image也是可以挂载为可writeable的,可以通过更新base image而一次性更新其之上的container
5.允许在不更改base-image的同时修改其目录中的文件 – 所有写操作都发生在最上层的writeable层中,这样可以大大增加base image能共享的文件内容。

参考资料

《自己动手写Docker》

【狂神说Java】Docker最新超详细版教程通俗易懂
Docker百度百科

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览92429 人正在系统学习中

来源:王卫——David

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年3月3日
下一篇 2022年3月3日

相关推荐