Docker镜像由多层只读层堆叠构成,每层对应Dockerfile一条指令,记录文件系统变更;容器运行时叠加一个可写层,通过Copy-on-Write机制实现读写隔离与镜像不可变性。
docker 镜像与容器的分层管理,核心在于理解“只读层 + 可写层”的结构设计。它不是靠人工划分目录或手动打标签实现的,而是由 docker 引擎自动通过联合文件系统(如 overlay2)组织起来的存储机制。
镜像本身由多层只读层堆叠而成
每一层对应 Dockerfile 中的一条指令(如 FROM、RUN、COPY),记录该步产生的文件系统变更:
- 基础层:操作系统根文件系统(如 ubuntu:22.04 的 rootfs)
- 中间层:安装的依赖(如 apt install nginx)、配置文件修改
- 顶层:应用代码、启动脚本、环境变量设置
所有层都按内容哈希唯一标识,相同内容的层在不同镜像间自动复用,节省磁盘空间和网络传输量。
容器运行时叠加一个可写层
当你执行 docker run 启动容器,Docker 会在镜像最上层挂载一个全新的可写层(也叫容器层):
- 容器内所有文件读取,是各层自上而下合并后的视图
- 写入新文件 → 直接写入可写层
- 修改已有文件 → 先将原文件从只读层复制到可写层(Copy-on-Write),再修改
- 删除文件 → 在可写层标记为“已删除”,屏蔽下层同名文件
这个机制保证了镜像不变性,同时让每个容器拥有独立的运行状态。
分层管理体现在日常命令中
你不需要手动操作层,但每条命令背后都在和分层逻辑打交道:
- docker history <image>:列出镜像每一层的创建命令、大小、时间
- docker inspect <image>:查看镜像的完整层 ID 列表(RootFS.Layers)
- docker build --no-cache:强制跳过缓存,重新生成每一层(用于排除构建污染)
- docker commit <container>:把容器可写层打包成新镜像的一层(不推荐,应优先用 Dockerfile)
合理利用分层能提升效率和安全性
分层不是技术炫技,而是解决实际问题的设计:
- 构建快:某一层没变,Docker 直接复用缓存层,跳过 RUN 命令
- 拉取快:pull 镜像时只下载本地没有的层,已有基础层无需重复传
- 清理准:docker system prune -a 会识别哪些层被多个镜像共用,只删真正无引用的层
- 回滚稳:镜像标签指向不同层组合,切换 tag 就是切换层指针,秒级生效


















