一、系列简介
当你执行 docker run nginx 时,背后发生了什么?Docker 客户端把请求发给 dockerd,dockerd 调用 containerd,containerd 启动 containerd-shim,shim 调用 runc,runc 创建 Namespace、配置 Cgroup、挂载 OverlayFS、执行容器进程——一条调用链穿越了四个进程、三个抽象层、两个规范(OCI Image Spec + Runtime Spec)。
本系列从** Linux 内核的隔离机制**出发,系统剖析现代容器运行时的完整技术栈。Namespace 提供视图隔离,Cgroup 提供资源限制,OverlayFS 提供分层文件系统——这三者构成了容器的”三大基石”。在此基础上,OCI 规范定义了镜像格式和运行时接口的标准,runc 是 OCI Runtime Spec 的参考实现,containerd 是工业级容器运行时管理器,containerd-shim 解耦了容器生命周期与 daemon 进程。
但容器运行时的演进并未止步于 runc。gVisor 用用户态内核提供更强隔离,Kata Containers 用轻量级虚拟机实现硬件级隔离,Wasm 容器则开辟了全新的轻量级运行时方向。容器网络(CNI)、容器存储(CSI)、镜像构建(BuildKit)构成了容器生态的三大支柱。理解这些技术的原理与实现,是从”会用容器”到”掌控容器运行时”的关键跨越。
本系列覆盖 16 个章节,从”容器全景:从 chroot 到 OCI”到 Namespace/Cgroup/OverlayFS 深入,再到 OCI 规范、runc 源码、containerd 架构与 shim,然后是容器完整流程、安全、沙箱运行时、网络、存储、镜像构建、Wasm 容器,最后以综合实战构建迷你容器运行时收尾。每章配有可运行的代码示例与架构图,让你从容器用户进阶到容器运行时工程师。
每章开头都包含历史渊源和前置知识两个部分:历史渊源讲述该主题从起源到现代的演进脉络,帮助你理解”为什么现在是这样设计的”;前置知识列出阅读本章需要的理论基础和前序章节链接,帮助你按需补课。建议先阅读前置知识中列出的章节,再进入当前章节的理论内容。
本系列假设你已具备 Linux 系统编程基础(系统调用、进程管理、文件系统),了解 Docker 基本操作(docker run/build/pull)。如果你需要补课,推荐先阅读姊妹系列「从零剖析 Linux 操作系统」中的 Cgroups 与 Namespaces 和 VFS 与文件系统 章节。
二、场景驱动阅读路线
不想按部就班从第 1 章读到第 16 章?以下 5 条路线从你日常遇到的真实问题出发,按”问题在哪→底层原理→如何实现”的顺序串联章节。每条路线可独立阅读,前置依赖已在路线内标注。
路线总览
路线A:docker run 背后发生了什么
场景:你每天都在用
docker run,但你知道容器进程是怎么创建出来的吗?Namespace 怎么隔离?Cgroup 怎么限制?文件系统怎么挂载?这条路线带你从用户态命令一路追踪到内核系统调用。
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch01 容器全景:从 chroot 到 OCI | 建立全景认知:容器技术的演进脉络、核心组件关系、关键概念定义 |
| 2 | Ch02 Linux Namespace 深入 | 视图隔离:PID/Mount/Network/User 等 8 种 Namespace 的原理与实现 |
| 3 | Ch03 Cgroup v2 深入 | 资源限制:CPU/内存/IO 的控制机制、Cgroup v2 统一层级设计 |
| 4 | Ch04 OverlayFS:容器文件系统 | 分层存储:lowerdir/upperdir/whiteout/copy-up 的完整机制 |
| 5 | Ch09 容器完整流程:docker run 背后 | 核心:从 docker CLI 到 runc 的完整调用链、每一步的系统调用 |
路线逻辑:先建立全景认知(Ch01),再深入三大内核机制——Namespace(Ch02)、Cgroup(Ch03)、OverlayFS(Ch04),最后在 Ch09 把所有知识串起来,完整追踪 docker run 的每一步。
路线B:OCI 规范与运行时实现
场景:你想理解容器运行时的标准化接口和实现细节。OCI 规范定义了什么?runc 怎么实现 OCI Runtime Spec?containerd 怎么管理容器生命周期?shim 为什么存在?
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch05 OCI 规范详解 | 标准接口:Image Spec 和 Runtime Spec 的完整定义、OCI Bundle 结构 |
| 2 | Ch06 runc 源码分析 | 核心:libcontainer 架构、容器创建/启动的代码路径、与内核的交互 |
| 3 | Ch07 containerd 架构 | 工业级管理:gRPC API、镜像管理、任务管理、插件体系 |
| 4 | Ch08 containerd-shim | 解耦设计:shim 的进程监督、升级安全、与 runc 的协作 |
路线逻辑:先理解 OCI 规范定义的接口标准(Ch05),再深入 runc 如何实现这些接口(Ch06),然后看 containerd 如何在 runc 之上构建工业级管理能力(Ch07),最后理解 shim 的解耦设计(Ch08)。
路线C:容器安全与隔离增强
场景:你的容器跑着不可信代码,runc 的 Namespace+Cgroup 隔离够吗?seccomp 怎么限制系统调用?AppArmor 怎么限制文件访问?gVisor 和 Kata Containers 怎么提供更强隔离?
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch02 Linux Namespace 深入 | 基础隔离:理解 Namespace 提供的隔离边界和已知逃逸方式 |
| 2 | Ch10 容器安全:seccomp/AppArmor/Capabilities | 核心:Linux 安全模块在容器中的应用、默认安全配置、rootless 容器 |
| 3 | Ch11 沙箱运行时:gVisor/Kata | 增强隔离:用户态内核、轻量级虚拟机、与 runc 的对比选型 |
路线逻辑:先理解基础隔离机制(Ch02),再学习 Linux 安全模块如何增强容器安全(Ch10),最后了解超越 runc 的沙箱运行时方案(Ch11)。
路线D:容器网络与存储
场景:容器怎么通信?veth pair 和 bridge 怎么工作?CNI 插件做了什么?容器数据怎么持久化?CSI 插件怎么对接存储后端?镜像怎么构建?
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch02 Linux Namespace 深入 | Network Namespace 是容器网络的基础 |
| 2 | Ch12 容器网络 | 核心:veth/bridge/iptables/CNI 的完整链路、网络模式对比 |
| 3 | Ch13 容器存储 | Volume/CSI/存储驱动:容器数据持久化的完整方案 |
| 4 | Ch14 镜像构建:BuildKit | Dockerfile/多阶段构建/缓存优化:从代码到镜像的工程实践 |
路线逻辑:先理解 Network Namespace 的隔离基础(Ch02),再深入容器网络实现(Ch12),然后学习存储持久化(Ch13),最后掌握镜像构建(Ch14)。
路线E:全栈容器运行时工程师
场景:你要成为容器运行时领域的专家,从内核机制到规范标准到工业实现到前沿方向,全面掌握。这是最完整的路线。
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch01 容器全景 | 全景认知 |
| 2 | Ch02 Namespace 深入 | 视图隔离 |
| 3 | Ch03 Cgroup v2 深入 | 资源限制 |
| 4 | Ch04 OverlayFS | 分层文件系统 |
| 5 | Ch05 OCI 规范详解 | 标准接口 |
| 6 | Ch06 runc 源码分析 | 运行时实现 |
| 7 | Ch16 综合实战 | 核心:构建迷你容器运行时,将所有知识融会贯通 |
路线逻辑:这是最完整的路线,从全景(Ch01)到三大内核机制(Ch02→Ch03→Ch04)到规范标准(Ch05)到实现(Ch06),最后综合实战(Ch16)。
路线F:动手实践路线
场景:你读完了理论,但还不知道怎么”动手验证”。这条路线串联各章的实践小节(
·附、实践),用真实命令和输出验证理论知识。每个实践都可以独立运行,建议在虚拟机中操作。
| 顺序 | 章节 | 实践内容 |
|---|---|---|
| 1 | Ch02 Namespace ·附 | 用 unshare 创建 UTS/PID/Network Namespace,观察隔离效果 |
| 2 | Ch03 Cgroup ·附 | 用 Cgroup v2 文件系统接口限制 CPU/内存,观察 PSI 指标 |
| 3 | Ch04 OverlayFS ·附 | 手工挂载 OverlayFS,验证 copy-up 和 whiteout 机制 |
| 4 | Ch05 OCI ·附 | 从零构建 OCI Bundle,用 runc 运行容器 |
| 5 | Ch10 容器安全 ·附 | 审计容器 Capabilities、只读文件系统、安全基线检查 |
| 6 | Ch12 容器网络 ·附 | 用 ip netns + veth pair 搭建最小容器网络 |
| 7 | Ch14 镜像构建 ·附 | 对比未优化和优化后的 Dockerfile,理解多阶段构建 |
路线逻辑:从内核机制实践(Namespace→Cgroup→OverlayFS)到运行时实践(OCI Bundle)到安全/网络/构建实践,逐步加深。每个实践都包含可运行的命令和真实输出,让你”看到”理论描述的现象。
路线交叉参考
同一章节在不同路线中的关注点不同:
| 章节 | 路线A 关注点 | 路线B 关注点 | 路线C 关注点 | 路线D 关注点 | 路线E 关注点 | 路线F 关注点 |
|---|---|---|---|---|---|---|
| Ch01 | 核心:全景认知 | — | — | — | 全景认知 | — |
| Ch02 | 视图隔离 | — | 基础隔离边界 | Network NS | 视图隔离 | 实践:unshare 创建 NS |
| Ch03 | 资源限制 | — | — | — | 资源限制 | 实践:Cgroup v2 限制 |
| Ch04 | 分层文件系统 | — | — | — | 分层文件系统 | 实践:OverlayFS 挂载 |
| Ch05 | — | OCI 标准接口 | — | — | 标准接口 | 实践:OCI Bundle 构建 |
| Ch06 | — | 核心:runc 实现 | — | — | 运行时实现 | — |
| Ch07 | — | containerd 管理 | — | — | — | — |
| Ch08 | — | shim 解耦 | — | — | — | — |
| Ch09 | 核心:完整流程 | — | — | — | — | — |
| Ch10 | — | — | 核心:安全模块 | — | — | 实践:安全审计 |
| Ch11 | — | — | 沙箱运行时 | — | — | — |
| Ch12 | — | — | — | 核心:网络 | — | 实践:网络搭建 |
| Ch13 | — | — | — | 存储持久化 | — | — |
| Ch14 | — | — | — | 镜像构建 | — | 实践:镜像优化 |
| Ch15 | — | — | — | — | — | — |
| Ch16 | — | — | — | — | 核心:综合实战 | — |
三、知识导图
以下导图展示 17 章知识之间的网络关系。与线性目录不同,这里强调跨技术的连接——Namespace 是容器网络和容器安全的基础,OverlayFS 是镜像构建和容器存储的桥梁,OCI 规范连接了镜像和运行时,runc 的实现依赖三大内核机制。
概念关系图
章节网络关系图
知识关联参考表
按四层模型组织:用户可见层 → 运行时层 → 内核机制层 → 增强与扩展层。同一行的条目之间存在直接的知识依赖或概念映射。
| 用户可见概念 | 对应章节 | 运行时实现 | 对应章节 | 内核机制 | 对应章节 | 增强扩展 | 对应章节 |
|---|---|---|---|---|---|---|---|
| docker run | Ch09 | containerd→shim→runc | Ch07,Ch08,Ch06 | Namespace+Cgroup+OverlayFS | Ch02,Ch03,Ch04 | gVisor/Kata | Ch11 |
| 容器镜像 | Ch14 | BuildKit+OCI Image Spec | Ch14,Ch05 | OverlayFS 分层 | Ch04 | — | — |
| 容器网络 | Ch12 | CNI 插件 | Ch12 | Network Namespace | Ch02 | — | — |
| 容器存储 | Ch13 | CSI 插件 | Ch13 | Mount Namespace+OverlayFS | Ch02,Ch04 | — | — |
| 容器安全 | Ch10 | seccomp+AppArmor+Cap | Ch10 | Namespace 隔离 | Ch02 | gVisor/Kata | Ch11 |
| 资源限制 | Ch03 | runc 配置 Cgroup | Ch06 | Cgroup v2 | Ch03 | — | — |
| 进程隔离 | Ch02 | runc 创建 Namespace | Ch06 | 8 种 Namespace | Ch02 | User NS rootless | Ch10 |
| 镜像标准 | Ch05 | OCI Image Spec | Ch05 | — | — | Wasm 镜像 | Ch15 |
| 运行时标准 | Ch05 | OCI Runtime Spec | Ch05,Ch06 | — | — | Wasm 运行时 | Ch15 |
四、系列大纲
以下是按章节编号排列的完整目录。建议结合上方的场景驱动阅读路线和知识导图选择适合你的阅读顺序。
| 章节 | 标题 | 核心内容 |
|---|---|---|
| 0 | 系列导读 | 系列定位、场景路线、知识导图、环境搭建 |
| 1 | 容器全景:从 chroot 到 OCI | 容器技术演进、核心组件关系、Docker/containerd/runc 架构全景 |
| 2 | Linux Namespace 深入 | 8 种 Namespace 原理、unshare/clone/setns 系统调用、Namespace 继承规则 |
| 3 | Cgroup v2 深入 | Cgroup v2 统一层级、CPU/内存/IO 控制器、eBPF 扩展 |
| 4 | OverlayFS:容器文件系统 | lowerdir/upperdir、whiteout 机制、copy-up 语义、容器层叠模型 |
| 5 | OCI 规范详解 | Image Spec、Runtime Spec、Distribution Spec、OCI Bundle 结构 |
| 6 | runc 源码分析 | libcontainer 架构、容器创建/启动代码路径、与内核交互 |
| 7 | containerd 架构 | gRPC API、镜像管理、任务管理、插件体系、事件系统 |
| 8 | containerd-shim | shim 进程监督、升级安全、与 runc 协作、task service |
| 9 | 容器完整流程:docker run 背后 | Docker→containerd→shim→runc 完整调用链、每步系统调用 |
| 10 | 容器安全:seccomp/AppArmor/Capabilities | Linux 安全模块、默认安全配置、rootless 容器、安全基线 |
| 11 | 沙箱运行时:gVisor/Kata | 用户态内核、轻量级虚拟机、与 runc 对比选型 |
| 12 | 容器网络 | veth/bridge/iptables/CNI、网络模式对比、网络命名空间 |
| 13 | 容器存储 | Volume/CSI/存储驱动、数据持久化方案 |
| 14 | 镜像构建:BuildKit | Dockerfile/多阶段构建/缓存优化/并行构建 |
| 15 | Wasm 容器:WasmEdge/WASI | Wasm 运行时、WASI 接口、与 OCI 集成、与 Linux 容器对比 |
| 16 | 综合实战:构建一个迷你容器运行时 | 用 Go 实现迷你容器运行时,综合运用 Namespace/Cgroup/OverlayFS |
五、开发环境搭建
以下环境搭建步骤基于 Ubuntu 22.04 LTS。其他发行版的包名和路径可能不同,请参考各项目官方文档。部分实验需要 root 权限,建议在虚拟机中操作。
Docker + containerd 环境
# 安装 Docker(包含 containerd)curl -fsSL https://get.docker.com | sh
# 验证 Docker 和 containerd 版本docker versionctr version
# 查看 containerd 配置cat /etc/containerd/config.toml
# 启用 containerd 的 CRI 插件(Kubernetes 需要)sudo sed -i 's/disabled_plugins = \["cri"\]/disabled_plugins = \[\]/' /etc/containerd/config.tomlsudo systemctl restart containerd
# 验证 CRI 插件crictl inforunc 开发环境
# 安装 Gosudo apt install golang-go# 或使用官方版本wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gzsudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gzexport PATH=$PATH:/usr/local/go/bin
# 编译 runcgit clone https://github.com/opencontainers/runccd runcmakesudo make install
# 验证安装runc --version
# 手动创建 OCI Bundle 测试mkdir -p /tmp/mycontainer/rootfscd /tmp/mycontainer# 导出 rootfsdocker export $(docker create busybox) | tar -C rootfs -xvf -# 生成 specrunc spec# 运行容器sudo runc run mycontainer容器安全工具
# 安装安全审计工具sudo apt install auditd apparmor-utils seccomp-tools
# 查看 AppArmor 状态sudo aa-status
# 查看容器的 seccomp 配置docker inspect --format '{{.HostConfig.SecurityOpt}}' <container>
# 使用 seccomp-tools 分析系统调用seccomp-tools dump <command>
# 安装 gVisor(runsc)curl -fsSL https://gvisor.dev/archive.key | sudo gpg --dearmor -o /usr/share/keyrings/gvisor-archive-keyring.gpgecho "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/gvisor-archive-keyring.gpg] https://storage.googleapis.com/gvisor/releases release main" | sudo tee /etc/apt/sources.list.d/gvisor.listsudo apt update && sudo apt install runsc
# 配置 Docker 使用 gVisor 运行时sudo dockerd --add-runtime=runsc=/usr/bin/runsc容器网络工具
# 安装网络诊断工具sudo apt install bridge-utils iptables dnsmasq
# 安装 CNI 插件git clone https://github.com/containernetworking/pluginscd plugins./build_linux.shsudo mkdir -p /opt/cni/binsudo cp bin/* /opt/cni/bin/
# 查看网络命名空间sudo ip netns list
# 查看 bridge 信息bridge link
# 查看 iptables NAT 规则sudo iptables -t nat -L -n -vDocker 安装后默认包含 containerd 和 runc,无需单独安装。如果你需要修改 runc 源码进行调试,建议从源码编译。gVisor 的 runsc 需要单独安装并注册为 Docker 运行时。
六、本系列的实践方法论
本系列遵循 观察 → 原理 → 实现 → 验证 的学习方法:
- 观察:用
docker inspect、ctr、runc list、nsenter、cgroupv2等工具观察容器的实际状态,建立直观认知 - 原理:深入内核源码和规范文档,理解 Namespace/Cgroup/OverlayFS 的底层机制
- 实现:阅读 runc/containerd 源码,理解工业级运行时如何实现规范
- 验证:手动创建 OCI Bundle、用 Go 实现迷你容器运行时,验证对原理的理解
每章的「动手实践」部分都遵循这一方法论。先观察现象,再理解原理,然后阅读实现,最后动手验证。
容器运行时涉及大量内核接口和特权操作。在生产环境中修改容器安全配置前,务必理解其安全边界。本系列在每章都会标注相关风险。
七、推荐参考资料
经典教材
| 书籍 | 作者 | 特点 |
|---|---|---|
| 《Containers from Scratch》 | Liz Rice | 用 Go 从零构建容器,理解容器本质的入门首选 |
| 《Container Security》 | Liz Rice | 容器安全全景,从隔离机制到安全策略 |
| 《Kubernetes in Action》 | Marko Lukša | K8s 实践全书,理解容器编排与运行时的关系 |
| 《Linux Kernel Development》 | Robert Love | 内核开发基础,理解 Namespace/Cgroup 的内核实现 |
| 《Understanding the Linux Kernel》 | Bovet & Cesati | 内核原理详解,进程/内存/文件系统的权威参考 |
在线资源
- OCI 规范 — OCI Runtime Specification 完整定义
- runc 源码 — OCI Runtime 参考实现
- containerd 文档 — containerd 架构设计与开发指南
- Liz Rice: Containers from Scratch — 用 Go 从零构建容器
- Linux Namespace Man Page — Namespace 系统调用手册
- Cgroup v2 文档 — Cgroup v2 内核文档
- Open Container Initiative — OCI 官方站点
调试与诊断工具
- docker inspect:查看容器详细配置(Namespace、Cgroup、安全策略)
- ctr:containerd 命令行客户端,直接操作 containerd API
- runc:OCI 运行时命令行工具,手动管理容器
- nsenter:进入指定 Namespace 执行命令
- seccomp-tools:分析 seccomp 过滤规则
- aa-status:查看 AppArmor 配置状态
- crictl:CRI 兼容运行时命令行工具
本系列的所有实践操作都可以在 Ubuntu 22.04 虚拟机中完成。建议使用 Vagrant 或 Multipass 快速创建开发环境,避免污染宿主系统。
准备好开始了吗?从 容器全景:从 chroot 到 OCI 开始你的容器运行时深入之旅吧!
参考
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
部分信息可能已经过时






