“部署到地球 (Region: Earth)” 的哲学
传统云平台要求你为应用的全球化部署煞费苦心。我们的目标是彻底将你从这种复杂性中解放出来。通过 `wrangler deploy` 这一条简单的命令,你的容器镜像会被自动推送到全球化注册表,并在我们遍布全球的数据中心网络中进行预热和分发。当用户请求到达时,我们可以在离用户最近的地方启动一个容器实例来处理请求。
你好,欢迎加入我们!我是Cloudflare Containers设计和开发团队的负责人。在这份交互式教程中,我将带你深入了解其内部的架构理念、设计哲学以及我们为解决全球化应用部署难题所做的思考。这份教程专为熟悉Go语言但对Serverless和容器编排领域尚感陌生的开发者设计。
我们的目标是让你在完成本教程后,不仅知其然,更知其所以然,从入门到精通。让我们开始这段激动人心的旅程吧。
传统云平台要求你为应用的全球化部署煞费苦心。我们的目标是彻底将你从这种复杂性中解放出来。通过 `wrangler deploy` 这一条简单的命令,你的容器镜像会被自动推送到全球化注册表,并在我们遍布全球的数据中心网络中进行预热和分发。当用户请求到达时,我们可以在离用户最近的地方启动一个容器实例来处理请求。
要精通Cloudflare Containers,必须深刻理解这个核心的请求处理与控制流程。它由三个紧密协作的组件构成。点击下方卡片查看每个组件的详细职责。
可编程的流量入口
可编程的边车 (Sidecar)
处理繁重任务的“苦力”
为了帮助你建立清晰的心智模型,以便在未来的架构设计中快速做出正确的技术选型,下表详细对比了Cloudflare平台上的不同计算模型。
| 特性 | Cloudflare Workers | Cloudflare Containers | 传统 VMs/容器 |
|---|---|---|---|
| 运行时环境 | V8 Isolate (JS/Wasm) | 任何OCI镜像 (任何语言) | 完整客户OS |
| 启动时间 | 极低 (< 5ms) | 低 (秒级) | 较高 (秒到分钟) |
| 文件系统 | 有限 | 完整的Linux式文件系统 | 完整的持久化卷 |
| 理想用例 | API网关, 边缘逻辑 | AI/ML, 媒体处理, 迁移应用 | 复杂单体, 数据库 |
工欲善其事,必先利其器。一个规范、专业的开发环境是高效工作的基石。我们将一步步搭建你的本地工作站,确保后续所有操作都能顺利进行。
建议使用版本管理器如 `nvm` 或 `Volta` 来安装。这能避免权限问题并轻松切换版本。
nvm install --lts
Wrangler使用本地Docker引擎来构建镜像。请确保Docker Desktop已安装并正在运行。
docker info
你的Cloudflare指挥中心。运行 `wrangler login` 来授权你的账户。
npx wrangler login
理论知识是基础,但真正的掌握来自于实践。在这一部分,我们将从零开始,亲手构建一个完整的Go应用,将其容器化,并通过Worker配置和部署到Cloudflare的全球网络上。
下面是构成我们第一个Go容器应用的所有文件。你可以点击标签页来切换查看 `Go服务器`, `Dockerfile`, `Wrangler配置` 和 `Worker入口代码`。
package main
import (
"fmt"
"log"
"net/http"
"os"
)
func handler(w http.ResponseWriter, r *http.Request) {
message := os.Getenv("MESSAGE")
if message == "" {
message = "No message was set."
}
instanceId := os.Getenv("CLOUDFLARE_DEPLOYMENT_ID")
if instanceId == "" {
instanceId = "N/A"
}
fmt.Fprintf(w, "Hi, I'm a Go container! My message is: '%s', and my instance ID is: %s", message, instanceId)
}
func main() {
http.HandleFunc("/", handler)
log.Println("Starting Go server on port 8080...")
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
}
在项目根目录运行此命令,将你的应用部署到全球。
npx wrangler deploy
使用此命令进行本地开发和测试,支持热重载。
npx wrangler dev
你已经成功部署了第一个应用。现在,我们将深入探讨那些能解锁平台真正潜能的高级模式,让你从一个“使用者”变为一个“架构师”。
Cloudflare Containers一个极其强大的特性是其对“状态”的灵活处理能力。这并非通过传统的持久化卷实现,而是通过一种更巧妙、更具编程性的方式——路由模式。应用的状态性(Statefulness)是由你的Worker代码中的路由逻辑来决定的。
当你需要一个持久的容器时(如在线沙箱、用户会话),使用确定性的ID生成方法。
const id = env.MY_CONTAINER.idFromName(sessionId);
const container = env.MY_CONTAINER.get(id);
当你需要一个API服务池时,通过随机或轮询的方式从一个ID池中选择ID。
const instanceIndex = counter % 3;
const id = env.MY_CONTAINER.idFromName(`instance-${instanceIndex}`);
现在,让我们通过一个完整的项目来巩固所学知识。我们将构建一个服务,其中配置值存储在Cloudflare KV中,由Worker读取,并在运行时注入到Go容器中。这完美地展示了如何将Cloudflare的存储产品与Worker和Container结合,构建动态、可配置的服务。
npx wrangler kv:namespace create APP_CONFIG
然后将输出的绑定配置添加到 `wrangler.toml`。
npx wrangler kv:key put --binding=APP_CONFIG "welcomeMessage" "Hello from KV!"
在Worker的fetch处理器中,先从KV获取值,然后在启动容器时将其作为环境变量传入。
//...
const messageFromKV = await env.APP_CONFIG.get("welcomeMessage");
//...
if (!await container.isRunning()) {
await container.start({
env: { MESSAGE: messageFromKV }
});
}
//...
部署后,访问Worker的URL,你应该会看到Go容器返回了我们存储在KV中的消息。
你已经掌握了核心的构建模块。现在是时候将它们组合起来,构建一个真实、复杂且功能强大的全栈应用了。这个项目将模拟一个全球化的文件处理API,充分展示Cloudflare平台各组件协同工作的威力。在Cloudflare上构建复杂应用的最佳模式,几乎总是混合架构。
你的应用已经构建完成。现在,是时候学习如何像专业人士一样,对它进行监控、自动化部署,并了解平台的未来发展方向。
一个无法被观察的系统就是一个黑盒。在Cloudflare仪表板的“Workers & Pages”部分,你可以找到专门的“Containers”标签页,直观地看到状态、资源指标和日志流。
在专业的软件开发流程中,部署必须是自动化的。我们将使用GitHub Actions来构建一个完整的CI/CD流程。只需在你的仓库中添加一个工作流文件,并在GitHub中设置 `CLOUDFLARE_API_TOKEN` 和 `CLOUDFLARE_ACCOUNT_ID` 密钥。
name: Deploy Cloudflare Container
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm install
- name: Deploy
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: deploy
Cloudflare Containers目前处于公开测试阶段,我们正在全力以赴地工作,以期在正式版(GA)中为你带来更多强大的功能。
基于CPU/内存使用率自动增减容器实例。
智能地将请求路由到对用户最低延迟的实例。
直接挂载R2作为文件系统,优化D1/Hyperdrive访问。