快速、轻量级OCI容器运行时crun介绍
crun 是一个快速、轻量级的 OCI(Open Container Initiative)容器运行时,完全用 C 语言编写。
为什么选择 C 而不是 Go?
大多数容器生态工具(如 runc)用 Go 编写,但作者认为 C 更适合底层工具。runc 本身也会 re-exec 并调用 C 模块来设置环境。
crun 的设计目标是:
- 可作为库(libcrun)直接嵌入其他程序,无需额外进程管理 OCI 容器。
- 更低的资源占用和更快的启动速度。
性能优势
相比 runc:
- 启动更快(示例:连续运行 100 个
/bin/true容器,crun 约 1.69 秒,runc 约 3.34 秒,快约 49%)。 - 内存占用更低(可支持更严格的内存限制,例如 512KB 级别仍能正常运行,而 runc 在 4MB 时可能失败)。
- 二进制体积更小(优化后约几百 KB,而 runc 约 15MB 级别)。
这些特性使其特别适合资源受限环境(边缘计算、IoT)、高密度容器场景(Kubernetes 节点大量 Pod),以及需要极低开销的场景。
主要特性
- 完整 OCI 运行时功能(create、start、run、delete、exec、pause、checkpoint/restore 等,支持 CRIU)。
- 支持 cgroup v2 原生。
- 支持 rootless 容器。
- 支持 WASM(通过 wasmedge 等)。
- 提供 krun 模式:结合 libkrun,在 KVM 虚拟化隔离环境中运行容器。
- 可选 Lua / Python 绑定。
- 可作为共享库使用(
--enable-shared)。
使用场景与生态
- 默认运行时:在 RHEL 9+、Fedora、Podman、CRI-O 等中常作为默认或推荐运行时。
- 可与 Docker、containerd、Kubernetes、Podman 等无缝替换 runc(只需配置运行时路径即可)。
- 适合需要高性能、低开销的生产环境。
构建与依赖
支持 Fedora、RHEL/CentOS、Ubuntu、Alpine、openSUSE 等。典型构建步骤:
1 | ./autogen.sh |
也支持 Nix 静态构建、共享库等。