Skip to content

Instantly share code, notes, and snippets.

@mizchi
Created June 24, 2025 11:06
Show Gist options
  • Save mizchi/8d1ed83165757306b8a620fa330d2351 to your computer and use it in GitHub Desktop.
Save mizchi/8d1ed83165757306b8a620fa330d2351 to your computer and use it in GitHub Desktop.

cloudflare containers の 使い方を Claude Code にまとめさせた

https://github.com/yusukebe/image-resize-containers/tree/main


Cloudflare Container機能の使い方

Cloudflare Containerは、Cloudflare Workers上でDockerコンテナを実行できる新機能です。このドキュメントでは、画像リサイズアプリケーションを例に、Container機能の実装方法をまとめます。

基本的な仕組み

  1. Workers - HTTPリクエストを受け取り、軽量な処理を実行
  2. Container - CPU集約的な処理(画像リサイズなど)を実行
  3. Durable Objects - コンテナインスタンスの管理と状態保持

セットアップ

1. 必要なパッケージ

{
  "dependencies": {
    "@cloudflare/containers": "^0.1.21",
    "hono": "^4.6.21"
  }
}

2. wrangler.jsonc の設定

{
  "containers": [
    {
      "class_name": "MyContainer",
      "image": "./Dockerfile",
      "max_instances": 10,
      "name": "image-resize-containers"
    }
  ],
  "durable_objects": {
    "bindings": [
      {
        "class_name": "MyContainer",
        "name": "IMAGE_RESIZE_CONTAINER"
      }
    ]
  }
}

実装方法

1. Containerクラスの定義

import { Container } from '@cloudflare/containers'

export class MyContainer extends Container {
  defaultPort = 8080      // コンテナがリッスンするポート
  sleepAfter = '2m'      // アイドル時の自動スリープ時間

  override onStart() {
    console.log('Container successfully started')
  }

  override onStop() {
    console.log('Container successfully shut down')
  }

  override onError(error: unknown) {
    console.log('Container error:', error)
  }
}

2. Workersからコンテナへのリクエスト

import { getRandom } from '@cloudflare/containers'

// ランダムなコンテナインスタンスを取得
const container = await getRandom(c.env.IMAGE_RESIZE_CONTAINER)

// コンテナにリクエストを送信
const response = await container.fetch('http://localhost/resize?' + params, {
  method: 'POST',
  body: formData
})

3. Dockerfileの作成

FROM golang:1.24-alpine AS build
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY *.go ./
RUN CGO_ENABLED=0 GOOS=linux go build -o /server

FROM scratch
COPY --from=build /server /server
EXPOSE 8080
CMD ["/server"]

主要な機能と制限

機能

  • 自動スケーリング: 最大インスタンス数まで自動的にスケール
  • 自動スリープ: アイドル時は自動的にスリープして効率化
  • Durable Objects統合: 状態管理とインスタンス管理
  • 標準的なHTTP通信: fetch APIで簡単に通信可能

考慮事項

  • コンテナの起動には時間がかかるため、初回リクエストは遅延する可能性
  • sleepAfterの設定により、アイドル時のコスト削減が可能
  • max_instancesでコンテナ数を制限し、リソース使用を管理

デプロイ

# 開発環境での実行
npm run dev

# 本番環境へのデプロイ
npm run deploy

ユースケース

Cloudflare Containerは以下のような場面で特に有効です:

  1. 画像・動画処理: CPU集約的な処理をコンテナで実行
  2. 機械学習推論: 既存のMLモデルをコンテナ化して実行
  3. レガシーアプリケーション: 既存のアプリケーションをそのまま実行
  4. 言語固有の処理: Workers非対応の言語での処理実行

まとめ

Cloudflare Containerを使用することで、Workersの高速性とコンテナの柔軟性を組み合わせた効率的なアーキテクチャを構築できます。軽量な処理はWorkersで、重い処理はコンテナで実行することで、コストとパフォーマンスの最適化が可能になります。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment