Docker 体系化完整知识框架(从构建到运行到编排)
Dockerfile 定义分层构建规则 + 构建缓存优化打包速度 → 生成多层只读镜像(镜像层) → pull 分层落地磁盘、共享复用 → docker run 时通过联合文件系统动态堆叠图层 + 新增读写层形成容器 → docker compose 统一编排多容器协同运行
所有 Docker 行为,全部逃不出这条链路。
一、构建阶段:Dockerfile(镜像的源头)
1.1 核心本质
Dockerfile 每一条 改变文件 的指令(FROM / COPY / RUN / ADD)都会生成一层只读镜像层。
无文件变更指令(WORKDIR / ENV / CMD / EXPOSE)不产生图层,只修改镜像元数据。
1.2 构建缓存机制(核心优化)
Docker 构建是从上到下逐条校验缓存:
- 如果当前指令 & 对应文件哈希没变 → 复用缓存层
- 一旦某一层变更 → 当前层 + 后续所有上层全部失效重构建
✅ 企业标准顺序(为了缓存最大化):
复制依赖文件 => 安装依赖 => 复制业务代码
1.3 多阶段构建(生产必备)
多阶段 = 多个 FROM = 多个独立镜像文件系统
- 阶段1(builder):带完整环境、源码、打包工具,用于编译构建(npm run build)
- 阶段2(最终镜像):只复制编译产物,丢弃源码、工具、依赖、缓存
收益三要素:镜像极小、无源码泄露、攻击面极低
二、产物阶段:镜像(Image)= 多层只读文件模板
2.1 镜像本质
镜像 = 一堆有序、只读、分层文件的集合
镜像本身静态、不运行、无进程,只是磁盘上的文件模板。
2.2 镜像分层存储机制(你最容易混淆的点)
- 构建时:生成一层层独立文件层(分散存放)
- 磁盘存储:相同哈希图层全局共享,多镜像共用底层,省空间
- pull拉取时:分层按需下载,本地已有图层直接跳过,只拉缺失层
❗ 镜像阶段只是"存储分层",不会堆叠,堆叠只在容器启动时发生。
三、运行阶段:docker run 容器启动(核心底层技术)
3.1 容器启动真正做的事(必考底层)
执行 docker run 瞬间触发两大核心技术:
1)OverlayFS 联合文件系统(堆叠)
把镜像所有只读层按顺序从下到上完整堆叠,合成一个完整文件系统视图。
2)自动新增「容器读写层」
在所有镜像层最顶部生成一层:
- 可读写、容器独占、临时存在
- 所有容器内修改只写这一层(CoW写时复制)
- 删除容器立刻销毁,镜像层纹丝不动
3.2 镜像 vs 容器 终极区别
- 镜像:只有只读层、静态模板、永久存在
- 容器:只读镜像层 + 独立读写层、动态进程、临时存在
四、编排阶段:Docker Compose(多容器生命周期管理)
单个 docker run 只能跑单个容器;
Compose 是批量管理多个关联容器的工具。
4.1 核心能力
- 统一配置:镜像、端口、目录、网络、启动顺序、环境变量
- 一键启停整套微服务
- 自动创建容器内网,服务名互通
- 支持构建目标 target(开发/生产镜像切换)
4.2 体系位置
Dockerfile构建镜像 → 镜像run成容器 → compose统一编排多容器
这就是本地开发、测试、上线的完整流水线。
五、链路闭环总结
1. 编写 Dockerfile:定义分层规则、利用构建缓存、多阶段剥离源码与工具
2. docker build:生成多层只读镜像,每层对应文件变更记录
3. docker pull(可选) :分层落地磁盘,复用本地图层,节省空间带宽
4. docker run:OverlayFS 堆叠所有镜像层 + 新增独立读写层,形成运行容器
5. docker compose:编排前端、后端、数据库、中间件多容器协同工作
六、总结
- 镜像层只读,容器读写层临时,删容器不影响镜像。
- 构建缓存从上到下失效,所以依赖和代码要分层写。
- 多阶段构建隔离构建环境与运行环境,保证生产镜像干净安全。
- 镜像只是分层文件,容器启动才会堆叠文件系统。
- Compose 只负责编排容器,不构建镜像,镜像由 Dockerfile 生成。