Docker镜像
图片来自 Nigel Poulton的深入浅出Docker
镜像是一种构建时结构(build-time),而容器是一种运行时(rum-time)结构.
镜像和容器
通常使用docker container run 和 docker service create命令从某个镜像启动一个或多个容器.一旦容器从镜像启动之后,二者之间就变成了相互依赖的关系,并且在镜像上启动的容器全部停止之前,镜像是无法被删除的.
镜像通常比较小
镜像中必须包含应用/服务运行所必须的操作系统和应用文件.但是容器又追求快捷和小巧,因此镜像通常需要裁掉不必要的部分,保持比较小的体积.
Docker官方镜像Alpine Linux大约只有4MB,而Ubuntu官方的Docker镜像大约有110MB
镜像和镜像层
镜像由镜像层的列表和元数据组成,镜像层堆叠成镜像,成为单个统一的对象.不同镜像之间可以共享镜像层.
镜像层由文件组成,上层镜像层文件可以覆盖下层镜像层文件.
文件视图
堆叠视图
可以看到第3层的镜像层中的文件7覆盖了第2层镜像层中的文件5
镜像摘要(Digest)
当一个镜像使用标签被pull,例如goflack:1.5,而这个镜像存在bug被修复并同样以goflack:1.5标签上传,之前pull过的镜像使用标签是不能感知改动的.因此Docker1.10中引入了镜像摘要(Image Digest),作为模型的一部分,每一个镜像都有一个基于内容的密码散列值.
docker image ls --digest 可以查看本地镜像的摘要
同时可以使用摘要来精确指定想要的镜像,例如
docker image pull alpine@sha256:0708098..1231dasdf812n1
分发散列值
摘要是根据镜像内容计算,每一个镜像层的改动或者镜像内容的改动都会使得镜像摘要发生变化.而镜像在传输过程中会压缩,为避免此影响,每个镜像层会同时包含一个分发散列值(Distribution Hash),这是一个压缩版的镜像散列值,用于校验拉取过程中的镜像是否被篡改过.
多平台架构的镜像
支持多架构的镜像意味着它可以同时支持Linux,Windows和ARM等多种架构.为了实现这个特性,镜像仓库服务API支持两种重要的结构:Manifest列表和Manifest定义.
一个镜像在不同的平台上有不同的Manifest,在该平台上Docker pull镜像时,会找到对应的Manifest文件并解析出组成该镜像的镜像层ID,然后从Docker Hub中拉去每个镜像层.