32blogby Studio Mitsu

Claude Code × Docker — 開発環境をAIに丸ごと構築させる

DockerとClaude Codeを組み合わせた開発環境の構築を完全解説。devcontainer設定・docker-compose生成・サンドボックス内での安全なAIエージェント実行まで実践的に紹介する。

by omitsu20 min read
Claude CodeDockerdevcontainerdevelopment environmentcontainers
目次

Docker + Claude Codeを使うと、ホストマシンに一切影響を与えないサンドボックス環境でClaude Codeを自由に動かせる。docker compose up で再現可能な環境が立ち上がり、コンテナ内ならファイルシステムへの広い権限を安全に与えられる。最悪のケースでもコンテナを作り直すだけで済む。

「本番では動くのに開発環境では動かない」問題はエンジニアの定番の悩みだ。Node.jsのバージョンが違う、環境変数の設定が微妙に異なる、依存パッケージのバージョンが合わない。たとえばPrismaのマイグレーションがOpenSSLのバージョン違いで失敗するケースは、GitHub Issuesでも頻出する。

僕がたどり着いた答えが、DockerとClaude Codeの組み合わせだ。環境構築を丸ごとClaude Codeに任せて、本番同等の開発環境を数分で手に入れられるようになった。

Claude CodeとDockerを組み合わせると何が変わるか?

Claude Codeは優秀なコード生成ツールだが、「ホスト環境に直接変更を加える」という側面を持つ。意図しないパッケージのインストール、設定ファイルの書き換え、ポートの占有——これらがホストマシンに影響すると問題になることがある。

Dockerと組み合わせると状況が一変する。

環境の完全分離 — Claude Codeがどれだけファイルを書き換えても、コンテナの外には影響しない。コンテナ内でClaude Codeにリファクタを任せて失敗しても、docker compose down && docker compose up ですぐ元に戻せる。ホスト環境で同じことが起きたら正直焦る。

再現性の保証docker compose up 一発で誰でも同じ環境が立ち上がる。「自分のPCでは動く」問題がなくなる。

本番環境との一致 — 本番と同じOSイメージ・同じミドルウェアバージョンで開発できる。ステージング環境との差異が小さくなる。

Claude Codeへの安全な権限付与 — コンテナ内ならClaude Codeにファイルシステムへの広い権限を与えても安心。Anthropicの公式devcontainerセットアップでは、ファイアウォールルールと組み合わせて --dangerously-skip-permissions による完全自動実行もサポートされている。

ホストマシン安全に保護隔離Docker コンテナ分離された環境実行Claude Code自由に操作出力成果物コード / 設定

DevContainerのセットアップ手順は?

VS CodeのDevContainer機能はDockerを使った開発環境の標準的な仕組みだ。Claude Codeもこの設定を読み込み、コンテナ内で動作できる。Anthropicはリファレンスdevcontainerも公開している。セキュリティ機能が組み込まれているので、そのまま使うかカスタマイズのベースにできる。

必要なもの

セットアップ手順

プロジェクトルートに .devcontainer/ ディレクトリを作成する。

bash
mkdir -p .devcontainer

.devcontainer/devcontainer.json を作成する。

json
{
  "name": "32blog Dev",
  "dockerComposeFile": "docker-compose.yml",
  "service": "app",
  "workspaceFolder": "/workspace",
  "features": {
    "ghcr.io/devcontainers/features/node:1": {
      "version": "22"
    },
    "ghcr.io/devcontainers/features/git:1": {}
  },
  "customizations": {
    "vscode": {
      "extensions": [
        "dbaeumer.vscode-eslint",
        "esbenp.prettier-vscode",
        "bradlc.vscode-tailwindcss"
      ],
      "settings": {
        "editor.formatOnSave": true
      }
    }
  },
  "postCreateCommand": "npm install && npm run build",
  "remoteUser": "node"
}

.devcontainer/docker-compose.yml を作成する。Docker Compose V2では version フィールドは廃止されたので省略する。

yaml
services:
  app:
    build:
      context: ..
      dockerfile: .devcontainer/Dockerfile
    volumes:
      - ..:/workspace:cached
      - node_modules:/workspace/node_modules
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
    command: sleep infinity

volumes:
  node_modules:

.devcontainer/Dockerfile を作成する。

dockerfile
FROM node:22-bookworm-slim

RUN apt-get update && apt-get install -y \
    git \
    curl \
    && rm -rf /var/lib/apt/lists/*

# Claude Code CLI のインストール
RUN npm install -g @anthropic-ai/claude-code

WORKDIR /workspace

VS CodeでプロジェクトフォルダをDevContainerで開くと、自動でコンテナが起動して開発環境が整う。初回ビルドはM2 MacBookで約3分、2回目以降はDockerのレイヤーキャッシュのおかげで10秒以内で起動する。

docker-compose.ymlをClaude Codeに生成させるには?

実際のプロジェクトでは、データベース・キャッシュ・メッセージキューなど複数のサービスが絡む。この複雑な構成をゼロから書くのは面倒だが、Claude Codeに任せると高い精度で生成してくれる。5サービス以上の構成でも一発で正確に出力されることが多い。

プロンプト例を示す。

このNext.jsプロジェクト用のdocker-compose.ymlを作成してほしい。
要件:
- Next.js 15 (Node.js 22)
- PostgreSQL 16
- Redis 7
- 開発環境用(ホットリロード対応)
- 本番環境の設定は不要
- ヘルスチェックを各サービスに設定する
- 環境変数は .env.local から読み込む

Claude Codeが生成するdocker-compose.ymlの例。

yaml
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - .:/app
      - /app/node_modules
      - /app/.next
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgresql://postgres:password@db:5432/myapp_dev
      - REDIS_URL=redis://redis:6379
    env_file:
      - .env.local
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    command: npm run dev

  db:
    image: postgres:16-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=myapp_dev
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  postgres_data:
  redis_data:

ヘルスチェック・依存関係・ボリュームの設定まで適切に生成される。生成後に「PostgreSQLのバージョンを17に変えて」「バックアップ用のサービスを追加して」と追加依頼するだけで修正してくれる。

Claude Codeをコンテナ内で安全に動かすには?

Claude Codeをコンテナ内で動かす最大のメリットは破壊的な操作のリスク管理 だ。Claude Codeに「このファイルを削除して」「全ファイルをリファクタして」と依頼する場合、コンテナ内なら最悪のケースでもコンテナを再作成すれば元に戻る。

コンテナ内でClaude Codeを起動する

bash
# コンテナ内に入る
docker exec -it myproject-app-1 bash

# コンテナ内でClaude Codeを起動
claude

あるいはVS CodeでDevContainerを開いていれば、ターミナルは最初からコンテナ内になっている。

CIパイプラインやバッチ処理など完全自動実行が必要な場合、公式devcontainerはファイアウォールと組み合わせた --dangerously-skip-permissions をサポートしている。npmレジストリ・GitHub・Claude APIのみにアウトバウンド通信を制限した状態で、権限プロンプトなしで実行できる。

bash
# 公式devcontainer内(ファイアウォール有効)
claude --dangerously-skip-permissions

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

コンテナ内でClaude Codeを使うにはAPIキーが必要だ。ハードコードは絶対にしない。

yaml
# docker-compose.yml
services:
  app:
    environment:
      - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
bash
# ホスト側の .env から読み込む(.gitignoreに追加すること!)
ANTHROPIC_API_KEY=sk-ant-...

ホスト側の環境変数をコンテナに渡す形が最も安全だ。

WSL2でDockerとClaude Codeを使うときの注意点は?

WSL2(Windows Subsystem for Linux)上でDockerとClaude Codeを動かす場合、一つだけ絶対に踏んではいけない落とし穴がある。僕は毎日WSL2 Ubuntuでこの構成を使っているが、最初にこれでハマった。

推奨構成

  • Docker Desktop for Windows(WSL2バックエンド)を使う
  • ファイルはWSL2のファイルシステム(/home/username/)に置く
  • Windowsの C ドライブ(/mnt/c/)には絶対にプロジェクトを置かない

Windowsファイルシステム上にプロジェクトを置くと、Dockerのボリュームマウントが著しく遅くなる。僕が最初にこのミスをしたとき、Next.jsのホットリロードが毎回8秒かかっていた。~/projects/ に移動したら1秒未満に改善した。WSL2でClaude Codeが切断される問題に悩んでいる人は、専用のトラブルシューティングガイドも確認してほしい。

WSL2でのClaude Codeインストール

bash
# WSL2 Ubuntu内で実行
sudo apt update
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
npm install -g @anthropic-ai/claude-code

VS CodeとWSL2の連携

VS CodeのRemote - WSL拡張機能を使うと、WSL2内のファイルをWindowsのVS Codeから編集できる。DevContainer拡張機能もWSL2内で動作するため、Windowsでも違和感なくコンテナ開発ができる。

プロジェクトごとに開発環境を完全分離するには?

複数のプロジェクトを扱う場合、プロジェクトごとに専用のDevContainer設定を用意することで環境を完全分離できる。複数のプロジェクトで異なるNode.jsバージョンを使い分ける場合でも、切り替えは「Reopen in Container」だけでバージョン競合がゼロになる。

projects/
├── project-a/
│   ├── .devcontainer/
│   │   └── devcontainer.json  # Node.js 20 + PostgreSQL 16
│   └── src/
├── project-b/
│   ├── .devcontainer/
│   │   └── devcontainer.json  # Node.js 22 + MySQL 8
│   └── src/
└── project-c/
    ├── .devcontainer/
    │   └── devcontainer.json  # Python 3.12 + Redis
    └── src/

各プロジェクトのDevContainerにCLAUDE.md設定も含めておく。プロジェクト固有のプロンプト、禁止パターン、コーディング規約がリポジトリと一緒に移動する。

json
{
  "postCreateCommand": "npm install && echo 'Dev environment ready for Claude Code'"
}

このアプローチの利点は、新メンバーが参加したとき。git clone → VS CodeでDevContainerを開く、この2ステップだけで環境が揃う。Claude Codeも同じバージョン・同じ設定で動く。

コンテナ内でMCPサーバーを設定するには?

MCP(Model Context Protocol)サーバーをコンテナ内で動かすことで、Claude Codeのツール使用もサンドボックス化できる。

json
// .claude/settings.json(コンテナ内)
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/workspace"
      ]
    },
    "postgres": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-postgres",
        "postgresql://postgres:password@db:5432/myapp_dev"
      ]
    }
  }
}

filesystemサーバーの許可パスを /workspace のみにすることで、Claude Codeがアクセスできる範囲をプロジェクトディレクトリに限定できる。

postgresサーバーを設定すると、「usersテーブルのスキーマを確認して」「クエリのN+1問題を探して」といった依頼をClaude Codeが直接データベースに問い合わせながら解決してくれる。32blogではこの組み合わせを使っていて、データモデルを手動で説明しなくてもClaude Codeがスキーマを読んでPrisma APIを自動生成してくれる。

本番環境との乖離をClaude Codeで防ぐには?

本番環境との乖離が起きる原因の多くは「開発中に便宜上の設定を追加して、本番に反映するのを忘れる」パターンだ。Claude Codeに環境の差異を検出させることで防げる。

docker-compose.yml(開発環境)と
k8s/deployment.yaml(本番環境)を比較して、
環境変数・ポート・ヘルスチェックの設定に
差異がないか確認してほしい。
差異があれば一覧表形式でまとめて。

あるいは、CI/CDパイプラインの設定もClaude Codeに生成・維持させる。

.github/workflows/deploy.yml を作成してほしい。
- docker build してイメージをGHCRにpush
- docker-compose.prod.yml の内容でデプロイ
- デプロイ後にヘルスチェックを実行
- 失敗したらSlackに通知

環境設定ファイルの管理をClaude Codeに委ねることで、人間が見落としがちな設定の差異を継続的に検出できる。

CI/CDパイプラインとDocker開発環境を連携させるには?

開発環境とCI/CD環境でDockerイメージが異なると「ローカルでは動くのにCIでは落ちる」が起きる。Claude Codeを使ってマルチステージDockerfileでCI用とDev用の設定を一元管理できる。

マルチステージDockerfileの生成プロンプト:

このプロジェクトのDockerfileを書いて。条件:
- baseステージ: Node.js 22 Alpine + 共通依存
- devステージ: baseを継承、devDependencies含む、ホットリロード対応
- ciステージ: baseを継承、テスト実行・ビルド
- prodステージ: baseを継承、ビルド済みアセットのみ

生成されるDockerfileの構造:

dockerfile
# base
FROM node:22-alpine AS base
WORKDIR /app
COPY package*.json ./

# dev
FROM base AS dev
RUN npm ci
CMD ["npm", "run", "dev"]

# ci
FROM base AS ci
RUN npm ci
COPY . .
RUN npm run build
RUN npm test
CMD ["echo", "CI passed"]

# prod
FROM base AS prod
RUN npm ci --omit=dev
COPY --from=ci /app/dist ./dist
CMD ["node", "dist/server.js"]

GitHub Actionsとの連携:

yaml
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: docker build --target ci -t app-ci .
      - run: docker run app-ci

DevContainerとCI/CDで同じDockerfileの異なるステージを使うことで、「環境の差異」という問題を構造的に排除できる。Next.jsプロジェクトをClaude Codeでセットアップする場合、このマルチステージ構成が特に効果的だ。


よくある質問

ARM Mac(M1/M2/M3)のDockerでClaude Codeは動く?

動く。Docker Desktop for Apple SiliconはRosetta 2またはネイティブARMイメージでコンテナを実行する。node:22-bookworm-slimnode:22-alpine はどちらもARM64バリアントがあるので、Claude Codeのインストールと実行に問題はない。パフォーマンスもネイティブ実行と遜色ない。

VS Codeなしでもdocker composeでClaude Codeを使える?

使える。DevContainerはVS Codeの便利機能にすぎない。docker compose up でコンテナを起動して、docker exec -it <コンテナ名> bash で入り、claude を直接起動すればOK。どのターミナルエミュレータでも動作する。

Claude Code DevContainerに必要なディスク容量は?

基本的なNode.js + Claude Codeのコンテナイメージで約500MB。PostgreSQLとRedisを追加すると合計約1.2GB。node_modules やデータベースデータの名前付きボリュームが時間とともに増える。プロジェクトごとに2〜3GBを見込んでおけば余裕がある。

--dangerously-skip-permissions はコンテナ内なら安全?

ファイアウォールルール付きの適切に設定されたコンテナ内(公式devcontainerなど)なら、リスクは大幅に軽減される。Claude Codeはコンテナのファイルシステムとホワイトリスト済みのネットワーク宛先にしかアクセスできない。ただし、コンテナにマウントされたものは何でも読めるので、ホストの機密ディレクトリはマウントしないこと。

DevContainerの設定をチームで共有できる?

できる。.devcontainer/ ディレクトリをリポジトリにコミットすればいい。VS Codeでプロジェクトを開いた全員に「Reopen in Container」のプロンプトが表示され、同一の環境が得られる。Claude Codeの設定(CLAUDE.md)もリポジトリと一緒に移動する。

実行中のコンテナ内でClaude Codeを更新するには?

コンテナ内で npm update -g @anthropic-ai/claude-code を実行する。永続的に更新したい場合はDockerfileのバージョンを変更して docker compose build --no-cache app でリビルドする。

DockerでClaude Codeを動かすとネイティブ実行と比べてパフォーマンスは落ちる?

LinuxとmacOSではオーバーヘッドはほぼゼロ。DockerはホストのカーネルをDirectに使う。WSL2のWindowsでは翻訳レイヤーの小さなオーバーヘッドがあるが、Claude CodeのAPIコール(ボトルネック)はネットワーク依存でありCPU依存ではないので、実際には差を感じない。

複数のコンテナで同時にClaude Codeを実行できる?

できる。各コンテナは完全に分離されているので、コンテナAでフロントエンドタスク、コンテナBでバックエンドリファクタを同時並行で進められる。詳細なパターンはClaude Code複数インスタンス運用ガイドを参照してほしい。


まとめ

DockerとClaude Codeの組み合わせで得られるものは「安心して大胆に依頼できる環境」だ。

  • コンテナの分離により、Claude Codeが破壊的な変更をしても影響範囲が限定される
  • DevContainer設定でチーム全員が同じ環境でClaude Codeを使える
  • docker-composeの複雑な設定もClaude Codeに生成させれば数分で完成する
  • 公式devcontainerはファイアウォールルール付きで完全自動実行もサポート
  • WSL2環境もWSL2ファイルシステムにプロジェクトを置けば快適に動く

まず .devcontainer/ ディレクトリを作って、Claude Codeに「このプロジェクト用のdevcontainer.jsonとdocker-compose.ymlを作って」と依頼するところから始めよう。15分もあれば本番同等の開発環境が手に入る。

トラブルが起きたらClaude CodeトラブルシューティングガイドにDocker関連のエラー対処法がまとまっている。コンテナ開発でAPIコストを抑えたい場合は、トークンコスト削減ガイドも参考になるはずだ。