Docker镜像(Images)概念

Docker镜像(Images)概念教程

Docker镜像(Images) 的核心概念主要涉及到:docker registry、repository、manifest、image 、layer 和 Dockerfile。

Docker registry

我们知道,每个 docker容器 都要依赖 docker镜像。

当我们第一次使用 docker run 命令启动一个 docker容器,且该宿主机上并不存在所需的镜像时,那么 docker 将从 docker registry 中下载该镜像并保存到宿主机。如果宿主机上存在该镜像,则直接使用宿主机上的镜像完成容器的启动。那么 docker registry 是什么呢?

docker registry 用来保存 docker镜像,其中还包括镜像层次结构和关于镜像的元数据。可以将 docker registry 简单的想象成类似于 Git 仓库之类的实体。

用户可以在自己的数据中心搭建私有的 docker registry,也可以使用 docker 官方的公用 registry 服务,即 Docker Hub。

docker hub

Docker hub 是由 Docker 公司维护的一个公共镜像库。Docker Hub 中有两种类型的仓库,即用户仓库(user repository) 与顶层仓库(top-level repository)。

用户仓库由普通的 Docker Hub 用户创建,顶层仓库则由 Docker 公司负责维护,提供官方版本镜像。理论上,顶层仓库中的镜像经过 Docker 公司验证,被认为是架构良好且安全的。

Docker repository

docker repository 由具有某个功能的 docker镜像的所有迭代版本构成的镜像组。

docker registry 由一系列经过命名的 repository 组成,repository 通过命名规范对用户仓库和顶层仓库进行组织。所谓的顶层仓库,其其名称只包含仓库名,如:

02 docker repositiory.png

而用户仓库的表示类似下面:

03 docker repositiory.png

可以看出,用户仓库的名称多了 “用户名/” 部分。比较容易让人困惑的地方在于,我们经常把 mysql 视为镜像的名称,其实 mysql 是 docker repository 的名称。

docker repository 是一个镜像的集合,其中包含了多个不同版本的镜像,这些镜像之间使用 docker tag,即标签进行版本区分,如 mysql:5.6、mysql:5.7 等,它们均属于 mysql 这个 repository。

简单来说,registry 是 repository 的集合,repository 是镜像的集合。

Docker manifest

docker manifest(描述文件)主要存在于 docker registry 中作为 docker 镜像的元数据文件。docker manifest 在 docker pulldocker pushdocker savedocker load 过程中作为镜像结构和基础信息的描述文件。

在镜像被 docker pull 或者 docker load 到 docker 宿主机时,docker manifest 被转化为本地的镜像配置文件 config。

在我们拉取镜像时显示的摘要(Digest),就是对镜像的 manifest 内容计算 sha256sum 得到的。

image和layer

docker内部的 image 概念是用来存储一组镜像相关的元数据信息,主要包括镜像的架构(如 amd64)、镜像默认配置信息、构建镜像的容器配置信息、包含所有镜像层信息的 rootfs。

docker 利用 rootfs 中的 diff_id 计算出内容寻址的索引(chainID) 来获取 layer 相关信息,进而获取每一个镜像层的文件内容。

layer(镜像层) 是 docker 用来管理镜像层的一个中间概念。我们前面提到,镜像是由镜像层组成的,而单个镜像层可能被多个镜像共享,所以 docker 将 layer 与 image 的概念分离。

docker镜像管理中的 layer 主要存放了镜像层的 diff_id、size、cache-id 和 parent 等内容,实际的文件内容则是由存储驱动来管理,并可以通过 cache-id 在本地索引到。

Dockerfile

Dockerfile 是通过 docker build 命令构建 docker 镜像时用到的配置文件。Dockerfile 允许用户使用基本的 DSL 语法来定义 docker 镜像,其中的每一条指令描述一个构建镜像的步骤。

Docker镜像(Images)概念总结

Docker镜像(Images) 的核心概念主要涉及到:registry、repository、manifest、image 、layer 和 Dockerfile。