在 Linux 主机上启动一个 nginx 容器再跑 ps aux,nginx 就出现在进程列表里,用的是普通的宿主 PID——没有客户机内核,也没有启动 hypervisor。作者的总结是:容器就是一个普通的 Linux 进程,内核同意骗它(命名空间)并给它配额(cgroup),docker run 剩下的事都是把这两样装起来的管道。文章用两个浏览器模拟器走完八个阶段:CLI 是走 /var/run/docker.sock 的 REST 客户端;dockerd 自己不启动你的进程,而是交给 containerd 解包镜像层并跟踪生命周期;OCI bundle 是全部配方,一个 config.json 加一个根文件系统,声明 pid、network、mount、uts、ipc 五个命名空间;runc 建好命名空间和 cgroup、切进 rootfs、丢掉能力、把 nginx 作为 PID 1 exec 起来后自己退出。另一半是 cgroup:命名空间只负责隐藏,不限制任何东西,能拦住 fork 炸弹的是 ulimit -u、cgroup 的 pids.max 或 systemd 的 TasksMax,而这三者数的东西并不一样。