コンテナ分離環境でのAIコーディングエージェント並列実行

Claude CodeとGit Worktreeによる並列開発では、Git Worktreeを使ってAIエージェントごとにファイルシステムを分離する手法を紹介した。本記事ではその発展形として、各worktreeをコンテナ化された分離環境で動かすアプローチを探る。


なぜコンテナ分離が必要なのか

Git Worktreeだけでも並列開発は可能だが、いくつかの課題が残る。

ホストマシンへのリスク

AIコーディングエージェントはデフォルトでホストマシンへのフルアクセス権を持つ。Claude Codeの--dangerously-skip-permissionsフラグを使えば高速に作業できるが、その名の通り危険も伴う。

特にプロンプトインジェクションのリスクがある。悪意あるWebページやドキュメントを読み込んだ際、エージェントが予期しない動作をする可能性がある。

依存関係の衝突

複数のworktreeで異なるバージョンの依存関係が必要な場合、ホストマシン上では衝突が起きる。

worktree-a: Node.js 18 + PostgreSQL 14
worktree-b: Node.js 20 + PostgreSQL 16
worktree-c: Python 3.11 + Redis

スケーラビリティの限界

ローカルマシンのリソースには限界がある。クラウド上のコンテナインスタンスを使えば、より多くのエージェントを並列実行できる。


分離のレベル

分離環境にはいくつかのレベルがある。

レベル 方式 分離度 オーバーヘッド
1 Git Worktree のみ 最小
2 Dev Container 低〜中
3 Docker Sandbox 中〜高
4 microVM

重要な点として、コンテナはセキュリティサンドボックスではない。コンテナはプロセス分離であり、カーネルは共有されている。完全な分離が必要ならmicroVM(Firecracker等)を検討すべきだが、ほとんどのユースケースではDev Containerで十分である。


主要なツールとアプローチ

1. Dev Containers(VS Code / Cursor)

最もアクセスしやすいアプローチ。VS CodeやCursorの拡張機能として提供されている。

メリット:

基本構成:

project/
├── .devcontainer/
│   ├── devcontainer.json
│   └── Dockerfile (オプション)
├── .git/
└── src/

2. Container Use(Dagger)

2025年にDaggerチームがリリースしたMCPサーバー。各エージェントに独自のコンテナ化サンドボックスとGit worktreeを自動で提供する。

特徴:

# インストール
brew install dagger/tap/container-use

# Claude Codeで使用
claude --mcp container-use

3. Agentree

AIコーディングエージェント専用のworktree管理CLIツール。

特徴:

# インストール
brew install AryaLabsHQ/tap/agentree

# worktree作成(自動セットアップ付き)
agentree -b feature-auth

# カスタム設定(.agentreerc)
POST_CREATE_SCRIPTS=("pnpm install" "pnpm build")

4. DevTree

Git worktreeとDev Containerを統合したツール。各ブランチに専用のコンテナ環境を提供する。

特徴:

devtree init
devtree create --branch feature-auth
devtree start
devtree switch feature-payment

5. Docker Sandboxes

Docker Desktop 4.50+で提供される実験的機能。AIコーディングエージェント向けに設計されたサンドボックス環境。

特徴:

6. Worktrunk

2026年1月にリリースされた新しいCLI。5〜10以上のエージェントを並列管理することを想定している。

# 複数のworktreeを管理
worktrunk new feature-a
worktrunk new feature-b
worktrunk status

実践的なアーキテクチャ

パターン1: 基本構成(Dev Container + Worktree)

project-main/           # メインのworktree
├── .devcontainer/
│   └── devcontainer.json
└── src/

project-feature-a/      # worktree A
├── .devcontainer/      # コピーまたはシンボリックリンク
└── src/

project-feature-b/      # worktree B
├── .devcontainer/
└── src/

各worktreeをDev Containerで開くと、それぞれ独立したコンテナが起動する。

パターン2: Container Use統合

Host Machine
├── MCP Server (container-use)
│   ├── Agent A Container
│   │   ├── Git Worktree (feature-a)
│   │   └── Claude Code Session
│   ├── Agent B Container
│   │   ├── Git Worktree (feature-b)
│   │   └── Claude Code Session
│   └── Agent C Container
│       ├── Git Worktree (feature-c)
│       └── Claude Code Session
└── Main Development Environment

パターン3: クラウドスケール構成

Local Machine
└── Orchestrator (CLI/Script)
    │
    ├── Cloud Instance A (e.g., EC2, GCE)
    │   ├── Dev Container
    │   ├── Git Worktree
    │   └── Claude Code (API経由)
    │
    ├── Cloud Instance B
    │   └── ...
    │
    └── Cloud Instance C
        └── ...

devcontainer.jsonの設定例

最小構成

{
  "name": "AI Agent Environment",
  "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
  "features": {
    "ghcr.io/devcontainers/features/node:1": {},
    "ghcr.io/devcontainers/features/git:1": {}
  },
  "postCreateCommand": "npm install"
}

セキュリティ強化版

{
  "name": "Secure AI Agent Environment",
  "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
  "remoteUser": "vscode",
  "runArgs": [
    "--cap-drop=ALL",
    "--security-opt=no-new-privileges"
  ],
  "mounts": [
    "source=project-data,target=/workspace,type=volume"
  ],
  "features": {
    "ghcr.io/devcontainers/features/node:1": {},
    "ghcr.io/devcontainers/features/git:1": {}
  },
  "postCreateCommand": "npm install",
  "customizations": {
    "vscode": {
      "extensions": [
        "anthropic.claude-code"
      ]
    }
  }
}

セキュリティのポイント:

プロジェクト固有の認証情報

{
  "name": "Isolated Dev Environment",
  "build": {
    "dockerfile": "Dockerfile"
  },
  "mounts": [
    "source=${localWorkspaceFolder}/.env.dev,target=/workspace/.env,type=bind,readonly"
  ],
  "containerEnv": {
    "AWS_PROFILE": "dev-sandbox",
    "NODE_ENV": "development"
  }
}

本番環境の認証情報はコンテナに渡さない。開発用の制限されたIAMロールを使用する。


ワークフロー例

1. 並列機能開発

# 1. worktreeを作成
git worktree add ../project-auth -b feature/auth
git worktree add ../project-dashboard -b feature/dashboard

# 2. 各worktreeでDev Containerを開く
# VS Code: "Dev Containers: Open Folder in Container..."

# 3. コンテナ内でClaude Codeを起動
claude --dangerously-skip-permissions
# コンテナ内なのでリスクは限定的

# 4. 各エージェントにタスクを割り当て
# Agent A: 「認証システムをJWTベースに移行して」
# Agent B: 「ダッシュボードにリアルタイム更新機能を追加して」

2. Container Useを使った並列開発

# Claude CodeにContainer Use MCPを接続
claude --mcp container-use

# Claude Codeに指示
> 3つの機能を並列で開発したい。
> 1. 認証システムのリファクタリング
> 2. ダッシュボードの新機能
> 3. API v2の実装
> それぞれ独立したコンテナで作業を進めて。

# Container Useが自動で3つのコンテナ + worktreeを作成
# 各エージェントの状態を確認
container-use list
container-use watch
container-use log feature-auth

3. テスト駆動の並列開発

# Agent A: テスト作成担当
# worktree-tests/に配置、実装コードは見えない

# Agent B: 実装担当
# worktree-impl/に配置、テストだけが見える

# 両者を並列実行し、テストがパスするまで反復

セキュリティベストプラクティス

1. マウントを最小限に

// BAD: ホームディレクトリ全体をマウント
"mounts": ["source=${localEnv:HOME},target=/home/user,type=bind"]

// GOOD: プロジェクトディレクトリのみ
"mounts": ["source=${localWorkspaceFolder},target=/workspace,type=bind"]

// BETTER: Dockerボリュームを使用
"mounts": ["source=project-data,target=/workspace,type=volume"]

2. 認証情報の分離

# プロジェクト専用のSSHキー(deploy key)を使用
# ~/.ssh をマウントしない

# プロジェクト専用のAWS認証情報
# 最小権限のIAMロール
# 本番環境へのアクセス権限なし

3. ネットワーク制限

{
  "runArgs": [
    "--network=bridge",
    "--dns=8.8.8.8"
  ]
}

必要に応じて特定のネットワークアクセスのみ許可する。

4. 読み取り専用マウント

設定ファイルなど変更不要なものは読み取り専用でマウント:

"mounts": [
  "source=${localWorkspaceFolder}/.env,target=/workspace/.env,type=bind,readonly"
]

リモート実行環境

ローカルのコンテナ分離だけでなく、クラウド上のリモート環境でエージェントを実行するアプローチも有力である。完全な分離、スケーラビリティ、ローカルリソースの解放といったメリットがある。

Claude Code on the Web

Anthropicが提供する公式のリモート実行機能。Claude.aiから直接コーディングタスクを実行できる。

特徴:

並列実行の方法:

# ターミナルからリモートタスクを送信(&プレフィックス)
& Fix the authentication bug in src/auth/login.ts
& Update the API documentation
& Refactor the logger to use structured output

# または--remoteフラグで直接実行
claude --remote "Fix the flaky test in auth.spec.ts"

# 進捗確認
/tasks

&コマンドは独立したWebセッションを作成し、同時に実行される。

ローカルとの連携:

# プランモードで計画を立てる
claude --permission-mode plan

# 計画に満足したらリモートで実行
& Execute the migration plan we discussed

# リモートセッションをローカルに引き継ぐ
/teleport
# または
claude --teleport <session-id>

プリインストール環境:

GitHub Codespaces

GitHubが提供するクラウド開発環境。リポジトリをそのままクラウドのコンテナで開ける。

メリット:

セットアップ:

# ブラウザで開く
# github.com/<repo> → Code → Codespaces → New codespace

# SSHで接続
gh cs ssh

# ローカルVS Codeから接続
# VS Code → Remote Explorer → Codespaces

制限事項:

クラウドVM(EC2, GCE, DigitalOcean等)

より柔軟な構成が必要な場合は、クラウドVMを直接使用する。

アーキテクチャ例:

Local Machine
├── tmux/screen session (optional)
└── SSH connections
    │
    ├── VM-1 (feature-auth)
    │   ├── Git Worktree
    │   ├── Claude Code session
    │   └── Independent dependencies
    │
    ├── VM-2 (feature-dashboard)
    │   └── ...
    │
    └── VM-3 (feature-api)
        └── ...

接続方法:

# 直接SSH
ssh user@vm-1.example.com
cd /workspace/project && claude

# VS Code Remote SSH
# .ssh/config に設定を追加後、Remote Explorerから接続

# Tailscale経由(NAT越え)
tailscale ssh vm-1

使い捨てインスタンスのパターン:

# Terraform/Pulumiでインスタンスを作成
terraform apply -var="branch=feature-auth"

# タスク完了後に破棄
terraform destroy

タスクごとにインスタンスを作成・破棄することで、完全なクリーン環境を保証できる。

リモートSSHトンネル

ローカルマシンで実行しているClaude Codeにリモートからアクセスする逆パターンもある。

ShellHub + Docker:

# ローカルでClaude Codeをコンテナ化して実行
docker run -d --name claude-agent \
  -e SHELLHUB_TENANT_ID=xxx \
  claude-code-image

# どこからでもSSH接続可能(NAT越え)
ssh user@device.namespace.shellhub.io

Tailscale SSH:

# Tailscaleネットワークに参加
tailscale up

# 別デバイスから接続
tailscale ssh my-dev-machine
cd ~/project && claude

流動状態(フロー)を維持したまま、デバイス間でシームレスに作業を継続できる。

リモート環境の比較

方式 分離度 セットアップ コスト ユースケース
Claude Code on the Web 高(VM) 最小 サブスク込み 並列タスク、軽量作業
GitHub Codespaces 従量制 チーム開発、PR作業
クラウドVM 最高 中〜高 従量制 大規模並列、カスタム環境
リモートSSH(Tailscale等) ローカル依存 無料〜低 デバイス間移動

リモート実行のベストプラクティス

1. 環境の自動セットアップ

CLAUDE.md.claude/settings.jsonのSessionStartフックで依存関係を自動インストール:

{
  "hooks": {
    "SessionStart": [{
      "matcher": "startup",
      "hooks": [{
        "type": "command",
        "command": "\"$CLAUDE_PROJECT_DIR\"/scripts/setup.sh"
      }]
    }]
  }
}

2. 認証情報の安全な受け渡し

環境変数として設定し、リポジトリにはコミットしない:

# Codespacesの場合
# Settings → Codespaces → Secrets に設定

# クラウドVMの場合
# IAMロールを使用(認証情報のハードコードを避ける)

3. ネットワークアクセスの制限

Claude Code on the Webのデフォルトでは、パッケージマネージャとクラウドプラットフォームへのアクセスのみ許可される。追加のドメインは明示的に許可する。

4. テレポートの活用

リモートで作業を進め、インタラクティブな作業が必要になったらローカルに引き継ぐ:

# リモートで基本実装
& Implement the new API endpoint based on the spec

# 複雑なデバッグが必要になったらローカルへ
/teleport

トレードオフと注意点

オーバーヘッド

コンテナ化には以下のオーバーヘッドがある:

キャッシュを活用し、ベースイメージを共有することでオーバーヘッドを軽減できる。

デバッグの複雑さ

コンテナ内での問題切り分けは難しくなることがある:

完全な分離ではない

繰り返しになるが、Dockerコンテナはカーネルを共有している。悪意あるコードがカーネルの脆弱性を突けば、ホストに影響を与える可能性はゼロではない。

完全な分離が必要なら:

いつコンテナ分離を使うべきか

コンテナ分離が有効な場面:

ホストで直接実行してよい場面:


まとめ

Git Worktreeによるファイルシステム分離と、Dev Containerによる実行環境分離を組み合わせることで、AIコーディングエージェントの並列実行をより安全かつスケーラブルに行える。

基本原則:

ツールの選択:

この分野はまだ発展途上であり、2025〜2026年にかけて多くのツールが登場している。自分のワークフローに合ったものを試してみてほしい。


参考

ローカルコンテナ分離

リモート実行環境

並列エージェント管理

関連ノート

AIエージェント・並列開発

環境分離・セキュリティ

開発環境

インフラ・設計原則

抽出された概念

この記事の内容は既存のノートによってカバーされている。主要な関連ノートは上記を参照。