背景
OpenClaw(小龙虾)这波热度起来后,我看到一个明显趋势:很多团队都在做“套壳龙虾”,而云端落地方案基本默认是 Docker 容器。这个选择在早期完全合理,工程心智成本也最低。
但当我自己尝试部署云端 Claude Code 时,问题很快出现了: 如果 3 到 6 个月后 Agent 数量继续爆发,容器方案在资源利用率和存储复用上的浪费会被放大。换句话说,我们需要的不是“把 Agent 装进容器”,而是一个更偏 Agent as a Service 的运行架构。
在 AI Agent 类系统里,常见需求是同时服务大量租户,每个租户都需要“可执行、可隔离、可复现”的运行环境。
传统做法是“每个租户一个 Docker 容器”,这个模型直观,但在高并发场景会遇到两个老问题:
- 算力闲置:容器请求的 CPU/内存和真实负载常年不匹配,形成大面积低利用率。
- 存储重复:同类租户反复携带相似运行时和依赖,镜像层复用无法完全消掉“每租户可写层 + 项目依赖”带来的重复占用。
在增长侧,Agent 需求已经开始从试验走向规模化。Gartner 在 2025-06-25 的预测里给出两个信号:到 2028 年,日常决策中会有一部分由 Agent 自主完成,企业软件中带 Agent 能力的占比也会提升。
如果再考虑 OpenClaw 这类开源 Agent 基座在 2026 年的快速增长(截至 2026-03-22,GitHub 显示约 329k stars),云端活跃 Agent 实例规模继续上行是可以预期的,容量规划要提前做。
这里整理一种替代方向:Docker 负责交付基础运行面,bwrap 负责进程级隔离,Nix 负责确定性依赖。核心目标不是替代 Docker,而是把“租户级实例”从容器粒度下沉到进程粒度。
一句话架构
单宿主长驻网关 + 每请求/每会话启动 bwrap 沙箱 + 共享只读 Nix Store + 任务时按需激活开发环境。
还有一个对扩容很关键的约束:执行环境尽量无状态,状态都落在租户各自的 workspace 文件里。这样后续做水平扩展时,迁移的是“请求和工作区映射”,不是整套运行时内存态,系统会更稳定。
这个组合把“环境构建成本”与“租户隔离成本”拆开处理:
- 构建期:把依赖固化进不可变依赖层(Nix Store)。
- 运行期:租户只创建轻量隔离壳(bwrap + namespace)。
- 任务期:在隔离壳内按声明激活工具链(而非提前烘焙整镜像)。
设计抽象:四层模型
- 分发层(Gateway)
负责鉴权、路由、会话映射、生命周期管理。 - 隔离层(Sandbox)
用 Linux namespace + 挂载策略构建“最小可运行文件系统视图”。 - 依赖层(Nix Store)
把语言运行时、构建工具、媒体工具等做成可复用、不可变的依赖对象。 - 任务层(Task Runtime)
每次任务在隔离壳内临时激活声明式环境,任务结束即释放执行上下文。
核心算法:一次任务如何被执行
可以抽象成以下流程:
- 租户上下文解析:根据用户标识定位其工作区和会话状态。
- 工作区就绪检查:若首次访问,复制模板并打初始化标记;否则直接复用。
- 沙箱构建:
- 根文件系统使用临时内存层;
- 仅挂载必要只读系统路径;
- 挂载租户私有可写目录;
- 挂载共享只读依赖层;
- 注入最小环境变量集。
- 网络策略选择:
- 需要外网时使用受控出口;
- 不需要时直接断网。
- 任务执行包装:用声明式环境激活器包装真实命令,确保版本与依赖一致。
- 结果回传与回收:流式返回输出,进程随父生命周期回收,临时层自动销毁。
这个流程的关键点是:隔离是运行时动作,依赖一致性是构建时资产。
与“每租户一个 Docker”相比,真正变化了什么
| 维度 | 传统 Docker 多租户 | Nix + bwrap 方案 |
|---|---|---|
| 租户实例粒度 | 容器 | 进程沙箱 |
| 启动成本 | 需要拉起容器上下文 | 直接拉起受限进程 |
| 依赖复用 | 镜像层复用,粒度较粗 | Store 对象复用,粒度更细 |
| 环境一致性 | 依赖镜像版本管理纪律 | 依赖由声明式约束直接收敛 |
| 隔离手段 | 容器隔离 | namespace + 挂载白名单 |
| 资源密度 | 中等 | 高(适合大量短任务) |
| 调试方式 | 进入容器排查 | 复现同一声明环境排查 |
从系统视角看,这不是“谁更安全”这么简单,而是把容量瓶颈从容器编排开销迁移到内核进程调度与 I/O 管理。
为什么这套架构在 Agent 场景更合适
- 任务时长短、启动频繁
Agent 工具调用通常是秒级或分钟级,进程沙箱比容器重建更匹配。 - 依赖组合变化快
不同任务需要不同语言和工具链,声明式按需激活比维护大量镜像组合更可控。 - 需要可复现排障
同一依赖声明可直接复现现场,减少“线上与本地不一致”。 - 需要高租户密度
共享只读依赖层显著降低重复磁盘占用与冷启动下载。
一个关键点:为什么声明式环境更适合 Agent 系统
很多人把 Nix 当“更难的包管理器”,但在 Agent 系统里它更像环境状态描述。
对 Agent 来说,flake.nix 有两个直接收益:
- 可读性收益
Agent 不需要倒推长脚本,只要读取一个声明文件,就能快速知道“可用工具链 + 版本约束 + 运行钩子”。 - 可执行性收益
任务执行时可以按声明激活环境,而不是在运行期重新走一遍apt-get/curl bash这类过程式安装流程。
这对自动化系统很关键。过程式脚本的本质是“步骤历史”,声明式文件的本质是“目标状态”。
对于需要频繁决策和自我修正的 Agent,后者通常更容易做静态理解、冲突检测和快速复现。
安全边界如何定义
这类方案的安全性不依赖单一组件,而是依赖“边界叠加”:
- 挂载边界:默认不可见,按白名单暴露路径。
- 写权限边界:依赖层只读,租户只写自己的工作区。
- 进程边界:只能看到沙箱内进程树。
- 网络边界:按任务策略选择共享、代理或隔离网络。
- 资源边界:通过上层调度系统加 CPU/内存/并发配额。
工程上要注意:bwrap 只解决进程级隔离,不替代宿主级资源治理;资源限制和审计仍要由编排层承担。
成本模型:这套设计把钱花在哪
传统模式常把成本花在:
- 容器创建与销毁;
- 镜像拉取与层缓存失效;
- 多语言依赖重复打包。
Nix + bwrap 模式把成本转移到:
- 前置构建和缓存治理;
- 依赖声明质量;
- 沙箱策略维护(挂载、网络、权限矩阵)。
因此它适合“前期工程化投入换长期密度收益”的团队,不适合一次性脚本型系统。
举个很具体的例子:两个用户都要用 Chrome。
在“每租户一个 Docker”模式里,通常会出现两份安装和两份可写层开销;在 Nix 模式里,只要在 flake.nix 声明该依赖,底层通过 Store 和 binary cache 复用同一份构件。结果是同一依赖只构建/下载一次,磁盘占用和冷启动压力都更可控。
一次真实试错:冷启动慢且时间方差巨大,bwrap 不是瓶颈
落地早期碰到一个很误导的问题:包装后的 gemini-cli 冷启动经常非常慢,而且每次慢的程度不稳定。
第一轮怀疑对象都很“合理”:
- 云盘 I/O 抖动;
- bwrap 隔离开销;
- Nix 环境激活构建延迟。
但逐项排除后发现都不是主因。真正的根因是:gemini-cli 在启动阶段会检查 ripgrep 二进制,找不到时会触发外网下载;而检查路径不是系统 PATH,而是固定的全局目录。
这就导致两件事同时发生:
- 冷启动时延受外网状态影响;
- 时延方差变大,压测曲线很难稳定。
最终解法是让系统预先满足这个固定路径期望(例如在沙箱里把已有 ripgrep 映射到该路径),把下载行为从运行期移到构建期。
这个案例的教训是:当延迟既慢又抖时,先确认是否存在隐式下载链路,再谈隔离和调度优化。
不适用边界
以下场景不建议优先采用:
- 团队没有 Linux 隔离与 Nix 维护经验;
- 任务本身是长生命周期服务,更适合直接容器编排;
- 强依赖 GPU 设备透传且隔离策略尚未标准化;
- 合规要求必须使用成熟容器安全栈的现成认证路径。
迁移策略(从 Docker 走向 Nix + bwrap)
建议分三步,不要一次重构:
- 先声明依赖:把当前镜像里的关键运行时迁到声明式依赖层。
- 再下沉实例粒度:把“每租户容器”改为“每租户沙箱进程”。
- 最后补齐治理:完善资源配额、审计日志、失败回收和压测基线。
这样可以保留 Docker 的交付稳定性,同时逐步获得高密度运行能力。
总结
这条路线的本质是:
Docker 继续做系统交付,Nix 负责依赖确定性,bwrap 负责租户执行隔离。
当系统目标是“高并发短任务 + 多语言工具链 + 强复现能力”时,这种分层组合通常比“每租户一个 Docker 容器”更经济;但前提是你愿意为声明式依赖和隔离策略投入长期工程纪律。
参考资料
- Gartner(2025-06-25)Agentic AI 预测:
https://www.gartner.com/en/newsroom/press-releases/2025-06-25-gartner-predicts-over-40-percent-of-agentic-ai-projects-will-be-canceled-by-end-of-2027 - CAST AI(2025)Kubernetes 利用率与浪费数据(厂商样本,作趋势参考):
https://cast.ai/press-release/new-kubernetes-cost-benchmark-report-reveals-persistent-cloud-waste/ - CNCF(2026-01-20)Cloud Native Survey(K8s in production 82%):
https://www.cncf.io/reports/the-cncf-annual-cloud-native-survey/ - OpenClaw GitHub 仓库(热度观测,数据随时间变化):
https://github.com/openclaw/openclaw
