概述
本章,您将了解到 Docker 中镜像的底层原理。
前面提到:
镜像:在 Docker 容器引擎中,镜像指将源代码、配置文件、环境等打包成的一个镜像文件,它是一个 只读的模板,采用分层的文件系统,可以用来创建一个或多个 Docker 容器实例。简单来说,镜像就相当于一个已经封装好的操作系统光盘(模板),而容器则是安装好之后可以随时启动/停止的系统(实例)。
到底是什么样的文件呢?来一看究竟。
Shell > docker pull nginx:latest
latest: Pulling from library/nginx
5eb5b503b376: Pull complete
1ae07ab881bd: Pull complete
78091884b7be: Pull complete
091c283c6a66: Pull complete
55de5851019b: Pull complete
b559bad762be: Pull complete
Digest: sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
如上面的例子,当 Docker 容器引擎尝试从公开仓库中拉取 nginx 的最新版本时,会下载 6 层关联的文件系统。
这里需要提到一个叫做 UnionFS(联合文件系统) 的文件系统,它是一种采用分层、轻量且高性能的文件系统,其支持对文件系统的修改作为一次提交来一层层叠加,允许将多个目录(层)挂载到同一个挂载点,形成一个统一的虚拟文件系统,每一层都是一个只读的文件系统快照。UnionFS 是 Docker 镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像)可以制作各种具体的应用镜像。早期的 Docker 采用 AUFS 文件系统,但现代的 GNU/Linux 普遍采用的是 OverlayFS(Linux 内核原生支持),它在性能和稳定性上更优,但其核心逻辑与 UnionFS 完全一致 —— 分层、叠加、写时复制、共享复用。
- 分层(Layering):文件系统被拆解为多个独立、只读的原子层,每层对应一次文件系统变更(如 RUN、COPY 指令)。这些层是构建过程的 「快照」,不可被修改,确保镜像构建的可重现性与一致性。每一层仅记录与上一层的差异,形成轻量化的变更单元。Docker 镜像的设计当中之所以引入 「层」的概念,是因为这样可以做到 资源共享,一方面可以减少镜像的拉取时间与存储时的空间占用,另外一方面,在利用镜像生成容器实例时,可节约内存的加载时间。
- 叠加(Stacking):多个只读层通过 UnionFS 挂载到同一挂载点,形成一个统一的虚拟文件系统。当多个层存在同名文件时,上层覆盖下层,底层文件被隐式隐藏,用户感知的是一个完整、连续的文件系统,而无需关心其内部结构。
- 写时复制(Copy-on-Write, CoW):一种具有隔离性的安全机制,当容器实例内的文件被修改时,CoW 机制会自动触发。当容器实例启动时,UnionFS 会在这些只读层之上动态挂载一个可写的容器层,所有运行时的修改(如修改配置文件、创建临时文件等)都发生在这一层,而底层镜像保持不变。简单来说就是 —— 当容器实例处于运行状态时,若需要修改实例内的一个文件时,系统不会直接修改它,而是先将该文件复制到最上层的可写层,再进行修改,从而保证镜像层的不可变性和安全性。
- 共享复用(Sharing & Reuse):多个 Docker 镜像通过共享相同的只读层,实现存储、网络与内存资源的极致复用。比如当宿主机已存在
alpine:latest镜像时,后续拉取nginx:latest、python:3.11-slim或redis:7等镜像时,若其底层包含相同的基础层,Docker 容器引擎会直接复用本地已缓存的层而无需重新下载或解压。每一层的 SHA256 哈希值作为唯一标识,确保内容一致性。
众所周知,GNU/Linux 的文件系统由 BootFS(boot file system) 和 rootFS(root file system) 两部分组成:
-
Boot file system - 系统上电后内核加载前的 临时只读文件系统,主要包含:
- 引导加载程序(bootloader),如 GRUB2 等
- Linux 内核镜像(vmlinuz)
- 对内存与磁盘进行初始化,如 initramfs 等
BootFS 的主要作用是用来给内核提供运行环境,使其能够识别并挂载真正的根文件系统。一旦内核完成初始化并成功挂载 rootFS,BootFS 会被卸载且释放占用的内存资源,不再参与后续的系统运行。
-
rootFS - 系统启动完成后唯一活跃的根文件系统,承载所有用户空间程序与数据,遵循 FHS (Filesystems Hierarchy Standard,由 Linux 基金会进行维护,目前版本为 3 )标准。rootFS 本质上就是遵循 FHS 标准的目录结构。在 Docker 容器引擎中,rootFS 位于 BootFS 之上。

Docker 中的「镜像层」都是 ==只读(read-only)== 的,而「容器层」是 ==可读可写== 的。当容器实例启动后,一个新的可写层被加载到镜像的顶部,该层被称为「容器层」。换言之,所有对容器实例的添加、删除、文件修改等操作都只会发生在「容器层」,因为只有「容器层」才是可写的。













