用 Docker 的人多,说清容器是什么的人少。十月二十二日一篇博文在 HN 上火了,作者为了搞懂容器,干脆自己动手写了一个迷你运行时,然后把过程中撞见的反直觉之处列成清单,标题就叫 Docker Is Weird。更妙的是 Docker 创始人现身评论区开起了问答,问答质量高到值得单独存档。我把博文与讨论串核了一遍,这篇是理解容器的上好材料。
五个怪点
一条最颠覆,容器并不真实存在。它只是带了限制的普通 Linux 进程,在进程表里看得见摸得着,没有 hypervisor,没有虚拟机,那句轻量级虚拟化的流行比喻从根上就是错的,错了几年的比喻改口不容易。第二条,所谓容器是五个内核特性拼出来的,命名空间、控制组,再加一堆网络上的奇怪操作,作者打趣说网络部分像穿着风衣假扮成一个特性的三个小个子。第三条,镜像只是文件夹,下载镜像这个动作的本质是把一个目录结构拉到本地,运行时换个根目录进去干活。第四条最技术,Go 语言写容器运行时别扭,运行时初始化阶段要求单线程系统调用,Go 的运行时不配合,业界方案里内嵌了 C 模块在 Go 启动前抢跑,Go 没有 fork 这件事也被变通绕过。第五条,Docker 要 root 权限,多数内核接口需要特权,普通用户场景里网络是最大短板。五条叠在一起看,容器神话的仙气散了,剩下的工程味反而亲切。
创始人下场
HN 讨论区的意外彩蛋是 Docker 创始人的现身,现身方式是直接下场回帖,没有官方腔。他透露项目从二零零八年一路迭代至今,中间换过名字换过架构,发布前几乎没人在意,早期版本用 Python 写,后来换 Go 一半是工程一半是策略,编译出单个二进制文件,各种语言背景的运维都愿意装。他现在的项目也在用 Go,被问到当年最难的取舍时答得坦率,技术的坑都能填,让人愿意试才是真关卡。创始人蹲在自己产品的讨论帖里答疑,这本身就是 HN 这个社区最美好的部分。
社区补充
评论区的高质量还在延续。有人补了协程跨线程跳转与进程克隆继承命名空间的坑,坑坑都带复现路径。有人推荐无 root、无守护进程的替代方案,适合被权限劝退的场景,那个方案连安装容器的目录都可以放进用户家目录。还有人甩出一个约一百行脚本的玩具实现,证明容器概念可以被极简复刻,一百行里克隆、命名空间、文件系统切换各占十几行,剩下的全是注释。加上业内著名的从零写容器演讲,这篇博文成了入口,评论区成了路标,想深入的人顺着走就行,路上还有蛋糕博客的下一篇文章等着。
写法值得学
这篇文章的教学法比内容本身更有参考价值。复刻自己在用的工具,是理解它的最快路径,作者图的就是这个懂字,轮子造不造得成无所谓。平时面试里背八股的容器知识,命名空间隔离、控制组限资源,在这篇里全部落到了具体行为上,容器是进程这句话一旦真正理解,排障时的整个思路都会变,进程能看日志能查句柄能送信号,容器也一样。
解决了什么需求
三类读者各取所需。新手拿它建立正确的底层图景,五条怪点看完,容器从黑盒变成带约束的进程,面试与排障都受用,面试官听到进程两个字也会抬头。中级开发者借它补底层,克隆、根目录切换、单线程初始化这些概念在容器语境里各归其位。老手看个乐子顺便收藏,创始人问答与玩具实现都是难得的素材。Docker 本体七万余星,Apache 协议,这篇博文不教你用,教你懂,懂了之后用起来才有底气。
一句收尾,最好的入门材料往往出自学习者的手,因为他还记得哪里反直觉,记得就是红利。
来源
- 博文原文 https://codeandcake.dev/posts/2026-10-22-docker-is-weird
- HN 讨论帖 https://news.ycombinator.com/item?id=50202681
- Docker 仓库 https://github.com/moby/moby