【Private Preview】Docker ComposeからCloud Runへ直接デプロイする新機能を検証してみた
はじめに
Google Cloud RunにDocker Composeファイルから直接デプロイできる新機能「gcloud alpha run compose up」がPrivate Previewで提供されています。この機能により、従来のCI/CDパイプラインを構築することなく、ローカルのDocker Compose環境からCloud Runへワンコマンドでデプロイが可能になりました。
詳細は公式ブログをご覧ください:
従来のデプロイ方法との違い
従来の方法:
- Dockerイメージをビルド
- Container RegistryやArtifact Registryにプッシュ
- Cloud Runサービスを作成・更新
- マルチコンテナの場合は複雑な設定が必要
新機能での方法:
gcloud alpha run compose up
たったこれだけでDocker Composeの設定からCloud Runサービスが作成されます。
この記事で分かること
- Cloud Run Compose機能の実際の使用感
- ドキュメントに載っていない制限事項や問題点
- 設定例とトラブルシューティング
- 推測を含む内部動作の調査結果
実際に3コンテナ構成のWebアプリケーションを使って検証した結果をもとに、リアルな使用感をお伝えします。
検証環境とデモアプリケーション
サンプルアプリケーションの構成
今回の検証には、以下の3コンテナから構成されるマルチコンテナWebアプリケーションを使用しました:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Frontend │ │ Backend API │ │ Redis Cache │
│ (web) │◄──►│ (api) │◄──►│ (redis) │
│ │ │ │ │ │
│ TypeScript │ │ TypeScript │ │ redis:7-alpine │
│ Express │ │ Express │ │ │
│ Port: 8080 │ │ Port: 3000 │ │ Port: 6379 │
│ (Dockerfile) │ │ (api/Dockerfile)│ │ (Docker Hub) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
各コンテナの役割
- Frontend (web): TypeScript/Express - ユーザーインターフェース、外部からのアクセスを受け付ける
- API (api): TypeScript/Express - ビジネスロジック、Redisとの連携処理
- Redis (redis): キャッシュサーバー、訪問カウンター等のデータ保存
compose.yamlの基本構成
services:
web:
build: .
cpus: 0.5
x-google-cloudrun-ingress-container: true
ports:
- "8080:8080"
environment:
- API_URL=http://api:3000
depends_on:
- api
- redis
api:
build: ./api
cpus: 0.5
expose:
- "3000"
environment:
- REDIS_URL=redis://redis:6379
depends_on:
- redis
redis:
image: redis:7-alpine
cpus: 0.5
expose:
- "6379"
ファイル構成
├── compose.yaml # 3サービス定義
├── Dockerfile # Frontend用
├── package.json # Frontend依存関係
├── tsconfig.json # TypeScript設定
├── src/
│ └── index.ts # Frontend
├── api/
│ ├── Dockerfile # API用
│ ├── package.json # API依存関係
│ ├── tsconfig.json # TypeScript設定
│ └── src/
│ └── index.ts # API
└── README.md
このサンプルアプリケーションは、マルチコンテナ構成でよく見られるパターン(フロントエンド + API + データベース)の検証用デモです。
基本的な使い方
前提条件
# gcloud v532.0以上が必要
gcloud components install alpha
gcloud auth login
gcloud config set project YOUR_PROJECT_ID
デプロイ実行
compose.yamlがあるディレクトリで以下のコマンドを実行するだけです:
gcloud alpha run compose up --region=asia-northeast1
デプロイが成功すると、以下のような出力が表示されます:
✓ Building and deploying... Done.
✓ Service URL: https://cloud-run-docker-compose-xxxxxxxxxx-an.a.run.app
動作確認
デフォルトで認証が必要に設定されているため、プロキシ経由でアクセスします:
gcloud run services proxy cloud-run-docker-compose --region=asia-northeast1 --port=8081
# http://localhost:8081 にアクセス
サービス削除
gcloud run services delete cloud-run-docker-compose --region=asia-northeast1
たったこれだけでマルチコンテナアプリケーションがCloud Runにデプロイされます。しかし、実際に使ってみると様々な制限事項や問題に遭遇しました。
対応している機能・制限事項
✅ 実際に使用できた機能
基本的なサービス設定
-
build: ビルドコンテキスト指定(内部でCloud Buildが実行される) -
image: 事前ビルドイメージの使用(Redisで使用) -
ports: ポートマッピング -
expose: 内部通信用ポート公開 -
depends_on: サービス起動順序の定義 -
environment: 環境変数の設定 -
cpus: CPU割当の指定
実際に遭遇した問題と解決法
問題1: CPU/メモリ設定の制約
症状: ERROR: Invalid value specified for container memory
メモリの直接指定ができず、CPU値からの自動割当のみ。ドキュメントによると自動割当ルールは以下の通りですが、実際には問題がありました:
- ≤2 CPU: 1Gi メモリ
- ≤4 CPU: 2Gi メモリ
-
4 CPU: 4Gi メモリ
原因: 0.08 CPUを指定すると1Giメモリが割り当てられるが、Cloud Runの制約では0.08 CPUには128Mi〜512Miのメモリが必要。この不整合によりエラーが発生。
解決策: 0.5 CPU以上を指定することで正常にデプロイできた。
問題2: Container NameとService Nameの不一致
症状: ERROR: Dependent container 'xxx' does not exist
原因: container_nameを設定すると、Cloud Runのcontainer-dependenciesはコンテナ名を期待するが、compose.yamlのdepends_onはサービス名を参照するため不整合が発生。
解決策: container_nameを削除してサービス名をそのままコンテナ名として使用する。
これらの問題を解決するため、最初に示した設定のCPU値を0.5に変更し、container_nameを削除することで、3コンテナ構成のアプリケーションが正常にCloud Runにデプロイできました。
内部動作の解析
gcloud --verbosity=debugで詳細ログを確認し、内部でどのような処理が行われているかを調査しました。
処理フロー
-
run-composeツールの実行- 内部で
run-compose up compose.yaml --repo [ARTIFACT_REGISTRY_URL]が実行される
- 内部で
-
YAML変換
- compose.yamlをKnative Service YAML形式に変換
-
out/cloud-run-docker-compose-service.yamlに出力される
-
Cloud Buildでのイメージビルド
- ソースコードがGCSバケットにアップロード
-
gcr.io/cloud-builders/dockerを使用してビルド - Artifact Registryにプッシュ
-
Cloud Runサービスのデプロイ
- 生成されたYAMLを使用して
gcloud run services replace相当の処理を実行(推測)
- 生成されたYAMLを使用して
注目すべき点
-
自動イメージビルド:
gcloud builds submit相当の処理が内部で実行される(推測) - YAML生成: compose.yamlが直接使われるのではなく、Cloud Run用のYAMLに変換される
- リソース自動割当: CPU値からメモリが自動計算される(ここで前述の問題が発生)
実際に生成されたYAMLを確認することで、どのような設定がCloud Runに適用されているかを把握できます。
従来手法との比較
メリット
1コマンドでのデプロイ
従来の方法では複数のステップが必要でしたが、gcloud alpha run compose up一つでデプロイが完了します。
ローカル開発との親和性
Docker Composeファイルをそのまま利用できるため、ローカル開発環境とデプロイ環境の設定を統一できます。
デメリット
Docker Compose互換性の制限
すべてのDocker Compose機能がサポートされているわけではなく、思わぬエラーに遭遇することがあります。
詳細な設定制御が困難
CPU/メモリの細かい調整など、Cloud Run固有の詳細設定は従来の方法の方が柔軟に行えます。
まとめ
Cloud Run Compose機能(gcloud alpha run compose up)は、Docker ComposeからCloud Runへの直接デプロイを可能にする便利な機能です。
実際に使ってみた感想
良かった点
- ワンコマンドでマルチコンテナアプリケーションがデプロイできる手軽さ
- ローカル開発環境との設定統一による開発効率の向上
- 内部動作の調査により、compose.yamlがどのようにCloud Runに変換されるかを理解できた
苦労した点
- CPU/メモリ自動割当の不整合による予期しないエラー
- container_nameと依存関係の名前解決問題
- Docker Compose機能の一部制限
今後への期待
Private Preview段階のため現在は制限事項もありますが、開発・プロトタイピングには有用な機能です。GA版では、より多くのDocker Compose機能のサポートや、リソース設定の改善が期待されます。
課題はありつつも、ワンコマンドでマルチコンテナアプリケーションをCloud Runにデプロイできる体験は便利でした。
参考リポジトリ
本記事で使用したサンプルコード:
Discussion