自己写容器运行时之后才发现:Docker 处处都透着奇怪
来源:codeandcake.dev — 2026-10-22
📋 概述
作者为了好玩自己写容器运行时,一边写一边总结 Docker 的「怪」:容器不是虚拟机,只是被加了限制的普通进程,在 /proc 里找得到;Linux 也没有「容器」这个特性,它是 namespace、cgroup、网络等五个内核特性套在同一件风衣里。镜像本质上只是一堆文件夹,加上 chroot/pivot_root 就成了容器根目录;而用 Go 写 runc 更别扭——需要单线程调用的系统调用只能塞进 Go 运行时初始化前的 C 模块,没有 fork 就只能 exec /proc/self/exe 假装 fork。
🔑 核心要点
- 「容器」不是一个内核特性,而是 namespace + cgroup + 网络等若干机制的组合。
- 镜像是文件夹:下载、解包、chroot/pivot_root,然后 exec 里面的二进制。
- Go 的运行时天生多线程,而容器运行时需要的很多系统调用必须在单线程下执行,于是 runc 里塞了一段在 Go 运行时启动前跑的 C 模块。
- Go 没有 fork,runc 只能 exec /proc/self/exe 并靠特殊命令行参数来伪装成 fork。
💡 金句
Instead, containers are really 5 different linux kernel features in trenchcoat.
👍 0
👎 0
← 返回 Hacker News 首页