简介
docker镜像是一个只读的Docker容器模板,含有Dokcer容器启动所需的内容。Docker镜像是Dokcer容器的的静态视角,Dokcer容器是Docker镜像的运行状态
Dokcer镜像结构
rootfs
Docker镜像的文件内容以及一些运行Docker容器所需要的配置文件组成了Dokcer容器运行的静态文件系统rootfs。
rootfs是Docker容器启动时内部进程可见的文件系统,即Docker的根目录。通常包括类Unix系统的文件目录,如:/dev /usr /bin /etc /tmp /lib以及Docker运行所需要的配置、工具等。
Docker Daemon为容器过载rootfs是,会先将rootfs设为只读模式。挂载完毕之后利用联合挂载技术在已有的只读rootfs上再挂载一个读写层,可读写层就处于文件系统的最顶层,只有在Docker容器运行过程中文件系统变化是,才会把变化写到可读写层。
Docker镜像主要特点
分层
Docker镜像才有分层的方式构建,每个镜像都由一系列镜像层构成。可读写层始终处于文件系统最上层,当需要修改镜像内某个文件是,只对处于最上方的可读写层进行修改,不覆写下层文件内容,已有文件在读写层中原始文件依然存在,但会呗新的锁屏蔽。
使用docker commit提交修改保存为新的镜像时,保存的是最上层的读写层被更新的文件,原始文件未保存。
写时复制(copy-on-write)
Docker镜像使用了写时复制的策略,多个容易共享同一个镜像时,启动的时候并不需要单独复制一份镜像,而是将所有镜像层以只读方式挂载到一个挂载点,再在上面覆盖一个可读写层。
未更改文件内容时,所有容器共享同一份镜像数据。
在发生更改时,才把内容写到可读写层,隐藏老版本的文件内容。
联合挂载
联合挂载就是在一个挂载点同时挂载多个文件系统,将挂载点的原目录与被挂载内容进行整合,,使得最终可见的文件系统将会包含整合之后各层的文件和目录。实现这种挂载技术的文件系统被称为联合挂载系统。
内容寻址
顾名思义,内容寻址是根据文件内容来索引镜像和镜像层。对镜像层的内容进行校验和,生成一个内容Hash值,并以此Hash值作为镜像层唯一标识。
该机制提高了镜像的安全性,并在pull 、push、load、save之后检测镜像完整性。
同时,基于镜像层的Hash校验和,在一定程度上减少了ID的冲突,增强了镜像的共享。
Docker镜像的几个关键概念
registry
registry用于保存Docker镜像,包括镜像层次结构与镜像元数据
respository
repository是由具有某个功能的Docker镜像的所有迭代版本构成的镜像组。registry由一系列经过命名的repository组成。
用户仓库命名有用户名和仓库名自称,userName/repositoryName
manifest
manifest(描述文件)主要存在于registry中作为Docker镜像的元数据文件,在pull、push、save、load中作为镜像接口和基础信息的描述文件。
在镜像呗pull或者load到本地宿主机时,manifest被转化为本地镜像配置文件config
image和layer
image是用来存储一组镜像相关的元数据信息,主要包括镜像的架构(amd64)、镜像的默认配置信息、构建镜像的容器配置信息、包含所有镜像层信息的rootfs。Docker根据rootfs中的diff_id计算出内容寻址的索引(chainId)莱获取layer信息,从而进一步获取镜像信息。
layer(镜像层)是用来管理镜像层的中间概念,主要存放了镜像层的diff_id、size、cache-id和parent等,实际的文件内容有存储驱动莱管理,可通过cache-id在本地索引到
作者:ywhu
链接:https://www.jianshu.com/p/2d00483a8088