我们知道使用libcontainer可以迅速构建应用的运行环境。容器迁移时候需要把运行环境进行全打包这个时候libcontainer就出现短板,因此Docke镜像技术是Docker管理文件系统运行环境一个完善。

Docker镜像的只读形式启动Docker容器中,文件系统结构内容都包含在其中Docker镜像是启动Docker容器的基础。Docker镜像的文件内容配置文件组成了Docker容器的静态文件系统运行环境—— rootfs。简单的理解为:Docker镜像是Docker 容器的静态视角,Docker容器是Docker镜像的运行状态。

rootfsDocker容器的根目录在启动时Docker容器可见到的文件系统,rootfs包含了操作系统运行所需的文件系统例如: /dev、/proc、/bin、/etc、/libUnix目录系统以及配置文件、工具等。我们知道,Linux操作系统内核启动时需要挂载一个只读的根目录rootfs,检测完成以后,再切换成为读写模式。在Docker架构中,继续沿用Linux内核启动时的方法挂载一个只读的根目录rootfs挂载完成以后,利用联合挂载union mount技术在已有的只读根目录rootfs上再挂载一个读写层这样可读写层处于Docker容器文件系统的最顶层可以联合挂载多个只读层如果运行中文件发生了变化,变化的文件内容写到可读写层同时隐藏老版本

Docker镜像设计上有哪些关键技术?

下面介绍Docker镜像设计上的关键技术

1.分层技术

构建Docker镜像采用了分层方式很多“镜像层”组成了镜像Docker镜像能够如此轻量的原因是得益于分层技术,如果我们需要修改容器镜像内的文件,只能在读写层进行修改和变动,读写层中的原始文件依然存在,不会被新版本覆盖。如果这个时候使用docker commit修改容器文件系统作为新的镜像保存以后的最新版本是最上层读写文件系统中被修改后的文件,因此,分层技术实现了不同镜像之间可以共享镜像层的效果。

2.内容寻址存储机制

内容寻址存储机制content-addressable storage的最主要作用是提高镜像安全性它的工作原理是:文件内容来索引镜像和镜像层和之前的版本所对应的镜像随机生成UUID,新的镜像计算值产生了一个哈希值,此哈希值镜像层的唯一标志

3.写时复制策略

容器之间共享镜像镜像层只读的方式挂载在一个挂载点覆盖一个可读写的容器层在启动容器的时候不再需要复制镜像文件,这就是Docker镜像写时复制(copy-on-write )策略如果文件为更改,容器内的数据不变。如果有数据发生变化,变化的内容就会写的可读写层,这样做就可以减少容器启动的时间和磁盘空间资源占用。

4.联合挂载技术

联合挂载技术简单来说就是一个挂载点同时挂载多个文件系统,将挂载点的原目录与被挂载内容进行整合,整合之后的各层的文件和目录包含文件系统。

如上图,初始挂载时读写层为空从用户的角度看,该容器的文件系统与底层的rootfs没有差别从内核的角度来看,则是显式区分两个层次修改镜像内的某个文件最上方的读写层变动,不覆写下层已有文件系统的内容,原有文件在只读层中仍然是原始版本,会被新版文件所隐藏docker commit修改的容器文件系统为一个新镜像,最上层读写文件系统中的文件被更新过。联合挂载技术是用于将多个镜像层的文件系统挂载到一个挂载点来实现一个统一文件系统视图的途径,是下层存储驱动(如aufs、overlay等)实现分层合并的方式。

    Docker镜像不用写dockerfile,只简单配置就可以使用,构建速度快调试配置高效简洁,具有简化开发程序、分层技术节约具有开支的优点。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐