Docker镜像管理
镜像管理是为了对容器迁移、对容器运行环境进行全盘打包时起作用的。
1.什么是Docker镜像
Docker镜像是一个只读的Docker容器模板,含有启动Docker容器所需的文件系统结构及其内容,因此是启动一个Docker的基础。Docker镜像的文件内容以及一些运行Docker容器的配置文件组成了Docker容器的静态文件系统运行环境——rootfs。Docker镜像是Docker容器的静态视角,Docker容器是Docker镜像的运行状态。
- rootfs
rootfs是容器在启动时内部进程可见的文件系统,即Docker容器的根目录。rootfs通常包含一个操作系统运行所需的文件系统,如:/dev, /proc, /bin, /etc, /lib, /usr, /tmp及运行Docker所需的配置文件、工具等。
在Docker架构中,当Docker daemon为Docker容器挂载rootfs时,和linux内核启动一样,先将rootfs设为只读模式,在挂载完毕后,利用联合挂载(union mount)技术在已有的只读rootfs上再挂载一个读写层。这样读写层处于Docker容器文件系统的最顶层,其下可能联合挂载多个只读层,只有在Docker容器运行过程中文件系统发生变化时,才会把变化的文件内容写到可读写层,并隐藏只读层中的老版本文件。 - Docker镜像的主要特点
- 分层
每个镜像都分层,分为只读的原始层和修改过的读写层。 - 写时复制
新建一个容器实际上不是复制了镜像的所有内容,它只是将所有镜像层以只读的方式挂载到一个挂载点,再在上面覆盖一个可读写的容器层。写时复制配合分层机制减少了镜像对磁盘空间的占用和容器启动时间。 - 内容寻址
根据文件内容来索引镜像和镜像层。 - 联合挂载
联合挂载技术可以在一个挂载点同时挂载多个文件系统,将挂载点的原目录与被挂载内容进行整合,使得最终可见的文件系统将会包含整合之后的各层的文件和目录。联合挂载是用于将多个镜像层的文件系统挂载到一个挂载点来实现一个统一文件系统视图的途径,是下层存储驱动(如aufs、overlay等)实现分层合并的方式。
- 存储组织方式
容器文件系统其实是一个相对独立的组织,可读写部分(read-write layer以及volumes)、init-layer、只读层(read-only layer)这3部分结构共同组成了一个容器所需的下层文件系统,它们通过联合挂载的方式巧妙地表现为一层,使得容器进程对这些层的存在一点都不知道。
2.Docker镜像关键概念
- registry
registry用以保存Docker镜像,其中还包含了镜像层次结构和关于镜像的元数据。可以将registry简单想成类似于Git仓库之类的实体。被分为用户的私有registry和官方的公用Docker Hub(https://hub.docker.com/)。 - repository
repository即具有某个功能的Docker镜像的所有迭代版本构成的镜像组。用户仓库的命名由用户名和repository名两部分组成,中间以“/”隔开,即username/repository_name的形式,repository名通常表示镜像所具有的功能;而顶层仓库则只包含repository名的部分,如:ubuntu。
需要注意的是:registry是repository的集合,repository是不同版本镜像的集合,一般用“:”来区别,如ubuntu:14.04。 - manifest
manifest(描述文件)主要存在于registry中作为Docker镜像的元数据文件,在pull、push、save和load中作为描述镜像结构和基础信息的描述文件。 - image和layer
image是用来存储一组镜像相关的元数据信息,主要包括镜像的架构(如amd64)、镜像默认配置信息、构建镜像的容器配置信息、包含所有镜像层信息的rootfs。
layer(镜像层)是一个Docker用来管理镜像层的中间概念。 - Dockerfile
Dockerfile是通过docker build命令构建自己的Docker镜像时所需要使用的定义文件。它允许用户自定义Docker镜像。
3.Docker镜像构建操作
一般使用docker build和docker commit。原则上来说,用户并不能“无中生有”地创建一个镜像,都是在其他镜像的基础上进行的,Docker有一系列的镜像称为基础镜像,基础镜像是镜像构建的起点。
- commit镜像
docker commit命令只提交容器镜像发生变更了的部分,即修改后的容器镜像与当前仓库中对应镜像之间的差异部分。 - build构建镜像
4.Docker镜像的分发方法
- pull镜像
- push镜像
- docker export命令导出容器
- docker save命令保存镜像