自己动手写容器运行时,才发现 Docker 处处奇怪
来源:codeandcake.dev — 2026-10-22
📋 概述
作者为了好玩自己写一个容器运行时,结果发现 Docker 的很多设计远比想象中奇怪。容器根本不是虚拟机,只是被加了限制的普通进程,内核仍在直接运行它,在 /proc 里就能找到;所谓容器也不是某个 Linux 特性,而是命名空间、cgroups 和一堆网络机制凑在一件风衣里。镜像其实就是一堆目录,Docker 把它放在某处,再用 chroot 或 pivot_root 变成容器进程的新根目录。
🔑 核心要点
- 容器只是带特殊限制的普通进程,内核仍在直接调度它,在 /proc 里能直接找到那个进程
- 镜像的本质是一堆目录,docker run 只是下载镜像、放到某处,然后执行 /some/weird/docker/path/bin/bash
- 容器运行时 runc 用 Go 写,很多需要单线程执行的系统调用,只能靠 Go 运行时初始化之前加载的 C 模块完成
- Go 没有真正的 fork,runc 只能重新 exec /proc/self/exe 并靠特殊命令行参数模拟出子进程
- Docker 守护进程通常要以 root 跑,作者猜测容器安全是极难的活;无根运行时要复刻同样的网络功能,得在用户态重写整个网络栈
💡 金句
There's not really a linux feature that's just 'containers' either. Instead, containers are really 5 different linux kernel features in trenchcoat.
👍 0
👎 0
← 返回 Lobsters 首页