Docker 镜像分层原理入门:一次拉取为什么这么快
很多刚接触 Docker 的同学都会好奇:为什么第一次拉取一个几百 MB 的镜像要等很久,而第二次拉取几乎瞬间完成?答案就在 Docker 的镜像分层(Layer)机制。
一、镜像是由"层"叠出来的
Docker 镜像不是一个整体文件,而是一组只读层(read-only layers)的叠加。Dockerfile 里的每一条指令(FROM、RUN、COPY…)默认都会生成一层。比如:
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y python3
COPY . /app
上面三行大致对应三层:基础系统层、安装 Python 层、代码层。
二、层是可以复用的
每层的内容会计算一个 SHA256 摘要。如果你和别人的镜像都基于 ubuntu:22.04,那基础层在本机只需要存在一份,多个镜像共享它,这就是"分层存储"省空间的关键。拉取镜像时,Docker 会先检查本地是否已有某一层:有就跳过(输出里经常看到的 Layer already exists),只下载缺失的层,所以第二次拉取特别快。
三、写 Dockerfile 时怎么利用分层
层的顺序很重要:把不常变化的步骤放前面,常变化的放后面。例如先 COPY 依赖清单再安装依赖,最后才 COPY 源码,这样改代码只会使最后一层失效,前面的依赖层直接走缓存,构建速度从几分钟降到几秒。
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
RUN python build.py
四、容器层
容器启动时,Docker 在所有只读层上面加一个可写层(container layer),运行时的文件改动都写在这层,镜像本身永远不变。容器删除后可写层随之消失,这也是"容器即用即弃"的基础。
小结
理解了分层,就能解释日常很多现象:为什么 pull 很快、为什么构建缓存有时失效、为什么两个镜像能共享基础层。写 Dockerfile 时把"变化少的放前面"这条原则用起来,构建体验会立刻改善。
- 点赞
- 收藏
- 关注作者
评论(0)