Linux & IT ノート

Cloudflare Containers を Workers から動かす

管理人 約9分で読めます

Cloudflare がコンテナ実行基盤「Cloudflare Containers」を 2026 年 4 月に一般提供(GA)しました。2025 年 6 月のパブリックベータを経ての正式版です。Workers の上にコンテナを乗せる発想で、Kubernetes のような分厚いコントロールプレーンを書かずに、JavaScript のコードからコンテナを起動・制御できるのが特徴です。

Worker がオーケストレーターになる

Cloudflare Containers の肝は、コンテナの前段に必ず Worker が立つことです。リクエストを Worker で処理するか、コンテナへ流すかをコードで決めます。API ゲートウェイやサービスメッシュに相当する役割を、設定ファイルではなくコードで書くイメージです。

各コンテナインスタンスは Durable Object に支えられています。Container クラスは Durable Object を継承していて、一意な ID ごとに新しいインスタンスが起動し、同じ ID へのリクエストは同じインスタンスへルーティングされます。これにより、セッション単位でコンテナを割り当てるといった制御が素直に書けます。

デプロイ先はリージョンを意識しません。「Region: Earth」へ置くと、最初のリクエストに近い場所でインスタンスが立ち上がります。アイドルが続くと sleepAfter で指定した時間でスリープし、その間は課金が止まります。停止時はまず SIGTERM、15 分後に SIGKILL が送られます。コールドスタートは多くの場合 1〜3 秒程度とされています。

最小構成で動かす

設定は wrangler.jsonccontainersdurable_objects を書きます。

{
  "containers": [
    { "max_instances": 10, "class_name": "MyContainer", "image": "./Dockerfile" }
  ],
  "durable_objects": {
    "bindings": [{ "name": "MY_CONTAINER", "class_name": "MyContainer" }]
  },
  "migrations": [
    { "tag": "v1", "new_sqlite_classes": ["MyContainer"] }
  ]
}

コンテナの挙動は @cloudflare/containersContainer クラスを継承して書きます。

import { Container, getRandom } from "@cloudflare/containers";

export class MyContainer extends Container {
  defaultPort = 8080;
  sleepAfter = "10s";

  override onStart() { console.log("container started"); }
  override onStop() { console.log("container stopped"); }
  override onError(error: unknown) { console.log("error:", error); }
}

export default {
  async fetch(request: Request, env: { MY_CONTAINER: DurableObjectNamespace }) {
    const container = await getRandom(env.MY_CONTAINER, 5);
    return await container.fetch(request);
  },
};

image に指定した Dockerfile が一緒にビルドされます。あとは Worker と同じ流れでデプロイするだけです。

# テンプレートから始める
npm create cloudflare@latest -- --template=cloudflare/templates/containers-template

# 本番へ反映する
npx wrangler deploy

getRandom は複数インスタンスへの簡易ロードバランス、getContainer(env.MY_CONTAINER, sessionId) のように ID を渡せばセッション固定の振り分けになります。

インスタンスタイプと課金

インスタンスは用途に応じてサイズを選びます。主なプリセットは次のとおりです。

タイプvCPUメモリディスク
lite1/16256 MiB2 GB
basic1/41 GiB4 GB
standard-11/24 GiB8 GB
standard-216 GiB12 GB
standard-328 GiB16 GB
standard-4412 GiB20 GB

課金は Workers Paid(月 $5)に無料枠付きで含まれ、Free プランでは使えません。メモリとディスクはプロビジョニング量に対して、CPU は 2025 年 11 月以降「実際に使った分」だけ課金されます。アイドル時はスリープして課金が止まるので、常時起動のサーバーを置きっぱなしにするより無駄が出にくい設計です。

既存サービスとの違いと向き不向き

AWS Lambda のように 1 インスタンス 1 リクエストではなく、1 つのコンテナで複数リクエストを捌けます。各コンテナに Durable Object 由来の「プログラマブルなサイドカー」が付くため、状態保持や起動・停止の制御をコードで握れるのが他社にない強みです。

一方で注意点もあります。containerFetch は WebSocket に対応していません。Durable Object とコンテナが必ず同じ場所で動く保証はなく、再起動で配置が変わることもあります。Free プランでは動かせない点も含め、常駐の重いワークロードというより、Workers では手が届かない処理(既存の Docker イメージの実行、CPU を使うバッチ、言語ランタイムの都合でコンテナが必要な処理)を Workers から呼び出す、という使い方が素直です。

まとめ

Cloudflare Containers は「Workers の延長でコンテナを扱える」点に価値があります。Kubernetes の運用を抱えずに、コードでコンテナを起動・ルーティングし、使った分だけ払う。既に Workers を使っているなら、重い処理だけコンテナへ逃がす選択肢として試す価値があります。まずはテンプレートで雛形を作り、wrangler deploy まで一度通してみるのがおすすめです。

出典