Cloudflare Containers 深度研究:在边缘跑完整 Linux 容器,Worker 当编排器
> 文档: developers.cloudflare.com/containers
> 博客: Containers are coming to Cloudflare Workers
> 状态: Open Beta(2025 年 6 月起)
> 研究时间: 2026-03-27
🎯 一句话版本
Cloudflare 让你在 Workers 平台上跑完整 Linux 容器——任意语言、完整文件系统、多核 CPU、GB 级内存。Worker 负责路由和编排(当 API Gateway / Service Mesh / Orchestrator),容器跑在独立 VM 里。wrangler deploy 一条命令全球部署,镜像自动预分发到 300+ 节点。
🆚 Dynamic Workers vs Containers:什么时候用哪个
| Dynamic Workers | Containers | |
|---|---|---|
| **底层** | V8 Isolate | **完整 Linux VM** |
| **语言** | 仅 JS/Wasm | **任意语言** |
| **文件系统** | ❌ 没有 | ✅ 完整 |
| **启动** | **~5ms** | ~2-3 秒 |
| **内存** | ~5MB | **可达 GB 级** |
| **用途** | AI 生成代码片段、轻量沙盒 | 重计算、CLI 工具、现有应用迁移 |
| **费用** | $0.002/Worker/天 | 按运行时间计费 |
简单规则:
- Agent 写一段 JS 跑一下 → Dynamic Worker
- 需要
git clone/ffmpeg/pip install/ 任意二进制 → Container
💻 核心 API
import { Container, getContainer } from "@cloudflare/containers";
// 定义容器
export class CodeExecutor extends Container {
defaultPort = 8080; // 容器监听端口
sleepAfter = "1m"; // 1分钟无请求自动休眠
}
// Worker 路由请求到容器
export default {
async fetch(request, env) {
const { sessionId } = await request.json();
// 每个 sessionId 对应一个独立容器实例
const container = getContainer(env.CODE_EXECUTOR, sessionId);
return container.fetch(request);
},
};
部署:wrangler deploy — 自动构建镜像、推送到 CF Registry、全球预分发、部署 Worker。
🏗️ 架构:Worker + Durable Object + Container
用户请求 → [Worker] → [Durable Object] → [Container VM]
(路由/认证) (生命周期管理) (实际计算)
Worker 的三种角色
| 角色 | 功能 |
|---|---|
| **API Gateway** | 路由、认证、缓存、限流 |
| **Service Mesh** | 容器间私有连接、加密通信 |
| **Orchestrator** | 自定义调度、扩展、健康检查 |
Durable Object 作为可编程 Sidecar
每个容器实例关联一个 Durable Object,提供:
// 手动控制容器
this.ctx.container.start({ entrypoint, env: envVars });
this.ctx.container.signal(15); // SIGTERM
this.ctx.container.exec(["./backup"]); // 执行命令
// 监控容器状态
this.ctx.container.monitor()
.then(onContainerExit)
.catch(onContainerError);
// 在容器退出时保存状态
async onContainerExit() {
const state = await this.ctx.container
.getTcpPort(8080)
.fetch('http://container/state');
this.ctx.storage.sql.exec('UPDATE state SET value = ?', state);
}
🌍 生命周期
1. 部署:镜像上传到 CF Registry → 全球 300+ 节点预分发
2. 首次请求:Worker → DO → 找最近有预热镜像的节点 → 启动容器(2-3 秒冷启动)
3. 后续请求:路由到同一容器实例(无论请求从哪来)
4. 休眠:sleepAfter 时间到 → 发 SIGTERM → 15 分钟后 SIGKILL
5. 重启:下次请求到来时,在最近节点重新启动(位置可能变化)
🔒 网络安全
| 特性 | 说明 |
|---|---|
| 默认私有 | 容器只能通过 Worker 访问 |
| 可断网 | `enableInternet: false`,所有出站走 Worker |
| 端到端加密 | Worker ↔ Container 自动加密 |
| 凭证注入 | Worker 在出站时加 auth header,容器碰不到密钥 |
| 仅 HTTP 入站 | 不支持直接 TCP/UDP(安全限制) |
📦 实际用例
1. AI 代码沙盒(有状态)
每个用户一个容器,执行 LLM 生成的代码:
// LLM 生成代码
const code = await env.AI.run("@cf/meta/llama-4-scout", { messages });
// 路由到用户专属容器
const sandbox = getContainer(env.CODE_EXECUTOR, sessionId);
return sandbox.fetch("/execute-code", { method: "POST", body: code });
2. FFmpeg 全球部署(无状态)
视频转 GIF,自动扩缩容:
"autoscaling": {
"minimum_instances": 1,
"cpu_target": 75, // CPU 超 75% 自动扩容
}
3. CI/CD(短任务 + Workflows)
容器跑构建 → 完成后发消息到 Queue → Workflow 确保可靠执行
💰 定价详情
实例规格
| 类型 | vCPU | 内存 | 磁盘 |
|---|---|---|---|
| lite | 1/16 | 256 MiB | 2 GB |
| basic | 1/4 | 1 GiB | 4 GB |
| standard-1 | 1/2 | 4 GiB | 8 GB |
| standard-2 | 1 | 6 GiB | 12 GB |
| standard-3 | 2 | 8 GiB | 16 GB |
| standard-4 | 4 | 12 GiB | 20 GB |
计费规则
- 每 10ms 计费,按实际运行时间
- 休眠不收费(自动 scale to zero)
- Workers Paid 计划底费 $5/月
| 资源 | 免费额度 | 超出单价 |
|---|---|---|
| 内存 | 25 GiB-h/月 | $0.0000025/GiB-s |
| CPU | 375 vCPU-min/月 | $0.000020/vCPU-s |
| 磁盘 | 200 GB-h/月 | $0.00000007/GB-s |
| 出站流量(北美/欧洲) | 1 TB/月 | $0.025/GB |
跑 OpenClaw 可行吗?
能跑,但不值得。 用 basic 实例(1/4C 1GB)24/7 常驻:
| 项目 | 月费 |
|---|---|
| 内存(1 GiB × 720h) | ~$6.26 |
| CPU(估计 50 vCPU-min/天) | ~$1.35 |
| 磁盘(4 GB × 720h) | ~$0.68 |
| Workers Paid 底费 | $5.00 |
| **合计** | **~$13.29** |
对比 DigitalOcean VPS($6/月,1C 2GB,完整 Linux,持久化磁盘):贵一倍、规格更差、还没持久化磁盘。
致命问题:
- 磁盘临时 → MEMORY.md / 对话历史 / cron 状态重启全丢
- 需要改造存储层(全部迁到 R2/D1)
- 休眠机制和 OpenClaw 7×24 常驻冲突
结论:CF Container 适合"按需启动、跑完就关"的场景,不适合跑常驻 daemon。
⚠️ 当前限制
| 限制 | 说明 |
|---|---|
| 磁盘临时 | 重启后清空(持久化磁盘未来计划) |
| 仅 linux/amd64 | 不支持 ARM |
| 仅 HTTP 入站 | 不支持直接 TCP/UDP |
| 冷启动 2-3 秒 | 比 Dynamic Worker 慢 1000 倍 |
| Beta | 功能和定价可能变化 |
💡 与我们的关联
1. OpenClaw 的完整部署方案
结合刚研究的 Dynamic Workers,Cloudflare 现在提供了完整的 Agent 执行栈:
| 层 | 技术 | 用途 |
|---|---|---|
| 轻量代码执行 | Dynamic Workers | Agent 写 JS 片段 |
| 重量级计算 | **Containers** | 跑模型/CLI/编译 |
| 路由+编排 | Workers | API Gateway |
| 状态管理 | Durable Objects | Session 状态 |
| 存储 | R2 + D1 + KV | 文件/数据/缓存 |
如果把 OpenClaw Gateway 容器化部署到 Cloudflare Containers:
- 全球就近启动
- 自动扩缩容
- Worker 做认证+限流
- 休眠时不收费
2. 和 Dynamic Workers 报告的互补
上一篇报告说"Worker 没有文件系统"——Container 填了这个坑。Agent 可以:
- 简单任务 → Dynamic Worker(毫秒级)
- 需要文件系统/CLI → Container(秒级)
3. AI 代码执行的两层沙盒
Agent 生成代码
├→ JS 片段 → Dynamic Worker(5ms,$0.002)
└→ Python/Shell 脚本 → Container(2-3s,按时间计费)
4. ub2 的替代方案?
如果 ub2 上跑的任务(比如 ffmpeg 转码、模型推理准备)不需要 GPU,可以考虑迁移到 Cloudflare Containers——全球部署、自动扩缩、无需运维。但 GPU 任务(Ollama/模型推理)仍然需要 ub2。
📊 评分
| 维度 | 评分(/10) |
|---|---|
| 技术设计 | 9.0 — Worker + DO + Container 三层架构优雅 |
| 实用性 | 8.5 — 一条命令全球部署,API 简洁 |
| 与 Dynamic Workers 互补 | 9.0 — 轻量 + 重量级完美配对 |
| 与我们的关联 | 7.5 — temp.jaylab.io 在 CF 上,但当前不需要容器 |
| 成熟度 | 7.5 — Beta 阶段,有些限制(临时磁盘、仅 HTTP) |
| **综合** | **8.5** |
报告由深度研究助手自动生成 | 2026-03-27
来源: Cloudflare Docs / Blog