Docker Desktop 4.43系(2025/7/3リリース)で、AIモデル・エージェント・MCPツールをcompose.yaml
に宣言してdocker compose up
一発で起動できるようになりましたね。
ComposeをNVIDIA L4 GPU付きクラウドにそのまま載せ替えるDocker Offloadもβ提供が始まり、貧弱ノートPCでも大規模モデルを回せる環境が整ってきました。
今回は、公式サンプルdocker/compose-for-agentsのA2A Multi‑Agent Fact Checkerを元に、Composeだけでマルチエージェントを動かす手順を紹介します。また、Docker OffloadでのCompose起動もやってみたので、それだけでもご覧ください。
なお、一部の画像はDocker Captains向け公式コンテンツキット(Docker Offload Content Kit)から引用しています。
サンプルの構成
A2A Multi‑Agent Fact Checkerは、Google ADK (Agent Development Kit)とA2Aプロトコルで3つのエージェント(Auditor/Critic/Reviser)を協調させて、与えられた主張を調査・検証・推敲して最終結論を返すようなマルチエージェントのサンプルです。
- Auditor(監査役): 主張を受け取った後にタスクを分割し、サブタスクをCriticとReviser へ振り分け、最終回答をUIへ返す
- Critic(批評家): DuckDuckGo MCPツールで外部検索を実行し、主張を裏付ける証拠を集める
- Reviser(推敲者): Criticが集めた証拠とAuditorの草案を読み込んで、整合性チェックと文章推敲を行う
外部検索はMCP Gatewayが仲介し、推論モデルはGemma 3 4B‑Q4をDocker Model Runnerでホストします。
compose.yaml
の要点
以下がcompose.yaml
の全文です。
services:
# Auditor Agent coordinates the entire fact-checking workflow
auditor-agent-a2a:
build:
target: auditor-agent
ports:
- "8080:8080"
environment:
- CRITIC_AGENT_URL=http://critic-agent-a2a:8001
- REVISER_AGENT_URL=http://reviser-agent-a2a:8001
depends_on:
- critic-agent-a2a
- reviser-agent-a2a
models:
agents:
endpoint_var: MODEL_RUNNER_URL
model_var: MODEL_RUNNER_MODEL
critic-agent-a2a:
build:
target: critic-agent
environment:
- MCPGATEWAY_ENDPOINT=http://mcp-gateway:8811/sse
depends_on:
- mcp-gateway
models:
gemma3:
# specify which environment variables to inject into the container
endpoint_var: MODEL_RUNNER_URL
model_var: MODEL_RUNNER_MODEL
reviser-agent-a2a:
build:
target: reviser-agent
environment:
- MCPGATEWAY_ENDPOINT=http://mcp-gateway:8811/sse
depends_on:
- mcp-gateway
models:
gemma3:
endpoint_var: MODEL_RUNNER_URL
model_var: MODEL_RUNNER_MODEL
mcp-gateway:
# mcp-gateway secures your MCP servers
image: docker/mcp-gateway:latest
use_api_socket: true
command:
- --transport=sse
- --servers=duckduckgo
# add an MCP interceptor to log the responses
- --interceptor
- after:exec:echo RESPONSE=$(cat) >&2
models:
# declare LLM models to pull and use
gemma3:
model: ai/gemma3:4B-Q4_0
context_size: 10000 # 3.5 GB VRAM
#context_size: 131000 # 7.6 GB VRAM
トップレベルmodels
Compose(2.38以降)に追加された新機能で、LLMイメージをOCI Artifactとして宣言します。Docker Model Runnerが自動でOCI ArtifactをプルしてAPI エンドポイントを発行します。
各サービスのmodels
各サービスが「どのモデルを使うか」「エンドポイントURL/モデル名をどの環境変数に渡すか」を記述します。
起動時に以下を注入してくれるので、アプリ側では環境変数を読むだけで済みます。
export MODEL_RUNNER_URL=http://model-runner:12434
export MODEL_RUNNER_MODEL=gemma3
MCP Gateway
docker/mcp-gateway
イメージがDuckDuckGo MCP Serverをフォークして、CriticエージェントとSSEで通信します。--interceptor
でレスポンスをそのままstderrに流す設定もワンライナーで追加されています。
依存関係
以前からのComposeと同様に、depends_on
を使って起動順序を固定しています。Auditor → Critic/Reviser → MCP Gateway の順に立ち上がるので、接続待ちのリトライロジックを書かずに済みます。
ローカルで動かす
docker compose up --build
で起動します。
[+] Running 8/9
✔ reviser-agent-a2a Built 0.0s
✔ critic-agent-a2a Built 0.0s
✔ auditor-agent-a2a Built 0.0s
⠴ gemma3 Configuring 76.5s
✔ Network a2a_default Created 0.0s
✔ Container a2a-mcp-gateway-1 Created 2.0s
✔ Container a2a-reviser-agent-a2a-1 Created 0.1s
✔ Container a2a-critic-agent-a2a-1 Created 0.1s
✔ Container a2a-auditor-agent-a2a-1 Created
Gemma 3 4B‑Q4は量子化済みなので、自環境(MacBook Air M2)でも起動しました。
ブラウザで http://localhost:8080 を開いて、How far is the Moon from the Earth?
と入力すると、CriticがDuckDuckGoで検索して、Reviserが推敲したうえでAuditorが最終回答を返してくれました。
Docker Offloadを使う
より大きなモデル(Gemma 27B Q4)を試す場合、ローカルGPUが足りなくなるような場面があります。そのときは Docker Offloadを有効にして、モデル定義を上書きするだけでL4 GPU付きクラウドに載せ替えられます。
Docker Offloadの有効化
まずは、公式サイトからβアクセスの申し込みをします(今回はDocker Captain特典のEarly Accessで使っています)。
Beta featuresタブで「Enable Docker Offload」と「Enable Docker Offload GPU Support」にチェックを入れます。
左上にトグルが出てくるので、これをクラウドアイコンに切り替えるとDocker Offloadが起動します(docker offload start
でも可)。
compose.offload.yaml
を用意
Docker Offloadで起動する場合のモデル指定を、compose.offload.yaml
に記述します。
models:
gemma3:
# pre-pull the model on Docker Model Runner
model: ai/gemma3-qat:27B-Q4_K_M
context_size: 10000 # 18.6 GB VRAM
# context_size: 80000 # 28.37 GB VRAM
# context_size: 131000 # 35.5 GB VRAM
Composeを動かす
docker compose -f compose.yaml -f compose.offload.yaml up --build
を実行すると、compose.offload.yaml
の記述(トップレベルmodels
)をcompose.yaml
に上書きする形で、クラウド上でComposeが起動します。
Docker Offloadは300 GPU 分の無料クレジットが付与されて、超過分は1 GPU 分あたり0.015 USDで課金されます 。終了後はdocker offload stop
を忘れずに実行します。
感想
ComposeとOffloadの組み合わせを今回試してみましたが、モデル・ツール・エージェントを一括管理できるのと、ローカルでもクラウドでも同じコマンドで動かせるのはやっぱり便利ですね。AIエージェントまわりの進化が凄まじいのでもっといい方法があるかもしれないのですが、その場合は教えていただけるとうれしいです。
Docker Offloadに興味がある場合は、まずはクレジット内でいろいろ試してみてください。
参考
Docker Brings Compose to the AI Agent Era
Docker Offload usage and billing