Kiri: 基于 Rust 重写的高性能容器运行时架构解析与实战

发布时间: 更新时间: 总字数:4957 阅读时间:10m 作者:IP:上海 网址

深入剖析基于 Rust 开发的新一代轻量容器运行时 Kiri(runkiri.com),解构其告别传统 dockerd/containerd/shim/runc 多层调用的单守护进程架构、基于 vsock 与 clone3 的毫秒级容器生命周期管理,并系统整理在 macOS、Linux 及 Windows 环境下的安装配置、Docker Desktop 零成本平滑迁移、本地域名与自动 HTTPS、Kiri Share 公网穿透及内置 k3s 集群的工程化实战指南。

为什么需要 Kiri:本地容器运行时的演进痛点

在现代软件工程中,本地容器环境主要由 Docker Desktop 统治,但随着开发环境日益复杂,开发者在日常使用中面临几大核心痛点:

  1. Docker Desktop 资源开销与商业授权限制:Docker Desktop 依赖多层代理结构(Electron 前端、虚拟化中介、dockerd、containerd、runc 等),常驻内存动辄占用 2 GB ~ 4 GB,闲置时仍消耗 CPU 周期,且对企业用户有付费许可门槛;
  2. 轻量级替代方案的体验割裂:Colima 和原生 Podman 虽然轻量且开源,但在 macOS 平台往往缺乏丝滑的桌面 GUI 管理、本地 DNS 自动路由、跨主机端口转发稳定性,或在 Docker API 细节兼容性上存在边缘瑕疵;
  3. 商业轻量产品 OrbStack 的架构局限:OrbStack 虽凭借精巧的内核适配大幅提升了性能,但其属于闭源专有软件;在架构底层,OrbStack 仍沿用 Docker 传统的进程模型,为每个运行中容器保留一个独立的 shim 进程。在运行上百个微服务容器的高密度测试场景下,仅驻留的 shim 进程就会吃掉超过 1 GB 内存。
    1. OrbStack 自带完整的 Docker 引擎与官方命令行工具(docker、docker compose、docker buildx 等),安装后无需再单独安装 Docker。若机器上已装有 Docker Desktop,建议按首次启动提示一键切换 Docker Context(或彻底卸载 Docker Desktop),避免二者抢占 Docker Socket。

新一代容器运行时 Kiri(runkiri.com,源码基于 Apache-2.0 / MIT 双重许可开源)正是在此背景下诞生。Kiri 完全由 Rust 编写,其核心设计理念是:用单个极小的 Rust 守护进程直通内核,彻底剔除中介层,实现比 Docker Desktop 快 8 倍的启动速度与 9 MB 级别的常驻内存开销。

flowchart TB subgraph Host["macOS / Windows / Linux 宿主机"] GUI["Kiri 桌面 GUI (AppKit / Win32)"] DockerCLI["Docker CLI / Compose / Buildx"] HostDaemon["kiri daemon (Rust, ~9MB RSS)
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 会经历至少五层跨进程/套接字通信:

flowchart TD subgraph Traditional["传统 Docker 体系调用链"] CLI["Docker CLI"] -->|HTTP / REST| Dockerd["dockerd (Docker Daemon)"] Dockerd -->|gRPC / Unix Socket| Containerd["containerd"] Containerd -->|fork / exec| Shim["containerd-shim (每个容器驻留一个)"] Shim -->|execve| Runc["runc (创建命名空间与 cgroup)"] Runc -->|execve| App["容器内用户进程 (PID 1)"] end subgraph KiriArch["Kiri 体系直通调用链 (macOS)"] KCLI["docker CLI / kiri CLI"] -->|HTTP Engine API| KDaemon["kiri daemon (Host, Rust)"] KDaemon -->|vsock 二进制协议 31µs| KInit["kiri-init (VM PID 1, Rust)"] KInit -->|clone3 直启| KApp["容器内用户进程 (直接子进程)"] end

在 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-initVM 内部 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.13Docker Desktop 4.90.0OrbStack 2.2.4Colima 0.10.3性能提升倍数
docker run --rm alpine true (中位数)22 ms178 ms279 ms152 ms比 Docker Desktop 快 8.09x
Engine API 容器完整生命周期3.1 ms163 ms238 ms88 ms比 Docker Desktop 快 52.5x
Engine API exec 响应耗时0.3 ms17.1 ms18.3 ms20.8 ms比 Docker Desktop 快 57x
已存在镜像 Pull 检查响应321 ms2,798 ms1,569 ms2,893 ms比 Docker Desktop 快 8.7x
并发启动吞吐量 (Parallel Starts)88.9 /s11.4 /s8.2 /s12.9 /s吞吐量领先 7.8x
容器进程额外常驻内存 (每容器)0 MB存在 shim 占用7.9 MB (143 容器占 1.13 GB)存在 shim 占用彻底消除 shim 内存泄漏
容器输出至宿主机吞吐 (stdout)223 MB/s45 MB/s87 MB/s63 MB/sI/O 吞吐领先 4.9x
Bind Mount 读吞吐 (1 GB)1,724 MB/s1,354 MB/s3,240 MB/s5,235 MB/sColima/OrbStack 优化更强
新 HTTP 连接建立吞吐1,892 /s865 /s2,389 /s1,484 /sOrbStack 自定义网络略胜

技术客观性评估:Kiri 在容器启停延迟、Docker API 交互、并发调度吞吐与常驻内存开销上呈现压倒性优势;而在文件系统挂载读写峰值与极端高频网络接入上,成熟的成熟商业栈(如 OrbStack 定制网络驱动、Colima virtiofs 激进缓存)仍有微弱优势。

跨平台安装与环境集成

1. macOS 平台

macOS 用户可通过官方 DMG 安装包安装(内置原生 AppKit 与 WebKit,绝非 Electron 套壳打包):

bash
# 下载并安装 Kiri.app (需 macOS 14+,支持 Apple Silicon 与 Intel)
# 首次启动 Kiri.app 会自动在 ~/.kiri/bin 建立 CLI 链接,并注册 Docker context

为了让当前终端即刻识别 kiri 与 docker 命令,检查环境 PATH 与 Docker 上下文:

bash
# 检查 kiri 所在路径
which kiri
# 输出: ~/.kiri/bin/kiri

# 查看当前 Docker Context
docker context ls

输出示例:

text
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:

bash
docker context use kiri

2. Linux 平台

在 Linux 环境下,Kiri 直接以原生无虚拟化模式运行:

bash
# 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 kiri

3. Windows 平台

Windows 环境下 Kiri 依托 WSL2 运行 Linux 容器后端,前端提供 Win32 / WebView2 界面。CLI 通过 Windows 命名管道 \\.\pipe\kiri 交互,免除 TCP 转发开销。

零成本平滑迁移:从 Docker Desktop / OrbStack 一键搬迁

当开发者决定从现有环境迁移至 Kiri 时,无需重新构建或拉取镜像,Kiri 提供了原生的无损迁移命令 kiri import。

迁移镜像、数据卷与容器配置

bash
# 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

迁移底层实现原理

  1. 镜像迁移:通过 docker save 管道直接对接到 Kiri 的 API 接收端并解压,无需经由外部 Registry 中转;
  2. 具名卷(Named Volumes)迁移:Kiri 在 Docker Desktop 与 Kiri 两侧分别拉起轻量只读 Helper 容器,通过标准 tar 流跨套接字复制文件层,完整保留文件的 UID、GID 及权限属性;
  3. 容器规格重建:读取源容器的 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 证书。
bash
# 启动一个 Nginx 容器,无需手动映射外部端口
docker run -d --name shop-web nginx:alpine

# 直接通过域名访问容器(支持 HTTP 与 HTTPS)
curl http://shop-web.kiri.localhost
curl https://shop-web.kiri.local -k

2. Kiri Share:一行命令生成公网安全穿透

在对接微信支付回调、Stripe Webhook 或向移动端/异地同事展示当前本地开发分支时,开发者通常需要借助 ngrok、Cloudflare Tunnel 等第三方反向代理。

Kiri 原生内置了 Kiri Share 隧道能力:

bash
# 暴露本地运行的 3000 端口或指定容器名
kiri share 3000

# 或指定容器名称并自定义子域名
kiri share shop-web --name mytest

输出反馈:

text
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 内部,防止软链接越权读取宿主机数据。
bash
# 在 macOS 上直接在终端或 Finder 中查看容器内的日志
ls -la ~/Kiri/shop-web/etc/nginx/

4. 20 秒启动单节点 Kubernetes(k3s)

本地需要验证 Helm Chart 或 Operator 时,启动常规 Minikube 或 Kind 往往耗费大量内存与启动等待时间。

Kiri 将 k3s 单节点控制平面集成于单个优化容器中:

bash
# 启动本地 Kubernetes 集群
kiri k8s start --use

# 查看集群状态
kubectl get nodes

输出示例:

text
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 镜像无需繁杂参数,执行效率接近原生架构:
bash
docker run --rm --platform linux/amd64 alpine uname -m
# 输出: x86_64

常用命令速查对照表

开发操作场景Kiri 命令 (kiri)标准 Docker 等效命令 (docker)
容器基础生命周期kiri run -d -p 80:80 nginxdocker run -d -p 80:80 nginx
查看运行状态kiri psdocker ps
公网共享穿透kiri share <port|container>无原生支持 (需外挂 ngrok)
管理公网固定二级域名kiri share reserve <subdomain>无原生支持
启动本地 Kuberneteskiri k8s startminikube start / kind create cluster
停止本地 Kuberneteskiri k8s stopminikube stop / kind delete cluster
启动常驻 Linux 容器机kiri machine create dev --distro ubuntu无直接等效
从 Docker Desktop 搬迁kiri import desktop-linux需手动逐个 save/load
诊断日志实时追踪kiri diag logs -f --enginedocker info / 查阅日志文件
USB 设备透传 (Mac 预览)kiri usb attach <device-id>无原生支持

最后

Kiri 以 Rust 重新思考了容器运行时在本地开发机的职责边界,抛弃了生产服务器上为多租户与复杂编排设计的冗长层级(dockerd/containerd/runc/shim),以单一进程直调内核系统调用,为本地容器工作流带来了质的飞跃。

参考

  1. https://runkiri.com/
  2. https://docs.runkiri.com/
  3. https://github.com/runkiri/kiri