Kiri: 基于 Rust 重写的高性能容器运行时架构解析与实战
深入剖析基于 Rust 开发的新一代轻量容器运行时 Kiri(runkiri.com),解构其告别传统 dockerd/containerd/shim/runc 多层调用的单守护进程架构、基于 vsock 与 clone3 的毫秒级容器生命周期管理,并系统整理在 macOS、Linux 及 Windows 环境下的安装配置、Docker Desktop 零成本平滑迁移、本地域名与自动 HTTPS、Kiri Share 公网穿透及内置 k3s 集群的工程化实战指南。
为什么需要 Kiri:本地容器运行时的演进痛点
在现代软件工程中,本地容器环境主要由 Docker Desktop 统治,但随着开发环境日益复杂,开发者在日常使用中面临几大核心痛点:
- Docker Desktop 资源开销与商业授权限制:Docker Desktop 依赖多层代理结构(Electron 前端、虚拟化中介、dockerd、containerd、runc 等),常驻内存动辄占用 2 GB ~ 4 GB,闲置时仍消耗 CPU 周期,且对企业用户有付费许可门槛;
- 轻量级替代方案的体验割裂:Colima 和原生 Podman 虽然轻量且开源,但在 macOS 平台往往缺乏丝滑的桌面 GUI 管理、本地 DNS 自动路由、跨主机端口转发稳定性,或在 Docker API 细节兼容性上存在边缘瑕疵;
- 商业轻量产品 OrbStack 的架构局限:OrbStack 虽凭借精巧的内核适配大幅提升了性能,但其属于闭源专有软件;在架构底层,OrbStack 仍沿用 Docker 传统的进程模型,为每个运行中容器保留一个独立的 shim 进程。在运行上百个微服务容器的高密度测试场景下,仅驻留的 shim 进程就会吃掉超过 1 GB 内存。
- OrbStack 自带完整的 Docker 引擎与官方命令行工具(
docker、docker compose、docker buildx等),安装后无需再单独安装 Docker。若机器上已装有 Docker Desktop,建议按首次启动提示一键切换 Docker Context(或彻底卸载 Docker Desktop),避免二者抢占 Docker Socket。
- OrbStack 自带完整的 Docker 引擎与官方命令行工具(
新一代容器运行时 Kiri(runkiri.com,源码基于 Apache-2.0 / MIT 双重许可开源)正是在此背景下诞生。Kiri 完全由 Rust 编写,其核心设计理念是:用单个极小的 Rust 守护进程直通内核,彻底剔除中介层,实现比 Docker Desktop 快 8 倍的启动速度与 9 MB 级别的常驻内存开销。
Docker Engine API"] LocalDNS["本地 DNS 与自动 HTTPS CA
*.kiri.local / *.kiri.localhost"] NFS["只读 NFSv3 服务
挂载至 ~/Kiri 容器文件树"] ShareTunnel["Kiri Share 客户端
直连 edge.runkiri.com:443"] end subgraph Channel["跨边界极速通信"] Vsock["vsock 通道 (31µs 延迟, 二进制帧协议)
(Linux 宿主直接使用 Unix Domain Socket)"] VirtioFS["virtiofs 文件共享 (/mnt/mac 目录挂载与 Rosetta 2)"] end subgraph GuestVM["精简 Linux VM (macOS/Win) 或 宿主内核 (Linux)"] Agent["kiri-init (PID 1, 静态 Rust 守护进程)
单线程 poll 事件循环 / DHCP / 嵌入式 DNS"] Bridge["网桥网络 (kiri0, 172.17.0.0/16)
nftables 规则 / rtnetlink 配置"] K8s["内置 k3s 集群容器 (单节点)"] subgraph Containers["容器进程 (kiri-init 直接子进程, 零 shim 驻留)"] C1["容器 1 (clone3, 独立 namespaces + cgroup)"] C2["容器 2 (clone3, 独立 namespaces + cgroup)"] end end DockerCLI -->|API 请求| HostDaemon GUI -->|控制交互| HostDaemon HostDaemon <-->|二进制控制帧| Vsock Vsock <-->|事件响应与 I/O 流| Agent Agent -->|clone3| C1 Agent -->|clone3| C2 Agent --- Bridge HostDaemon --- VirtioFS VirtioFS --- Agent NFS -.->|按需提取文件流| Agent
核心架构深度解构:彻底告别 dockerd、containerd 与 shim
传统多层调用链 vs Kiri 直通架构
理解 Kiri 性能突破的关键在于对比容器创建与执行的调用链路。
在传统的 Docker Desktop 或 Colima 体系中,执行一次 docker run 会经历至少五层跨进程/套接字通信:
在 Kiri 的架构中:
- 虚拟机内部没有任何 dockerd、containerd、shim 或 runc;
- 虚拟机内的 PID 1 是一个使用 Rust 静态编译的极简 Agent(
kiri-init); - 宿主机守护进程收到 API 请求后,通过
vsock向 VM 发送单个紧凑的二进制帧(帧结构为长度、类型与负载,耗时约 31 µs); kiri-init直接调用 Linux 内核的高级系统调用clone3(CLONE_INTO_CGROUP),一步创建命名空间并直接关联到目标 cgroup,随后挂载 OverlayFS、执行pivot_root、丢弃特权 Capabilities、注入 seccomp 过滤规则并拉起容器主进程;- 所有容器进程均是
kiri-init的直接子进程,容器退出后由其单线程poll()事件循环直接回收,零额外常驻进程。
三大核心组件
| 组件名称 | 运行位置 | 技术栈与实现机制 | 核心职责 |
|---|---|---|---|
kiri daemon | 宿主机 (Mac / Host) | Rust 单二进制 (~2.2 MB) | 监听 ~/.kiri/run/docker.sock,实现 Docker Engine API;维护镜像仓库缓存、驱动 VM 生命周期及网络端口监听。 |
| 精简 Linux VM | 宿主机虚拟机管理器 | Apple Virtualization.framework | 驱动定制的 10 MB 超精简 Linux 内核(基于 allnoconfig 裁剪,仅保留容器必要驱动,合入 virtio-pci reset 和 Apple NAT 超大包支持补丁)。 |
kiri-init | VM 内部 PID 1 | 静态编译 Rust 程序 | 兼任 VM 初始化进程与容器执行引擎。负责管理 cgroup/namespaces、挂载 OverlayFS、配置 nftables/rtnetlink、转发 stdout/stderr、回收僵尸进程。 |
在 Linux 宿主机上,Kiri 完全不启动虚拟机。
kiri-init与kiri daemon作为普通 systemd 根服务直接运行在宿主机内核上,vsock 转换为 Unix 域套接字,实现完全无损的原生容器调度。
内存管理与秒级深度休眠
- 极小常驻开销:在未运行容器时,宿主机
kiri daemon内存占用约 9 MB ~ 15 MB,VM 内kiri-init仅占用约 0.69 MB; - 动态内存回收:容器运行产生或释放的内存通过
virtio-balloon与内核内存紧凑机制动态归还给宿主机操作系统; - 60 秒空闲深度休眠:当所有容器停止且空闲满 60 秒后,Kiri 自动将 Linux VM 转入休眠状态,释放所有 VM 内存;当新的 Docker API 请求到达时,仅需 0.15 秒(150 毫秒)即可瞬间唤醒(相比常规内核 810 ms 的冷启动,Kiri 裁剪内核冷启动也仅需 112 ms)。
性能基准横向测评
官方在统一硬件平台(Apple Silicon M3 Max, 64 GB 内存,各引擎统一定义 2 核 CPU 与 8 GB 内存上限)上,基于原生 Docker CLI 与相同的热镜像进行了完整压测对比:
| 测试指标项 | Kiri 0.1.13 | Docker Desktop 4.90.0 | OrbStack 2.2.4 | Colima 0.10.3 | 性能提升倍数 |
|---|---|---|---|---|---|
docker run --rm alpine true (中位数) | 22 ms | 178 ms | 279 ms | 152 ms | 比 Docker Desktop 快 8.09x |
| Engine API 容器完整生命周期 | 3.1 ms | 163 ms | 238 ms | 88 ms | 比 Docker Desktop 快 52.5x |
Engine API exec 响应耗时 | 0.3 ms | 17.1 ms | 18.3 ms | 20.8 ms | 比 Docker Desktop 快 57x |
| 已存在镜像 Pull 检查响应 | 321 ms | 2,798 ms | 1,569 ms | 2,893 ms | 比 Docker Desktop 快 8.7x |
| 并发启动吞吐量 (Parallel Starts) | 88.9 /s | 11.4 /s | 8.2 /s | 12.9 /s | 吞吐量领先 7.8x |
| 容器进程额外常驻内存 (每容器) | 0 MB | 存在 shim 占用 | 7.9 MB (143 容器占 1.13 GB) | 存在 shim 占用 | 彻底消除 shim 内存泄漏 |
| 容器输出至宿主机吞吐 (stdout) | 223 MB/s | 45 MB/s | 87 MB/s | 63 MB/s | I/O 吞吐领先 4.9x |
| Bind Mount 读吞吐 (1 GB) | 1,724 MB/s | 1,354 MB/s | 3,240 MB/s | 5,235 MB/s | Colima/OrbStack 优化更强 |
| 新 HTTP 连接建立吞吐 | 1,892 /s | 865 /s | 2,389 /s | 1,484 /s | OrbStack 自定义网络略胜 |
技术客观性评估:Kiri 在容器启停延迟、Docker API 交互、并发调度吞吐与常驻内存开销上呈现压倒性优势;而在文件系统挂载读写峰值与极端高频网络接入上,成熟的成熟商业栈(如 OrbStack 定制网络驱动、Colima virtiofs 激进缓存)仍有微弱优势。
跨平台安装与环境集成
1. macOS 平台
macOS 用户可通过官方 DMG 安装包安装(内置原生 AppKit 与 WebKit,绝非 Electron 套壳打包):
# 下载并安装 Kiri.app (需 macOS 14+,支持 Apple Silicon 与 Intel)
# 首次启动 Kiri.app 会自动在 ~/.kiri/bin 建立 CLI 链接,并注册 Docker context为了让当前终端即刻识别 kiri 与 docker 命令,检查环境 PATH 与 Docker 上下文:
# 检查 kiri 所在路径
which kiri
# 输出: ~/.kiri/bin/kiri
# 查看当前 Docker Context
docker context ls输出示例:
NAME DESCRIPTION DOCKER ENDPOINT
default Current DOCKER_HOST based configuration unix:///var/run/docker.sock
desktop-linux Docker Desktop unix:///Users/xiexianbin/.docker/run/docker.sock
kiri * Kiri container runtime unix:///Users/xiexianbin/.kiri/run/docker.sock切换上下文至 Kiri:
docker context use kiri2. Linux 平台
在 Linux 环境下,Kiri 直接以原生无虚拟化模式运行:
# Ubuntu / Debian (.deb)
sudo dpkg -i kiri_amd64.deb
sudo systemctl enable --now kiri
# RHEL / CentOS / Rocky Linux (.rpm)
sudo rpm -ivh kiri_x86_64.rpm
sudo systemctl enable --now kiri3. Windows 平台
Windows 环境下 Kiri 依托 WSL2 运行 Linux 容器后端,前端提供 Win32 / WebView2 界面。CLI 通过 Windows 命名管道 \\.\pipe\kiri 交互,免除 TCP 转发开销。
零成本平滑迁移:从 Docker Desktop / OrbStack 一键搬迁
当开发者决定从现有环境迁移至 Kiri 时,无需重新构建或拉取镜像,Kiri 提供了原生的无损迁移命令 kiri import。
迁移镜像、数据卷与容器配置
# 1. 查看 Docker Desktop (desktop-linux) 中可供导入的资源列表
kiri import desktop-linux --list
# 输出示例:
# images:
# nginx:alpine
# postgres:17
# redis:7
# volumes:
# pg_data
# containers:
# dev-api-1
# 2. 一键全量导入
kiri import desktop-linux
# 3. 或者精准选择性导入
kiri import desktop-linux image postgres:17
kiri import desktop-linux volume pg_data迁移底层实现原理
- 镜像迁移:通过
docker save管道直接对接到 Kiri 的 API 接收端并解压,无需经由外部 Registry 中转; - 具名卷(Named Volumes)迁移:Kiri 在 Docker Desktop 与 Kiri 两侧分别拉起轻量只读 Helper 容器,通过标准
tar流跨套接字复制文件层,完整保留文件的 UID、GID 及权限属性; - 容器规格重建:读取源容器的
docker inspect元数据,完整提取 Entrypoint、CMD、环境变量、端口映射、挂载点、资源限制(CPU/Memory limits)与重启策略,在 Kiri 中以stopped状态重新注册。
核心实战功能与开发者工作流
1. 本地容器域名与自动 HTTPS
传统 Docker 开发需要牢记各种动态映射的端口(如 localhost:3000、localhost:8080),且无法便捷支持 HTTPS 证书。
Kiri 在宿主机内置了一个轻量 DNS 解析器与反向代理网关:
- 任意命名的容器均可通过
<container-name>.kiri.localhost或<container-name>.kiri.local直接访问; - 对于
docker compose项目,子服务自动解析为<service>.<project>.kiri.local; - 内置本地专用轻量级 CA,所有本地域名自动签发有效 HTTPS 证书。
# 启动一个 Nginx 容器,无需手动映射外部端口
docker run -d --name shop-web nginx:alpine
# 直接通过域名访问容器(支持 HTTP 与 HTTPS)
curl http://shop-web.kiri.localhost
curl https://shop-web.kiri.local -k2. Kiri Share:一行命令生成公网安全穿透
在对接微信支付回调、Stripe Webhook 或向移动端/异地同事展示当前本地开发分支时,开发者通常需要借助 ngrok、Cloudflare Tunnel 等第三方反向代理。
Kiri 原生内置了 Kiri Share 隧道能力:
# 暴露本地运行的 3000 端口或指定容器名
kiri share 3000
# 或指定容器名称并自定义子域名
kiri share shop-web --name mytest输出反馈:
Live: https://mytest.runkiri.cloud -> localhost:3000
Press Ctrl+C or 'kiri share disconnect' to stop.- 工作机制:Kiri 宿主机守护进程向边缘网关(
edge.runkiri.com:443)建立单条加密 TLS 隧道。外部流量进入边缘节点后,沿该隧道推回本地端口; - 防钓鱼保护机制:公网访问者首次打开
*.runkiri.cloud时,会看到 Kiri 官方提示页,告知该页面为本地开发者的临时映射地址,确认后方可跳转,防止被滥用于钓鱼欺诈。
3. macOS Finder 原生容器文件树浏览(~/Kiri)
排查容器内生成的文件、日志或临时缓存时,传统方式需要进入 docker exec 或使用 docker cp 复制文件。
Kiri 采用了系统级无侵入的只读文件系统映射方案:
- 宿主机
kiri daemon内置了一个极简只读 NFSv3 服务器,绑定在专用 Unix Domain Socket 上; - 通过 macOS 系统内置的
mount_nfs命令直接挂载到用户目录下的~/Kiri(无需任何第三方内核驱动,无需 root 提权); - 开发者可以直接在 Finder 或 VS Code 中打开
~/Kiri/<container-id>/,按需实时查看容器根目录文件;Agent 内部强制将路径限定在容器 rootfs 内部,防止软链接越权读取宿主机数据。
# 在 macOS 上直接在终端或 Finder 中查看容器内的日志
ls -la ~/Kiri/shop-web/etc/nginx/4. 20 秒启动单节点 Kubernetes(k3s)
本地需要验证 Helm Chart 或 Operator 时,启动常规 Minikube 或 Kind 往往耗费大量内存与启动等待时间。
Kiri 将 k3s 单节点控制平面集成于单个优化容器中:
# 启动本地 Kubernetes 集群
kiri k8s start --use
# 查看集群状态
kubectl get nodes输出示例:
NAME STATUS ROLES AGE VERSION
kiri-k3s Ready control-plane,master 18s v1.31.2+k3s1- 端口与网络透传:Kubernetes 的
LoadBalancer类型 Service 暴露的端口会自动绑定并映射到宿主机localhost,开发者可以在浏览器中直接访问 Pod 暴露的服务。
5. 跨架构镜像编译与 Rosetta 2 无缝运行
在 Apple Silicon 芯片(M 系列)上调试仅提供 linux/amd64 架构的遗留商业基础镜像时,Docker Desktop 的 QEMU 模拟往往速度极慢。
Kiri 采用苹果官方 Rosetta 2 for Linux 二进制转换方案:
- 宿主机将 macOS Rosetta 转换运行时通过 virtiofs 挂载进 VM;
- 虚拟机内核通过
binfmt_misc将其注册为 x86_64 ELF 文件的解释器; - 运行 amd64 镜像无需繁杂参数,执行效率接近原生架构:
docker run --rm --platform linux/amd64 alpine uname -m
# 输出: x86_64常用命令速查对照表
| 开发操作场景 | Kiri 命令 (kiri) | 标准 Docker 等效命令 (docker) |
|---|---|---|
| 容器基础生命周期 | kiri run -d -p 80:80 nginx | docker run -d -p 80:80 nginx |
| 查看运行状态 | kiri ps | docker ps |
| 公网共享穿透 | kiri share <port|container> | 无原生支持 (需外挂 ngrok) |
| 管理公网固定二级域名 | kiri share reserve <subdomain> | 无原生支持 |
| 启动本地 Kubernetes | kiri k8s start | minikube start / kind create cluster |
| 停止本地 Kubernetes | kiri k8s stop | minikube stop / kind delete cluster |
| 启动常驻 Linux 容器机 | kiri machine create dev --distro ubuntu | 无直接等效 |
| 从 Docker Desktop 搬迁 | kiri import desktop-linux | 需手动逐个 save/load |
| 诊断日志实时追踪 | kiri diag logs -f --engine | docker info / 查阅日志文件 |
| USB 设备透传 (Mac 预览) | kiri usb attach <device-id> | 无原生支持 |
最后
Kiri 以 Rust 重新思考了容器运行时在本地开发机的职责边界,抛弃了生产服务器上为多租户与复杂编排设计的冗长层级(dockerd/containerd/runc/shim),以单一进程直调内核系统调用,为本地容器工作流带来了质的飞跃。