Docker拉取镜像时的疑惑
不知道你在拉取镜像的时候会不会有这样的疑惑——我不是只拉取了一个镜像嘛,为什么会出现这么多的东西
Docker中Layer
(层)的概念
在 Docker 中,镜像(Image)是由多个层(Layer)组成的。这些层就像文件系统的快照,每一层都记录了从上一层开始的一系列变化。我们上面下载时候出现的ec99f8b99825
就属于一个层。
诸如 ec99f8b99825
的字符串是层的唯一标识符(Layer ID)。每一层都有一个独特的 ID,用来识别和引用这一层。拉取镜像时,Docker 会逐层下载这些层,并最终组合成一个完整的镜像。
使用层对于Docker镜像有以下好处:
- 共享和复用:如果不同的镜像共享相同的基础层,那么这些层只需要下载和存储一次,节省了磁盘空间和下载时间。
- 分层构建:Dockerfile 中的每一条指令(如
RUN
,COPY
,ADD
等)都会创建一个新的层。这样如果你对 Dockerfile 进行了一些小的修改,Docker 只需要重建修改后的部分,而不需要重新构建整个镜像。
Layer
的建立
当你使用 Dockerfile 创建镜像时,Docker 会按照 Dockerfile 中的每一条指令逐步构建镜像。每一条指令都会生成一个新的层,这个层记录了指令执行后文件系统的变化。最终镜像是由这些层按顺序叠加而成。
例如你现在有一个Dockerfile
:
FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y python3
COPY . /app
FROM ubuntu:20.04
:这条指令会拉取一个基础镜像(ubuntu:20.04)。这个镜像已经包含了操作系统的基本文件系统,它是整个镜像的基础层。RUN apt-get update
:这条指令会更新包管理器的索引,并生成一个新的层,记录了更新后的系统状态。RUN apt-get install -y python3
:这条指令安装 Python3,同样会生成一个新的层,记录安装 Python3 后文件系统的变化。COPY . /app
:这条指令将当前目录下的所有文件复制到镜像中的/app
目录,生成一个新的层,记录这些文件的添加。
最终生成的镜像由这几层叠加而成,每一层都记录了自上一个层以来的文件系统的变化。
Cached layers
(缓存层)
当你运行构建时,构建器会尝试重用早期构建中的层。如果图像的某个图层未更改,则构建器会从构建缓存中选取它。如果自上次构建以来某个层发生了更改,则必须重新构建该层以及后续的所有层。
这样如果你对 Dockerfile 进行了一些小的修改,Docker 只需要重建修改后的部分,而不需要重新构建整个镜像。
Layer
的复用
这个其实算比较常见了,如果你拉取的镜像共用同一Layer
,那么它不必重新拉取,而是可以复用。
每个层都有一个唯一的 ID,用来标识这一层。这个 ID 是通过对层内容进行哈希计算生成的,因此相同内容的层总是会生成相同的 ID。
当你拉取一个镜像时,Docker 会显示每个层的 ID。例如,诸如 ec99f8b99825
的字符串就是层的 ID。Docker 会逐层检查本地是否已经有该层,如果有就会跳过下载,直接复用本地已有的层。如果没有,则会从镜像仓库下载该层。
Layer
的合并与文件系统
当你拉取一个镜像时,Docker 会从远程仓库逐层下载组成该镜像的所有层。每个层下载完成后,Docker 会显示该层的状态,如 “下载完成”、“拉取完成”等。最终,这些层会在本地组合起来,形成完整的镜像。
虽然镜像由多个层组成,但在容器内,这些层会合并为一个统一的文件系统。容器看到的文件系统是这些层的叠加结果,每一层的更改会覆盖上层的内容。例如,如果在后面的层中删除或修改了文件,容器内的文件系统会反映这些变化,而不会看到原始的文件。
如果你对类似的文章感兴趣的话,欢迎访问:小树 | Docker拉取镜像时的疑惑——Layer
标签:Layer,文件系统,拉取,镜像,Docker,ID From: https://www.cnblogs.com/juniortree/p/18353235参考文章:Docs Docker | Layer