Containers
當 Worker 不夠用時,啟動一個真正的容器——你自己的 Docker 映像檔、完整的檔案系統、任何語言——而且全程由 Worker 程式碼控制。
Containers 是什麼?
Cloudflare Containers 讓你在 Cloudflare 的網路上執行一個完整的容器映像檔(container image,把作業系統、函式庫和檔案全部打包在一起),而且由你的 Worker 程式碼直接啟動和管理。
「容器(container)」是一個自給自足的盒子,裡面裝著一個應用程式,以及它執行所需要的一切。最常見的打包方式是用 Docker。當輕量的 Worker 做不到某些事時,容器就派上用場——例如你需要某個特定的程式語言、大量記憶體、多核心 CPU、或是一顆真正的硬碟。
把它想成…
Worker 像是兩手空空就能跑的快速差事;容器則像一個打包好的行李箱——它把你的 App 需要的一切(作業系統、工具、檔案)都裝在裡面,所以不管放到哪裡,跑起來都一模一樣。
為什麼要用它?
Workers 又快又便宜,但它跑在一個記憶體有限、只支援少數語言的沙盒裡。有些工作就是需要更多資源。Containers 正好補上這個缺口——而且你不用學 Kubernetes,也不用自己架伺服器。
更多算力
最多可用 4 個 vCPU 和 12 GiB 記憶體——遠超 Worker 的 128 MB 上限。
任何語言
可以跑 Python、Go、Java、FFmpeg,或任何能在 Linux 上執行的程式——不限於 JavaScript。
真正的檔案系統
在一顆完整的硬碟上讀寫檔案(最多 20 GB),很適合資料處理或暫存。
帶上現有映像檔
已經有 Docker 映像檔了嗎?原封不動就能部署——不用改寫。
免維運
Cloudflare 幫你佈署、擴充、導流。沒有叢集(cluster)、也沒有編排(orchestration)要管。
與 Worker 緊密整合
容器由 Worker 程式碼控制,所以能直接接上你其他的服務。
什麼時候該用?
只要一項工作對單純的 Worker 來說太重、太特殊、或太「Linux」,就該考慮 Containers。
媒體處理
用 FFmpeg 之類需要 CPU 和檔案系統的工具,轉換影片或圖片格式。
重量級運算
執行超出 Worker 記憶體的資料運算、模擬,或模型推論。
現有應用
把現有的 Python / Go / Java 服務,連同 Docker 映像檔搬上 Cloudflare 網路。
命令列工具與執行檔
把只提供 Linux 執行檔的命令列工具包起來,再由 Worker 呼叫它。
不可信的程式碼
在隔離的容器沙盒裡,執行使用者上傳或 AI 產生的程式碼。
自訂執行環境
需要特定的作業系統版本、系統函式庫或奇怪的相依套件?通通烤進映像檔裡。
怎麼開始用?
你用一個 Dockerfile 定義容器,在 wrangler.jsonc 裡讓 Worker 指向它,再用 Wrangler 部署。Cloudflare 會建置映像檔,並依需求啟動執行個體。(Containers 需要 Workers 付費方案。)
用範本建立專案
從 Cloudflare 官方的 containers 範本開始,裡面已經把 Dockerfile 和 Worker 接好了。
npm create cloudflare@latest -- --template=cloudflare/templates/containers-template設定容器
在 wrangler.jsonc 裡幫容器類別命名、指向你的 Dockerfile,並限制最多能同時跑幾個執行個體。
{ "name": "my-container-app", "main": "src/index.js", "compatibility_date": "2025-05-23", "containers": [ { "class_name": "MyContainer", "image": "./Dockerfile", "max_instances": 10 } ], "durable_objects": { "bindings": [ { "name": "MY_CONTAINER", "class_name": "MyContainer" } ] }, "migrations": [ { "tag": "v1", "new_sqlite_classes": ["MyContainer"] } ] }部署
Wrangler 會建置你的映像檔、推送上去並上線。執行個體會依需求啟動,閒置時自動休眠。
npx wrangler deploy
import { Container, getContainer } from "@cloudflare/containers";
export class MyContainer extends Container {
// The port your container app listens on
defaultPort = 8080;
// Put the container to sleep after 10 minutes idle
sleepAfter = "10m";
}
export default {
async fetch(request, env) {
// Get (or start) a container instance and forward the request to it
const container = getContainer(env.MY_CONTAINER);
return container.fetch(request);
},
};容器是建立在 Durable Objects 上的
在底層,每個容器都是由一個 Durable Object 管理的——這就是為什麼設定檔裡有 durable_objects 綁定和 migration。你不用懂 Durable Objects 也能用 Containers,但這正是它們整合得這麼順的原因。
重點概念
映像檔(image)
你 App 與其執行環境打包好的藍圖,通常由 Dockerfile 建置而來。
執行個體規格
機器的大小——從 lite(256 MiB)一路到 standard-4(4 vCPU、12 GiB、20 GB 硬碟)。
隨需執行個體
容器在需要時啟動、閒置時休眠,所以你只在它醒著時付費。
sleepAfter(休眠時間)
閒置的容器在休眠省資源前,要先醒著多久,例如 "10m"(10 分鐘)。
容器類別
一個繼承自 Container 的 JavaScript 類別,用來定義容器的連接埠和行為。
max_instances(上限)
限制同一時間最多能跑幾個容器副本——對控制成本很有用。
小提示與計費
讓它好好睡
容器醒著時,你要為記憶體和硬碟付費;vCPU 則只在「實際運算」時計費。設定一個合理的 sleepAfter,閒置的容器才不會一直累積費用。
執行個體規格
- lite — 1/16 vCPU、256 MiB 記憶體、2 GB 硬碟
- basic — 1/4 vCPU、1 GiB 記憶體、4 GB 硬碟
- standard-1 — 1/2 vCPU、4 GiB 記憶體、8 GB 硬碟
- standard-2 — 1 vCPU、6 GiB 記憶體、12 GB 硬碟
- standard-3 — 2 vCPU、8 GiB 記憶體、16 GB 硬碟
- standard-4 — 4 vCPU、12 GiB 記憶體、20 GB 硬碟
需要付費方案
Containers 需要每月 5 美元的 Workers 付費方案,方案內含每月免費額度(25 GiB-小時記憶體、375 vCPU-分鐘、200 GB-小時硬碟),超過才會開始按用量計費。