docker镜像
docker image概念介绍
Remote docker hub:集中存储镜像的WEB服务器地址
Namespace:类似于Github中的命令空间,是一个用户或组织中所有镜像的集合。
Repository:类似于Git仓库,一个仓库可以有多个镜像
tag:类似于GIT仓库中的tag,一般用于区分同一类镜像有不同版本
Layer:镜像由一系列层组成,每层都用64位十六进制数表示,非常类似于GIT仓库中的commit
image ID:镜像最上层的Layer ID就是该镜像的ID,Repo:tag提供了易于人类识别的名字,而ID便于脚本处理,操作镜像。
rootfs :是Docker在启动时内部进程可见的文件系统,即docker容器的根目录。通常包含一个操作系统运行所需要的文件系统,例如可能包含典型的类UNIX操作系统中的目录名称,如/dev /proc /etc /lib /usr /tmp及运行docker容器所需要的配置文件,工具等。
docker镜像的主要特点
分层:镜像采用分层的方式构建的,每个镜像都由一系列的镜像层组成,分层结构是Docker镜像如此轻量的重要原因,当需要修改容器镜像内的某个文件时,只对处于最上方的读写层进行变动,不覆写下层已有文件系统的肉容,已有文件在只读层中的原始版本仍然存在,但会被读写层中的新版本文件所隐藏。
写时复制:在多个容器共享镜像时,每个容器在启动的时候并不需要复制一份镜像文件,而是将所有镜像层以只读的方式挂载到一个挂载点,再在上面覆盖一个可读写民的容器层。在未更改文件内容时,所有容器共享同一份数据,只有在docker容器运行过程中文件系统发生变化时,才会把变化的文件内容写到可读写层,并隐藏只读层的老版本文件。
内容寻址:根据文件内容来索引镜像和镜像层,对镜像层的内容计算校验和,生成一个内容哈希值,并以此哈希值代替之前的UUID作为镜像层的唯一标志。
联合挂载:联合挂载技术可以一个挂载点同时挂载多个文件系统,将挂载点的原目录与被挂载内容进行整合,使得最终可见的文件系统将会包含整合之后的各层文件和目录,实现这种联合挂载技术的文件系统通常被称为联合文件系统。
docker镜像的存储组织方式
可读写部(read-write layer以及volumes),init-layer,只读层(read-only-layer)这三部分结构共同组成一个容器所需的下层文件系统。
registry |
用以保存docker镜像 |
manifest | 主要存在于registry中作为docker镜像的元数据文件,在pull,push,save,和load中作为镜像结构和基础信息的描述文件。 |
image和layer |
image概念是用来存储一组镜像相关的元数据信息,主要包括镜像的架构(如amd64),镜像默认配置信息,构建镜像的容器配置信息,包含所有镜像层信息的rootfs。 layer是一个docker用来管理镜像层的中间概念,而单个镜像可能会被多个镜像共享,所以Docker将layer与image的概念分离,docker镜像管理中的layer主要存放了镜像层的diff_id size cache-id和parent等内容,实际的文件内容则是由存储驱动来管理,并可通过cache-id在本地索引。 |
docker file | 是在通过docker build命令构建自己的docker镜像时需要使用到的定义文件,它允许用户使用基本的DSL语法来定义docker镜像,每一条指令描述了构建镜像的步骤。 |
repository | 由具有某个功能的docker镜像的所有迭代版本构成的镜像组, |
docker镜像构建操作
- docker build 用户主要使用docker file和docker build命令来完成一个新镜像的构建。
- docker commit 只提交容器镜像发生变更了的部分,即修改后的容器镜像与当前仓库中对应镜像之间的差异部分,这使的该操作实际需要提交的文件往往并不多。
Docker daemon 接收到对应的Http请求后,需要执行的步骤如下。
根据用户输入pause参数的设置确定是否暂停Docker容器的运行。
将容器的可读写层导出打包,该读写层代表了当前容器的文件系统与当初启动该容器的镜像之间的差异。
在层存储中注册可读写层差异包
更新镜像历史信息和rootfs,并据此在镜像存储中创建一个新的镜像,记录其元数据。
如果定指定了repository信息,则给上述镜像添加tag信息。
docker client端
当docker client接收到用户命令,首先解析命令行参数,根据第一个参数的不同,将分为以下4种情况分别处理。
docker build - < context.tar.gz 根据命令行输入参数对context.tar.gz进行设置。
docker build github.com/creack/docker-firesox 调用git clone --depth 1 --recursive命令克隆该github repository,该操作会在本地的一个临时目录中行,命令成功之后该目录将作为context传给docker deamon,该目录中的dokcerfile会被用来进行行后续构建docker镜像。
如果第一个参数不是git repository URL则从该URL下载context,并将其封装为一个io流--io.reader,后面的处理情况与情况1相同,只是将STDIN换为了io.reader。
docker build -t vieux/apache:2.0 用户定义了tag,则对其指定的repository和tag进行难证。
docker server端
docker server接收到相应的HTTP请求后,需要做的工作如下。
- 创建一个临时目录,并将context指定的文件系统解压到该目录下。
- 读取并解析dockerfile。
- 根据解析出的dockerfile遍历其中的所有命令,并分发到不同的模块去执行。
- parser为上述每一个指令创建一个对应的临时容器,在临时容器中执行当前指令,然后通过commit使用此容器生成一个镜像层
- dockerfile所有的指令对应的层的集合,就是此次build后的结果,如果指定了tag参数,便给镜像打上相应的tag,最后一次commit生成的镜像ID就会作为最终的镜像ID返回。
docker镜像的分发方法
pull镜像:从镜像服务器拉取镜像到本地
push镜像:用户制作了自己的镜像,上传库至仓库
docker export:导出容器
docker save:保存镜像