Claude Code Dev Containers完全ガイド|Docker隔離環境でAI開発を安全・再現可能にする方法

Claude Code Dev Containers完全ガイド|Docker隔離環境でAI開発を安全・再現可能にする方法 AI開発

Claude Codeは強力なAI開発ツールですが、ローカル環境で直接実行すると「ファイルシステムへの広範なアクセスが気になる」「チームメンバーの環境構築が面倒」「CI/CDとの統合が複雑」といった課題が生じます。これらをまとめて解決するのがDev Containers(devcontainer)との統合です。

AnthropicはClaude Code用の公式リファレンス実装を提供しており、Dockerコンテナ内でClaude Codeを安全に、かつ再現可能に実行できます。この記事ではdevcontainer.jsonの設定・ファイアウォールによるネットワーク制限・--dangerously-skip-permissionsの安全な活用・チームオンボーディング活用まで徹底解説します。

Claude Code全般の概要はClaude Code完全ガイドを、権限設定の詳細は権限・パーミッション設定完全ガイドを参照してください。

スポンサーリンク

Dev ContainersとClaude Codeの組み合わせで解決できること

課題 Dev Containers統合による解決策
ファイルシステムへの広範アクセスが心配 コンテナ内に隔離。ホストOSへの影響なし
チームで環境を統一したい devcontainer.jsonで環境をコード化。分単位でセットアップ完了
AIによるネットワークアクセスを制限したい iptablesファイアウォールで許可ドメインを厳格に管理
CI/CDでClaude Codeを無人実行したい コンテナ内の–dangerously-skip-permissionsで安全な自動化
クライアント案件ごとに環境を分離したい 案件ごとにコンテナを作成。認証情報・コードが混在しない
Dev Containersとは
VS Code / GitHub CodspacesなどがサポートするDockerベースの開発環境標準仕様です。.devcontainer/devcontainer.jsonに環境定義を書くと、チーム全員が同一のコンテナ内で開発できます。Claude Codeもこの仕組みの中で動作します。

Anthropic公式リファレンス実装の構成

AnthropicはClaude Code用のdevcontainerリファレンス実装をGitHubで公開しています。3つのファイルで構成されています。

ファイル 役割
devcontainer.json コンテナ設定・VSCode拡張・ボリュームマウント・起動後コマンド
Dockerfile イメージ定義。Node.js 20・ZSH・fzf・必要ツールをインストール
init-firewall.sh コンテナ起動時にiptablesでネットワークアクセスを制限

devcontainer.json

.devcontainer/devcontainer.json
{
  "name": "Claude Code Dev Container",
  "build": {
    "dockerfile": "Dockerfile"
  },
  "runArgs": [
    "--cap-add=NET_ADMIN",
    "--cap-add=NET_RAW"
  ],
  "postStartCommand": "bash .devcontainer/init-firewall.sh",
  "customizations": {
    "vscode": {
      "extensions": [
        "anthropic.claude-code"
      ]
    }
  },
  "mounts": [
    "source=${localEnv:HOME}/.claude,target=/root/.claude,type=bind,consistency=cached",
    "source=${localEnv:HOME}/.gitconfig,target=/root/.gitconfig,type=bind,consistency=cached"
  ]
}

runArgsNET_ADMINNET_RAWは、init-firewall.shでiptablesを操作するために必要な権限です。mountsでは、ホストOSの~/.claude/(Claude Codeの設定・メモリ)と~/.gitconfigをコンテナ内に共有することで、コンテナを再作成しても設定が引き継がれます。

Dockerfile

Dockerfile(ベースイメージとツール定義)
FROM mcr.microsoft.com/devcontainers/javascript-node:20

# 基本ツールのインストール
RUN apt-get update && apt-get install -y \
    iptables \
    ipset \
    fzf \
    zsh \
    git \
    && rm -rf /var/lib/apt/lists/*

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

# ZSHをデフォルトシェルに
SHELL ["/bin/zsh", "-c"]

init-firewall.sh(ネットワーク制限スクリプト)

コンテナ起動時に自動実行されるスクリプトで、許可するドメインのみにアクセスを制限します。これにより、AIが意図しない外部サービスにアクセスすることを防ぎます。

init-firewall.sh(ファイアウォール設定)
#!/bin/bash
# 許可するドメイン(DNS解決後のIPをipsetに追加)
ALLOWED_DOMAINS=(
  "anthropic.com"        # Claude API
  "sentry.io"            # エラー収集
  "statsig.com"          # 機能フラグ
  "registry.npmjs.org"   # npmパッケージ
  "github.com"           # GitHub
  "raw.githubusercontent.com"
  "api.github.com"
)

# ipsetでAllowlistを作成
ipset create allowed-domains hash:ip

for domain in "${ALLOWED_DOMAINS[@]}"; do
  # DNS解決してIPをipsetに追加
  for ip in $(dig +short "$domain" A); do
    ipset add allowed-domains "$ip" 2>/dev/null || true
  done
done

# iptablesルール: Allowlist以外の外部通信を拒否
iptables -F OUTPUT
iptables -A OUTPUT -m set --match-set allowed-domains dst -j ACCEPT
iptables -A OUTPUT -d 127.0.0.0/8 -j ACCEPT  # localhost
iptables -A OUTPUT -d 10.0.0.0/8 -j ACCEPT   # 内部ネットワーク
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT # DNS
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT # SSH
iptables -A OUTPUT -j REJECT  # それ以外は拒否

echo "Firewall initialized. Allowed domains: ${ALLOWED_DOMAINS[@]}"
ファイアウォール設定は要件に応じてカスタマイズ
上記はリファレンス実装のベースとなる例です。実際の利用では、使用するパッケージレジストリ(PyPI等)・社内APIドメイン・クラウドサービスのIPアドレスなどを追加してください。IPアドレスは変わることがあるため、定期的に見直すことを推奨します。

セットアップ手順

VS Codeでの起動

  1. VS CodeにDev Containers拡張機能ms-vscode-remote.remote-containers)をインストール
  2. プロジェクトのルートに.devcontainer/フォルダと上記3ファイルを作成
  3. VS Codeでプロジェクトを開くと右下に「Reopen in Container」プロンプトが表示されるのでクリック(または Ctrl+Shift+PDev Containers: Reopen in Container
  4. コンテナのビルドが完了すると、VS CodeがコンテナにアタッチされたClaude Code拡張を使用できる状態になる
  5. ターミナルで claude と入力して動作確認

GitHub Codespacesでの起動

GitHubリポジトリに.devcontainer/をコミットしておくと、GitHub Codespacesでもそのまま使えます。

  1. GitHubリポジトリの「Code」ボタン → 「Codespaces」タブ → 「Create codespace on main」
  2. 自動的にdevcontainerが起動し、ブラウザからVS Codeとして利用可能
  3. Claude Codeの認証は claude /login で行う
Codespacesで認証情報を安全に管理
GitHub CodespacesではANTHROPIC_API_KEYをRepository secretsに登録すると、コンテナ起動時に自動で環境変数として注入されます。直接コードにキーを書かなくて済みます。

–dangerously-skip-permissionsとコンテナの組み合わせ

--dangerously-skip-permissionsフラグは、すべての操作を確認なしで実行します。通常のローカル環境では危険ですが、ファイアウォールで制限されたコンテナ内であれば安全に使用できます。CI/CDパイプライン・自動化スクリプト・夜間バッチ処理に適しています。

コンテナ内での無人実行
# コンテナ内では --dangerously-skip-permissions が安全
claude --dangerously-skip-permissions -p "テストを実行して失敗しているものを修正してください"

# ヘッドレスモードとの組み合わせ(JSON出力)
claude --dangerously-skip-permissions \
  --output-format json \
  -p "コードレビューを行い、問題点をJSON形式で出力してください"
ローカル環境では使用しないこと
--dangerously-skip-permissionsはコンテナ外のローカル環境では使用しないでください。ファイルの削除・外部への通信・設定変更などが確認なしで実行されます。この組み合わせの安全性はコンテナの隔離性に依存しています。
実行環境 --dangerously-skip-permissionsの使用 理由
ローカル環境 ❌ 非推奨 ホストOSへの影響が直接及ぶ
ファイアウォール付きコンテナ ✅ 安全 ネットワーク・ファイルシステムが隔離
GitHub Actions ✅ 安全(適切な設定下) ランナーはジョブ完了後に破棄
コンテナなしCI ⚠️ 慎重に リポジトリへの書き込み権限に注意

実践的な活用パターン

チームオンボーディングの効率化

新しいチームメンバーがプロジェクトに参加する際、従来は環境構築に数時間かかることもありました。devcontainerを使えば、以下のコマンドだけで完了します。

新メンバーのセットアップ手順
# 1. リポジトリをクローン
git clone https://github.com/your-org/your-project.git
cd your-project

# 2. VS Codeで開いて「Reopen in Container」
code .
# → VS Codeが自動でdevcontainerをビルド・起動

# 3. Claude Codeの認証(初回のみ)
claude /login

# 以上で開発開始可能

クライアント案件ごとの環境分離

複数のクライアント案件を同時進行する場合、案件ごとにdevcontainerを作成することで認証情報・依存関係・Claude Codeの設定が完全に分離されます。

.devcontainer/devcontainer.json(案件ごとに異なるマウント設定)
{
  "name": "Client-A Project",
  "mounts": [
    "source=${localEnv:HOME}/.claude/projects/client-a,target=/root/.claude/projects,type=bind"
  ],
  "remoteEnv": {
    "ANTHROPIC_API_KEY": "${localEnv:CLIENT_A_ANTHROPIC_KEY}"
  }
}

CI/CDパイプラインへの統合

GitHub Actionsでもdevcontainerを使うことで、ローカル開発環境とCI環境を完全に統一できます。Claude Codeを使ったテスト・レビュー・コード生成をCI上で実行できます。詳細はGitHub Actions完全ガイドを参照してください。

.github/workflows/claude-review.yml
name: Claude Code Review

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    container:
      image: mcr.microsoft.com/devcontainers/javascript-node:20
    steps:
      - uses: actions/checkout@v4
      - name: Install Claude Code
        run: npm install -g @anthropic-ai/claude-code
      - name: Run Claude Code review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          claude --dangerously-skip-permissions \
            --output-format json \
            -p "このPRの変更をレビューして問題点を指摘してください"

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

項目 推奨設定 理由
ネットワーク iptablesで必要なドメインのみ許可 意図しない外部通信を防止
APIキー 環境変数経由(ファイルに書かない) 誤ってGitにコミットするリスクを排除
マウント 最小限(~/.claudeと~/.gitconfigのみ) ホストOSへのアクセスを最小化
イメージ 公式ベースイメージを使用 サプライチェーン攻撃リスクを低減
コンテナ権限 NET_ADMINのみ(SYS_ADMINは不要) 最小権限の原則
~/.claudeのマウントで設定を永続化
~/.claude/ディレクトリをコンテナにマウントすることで、Claude Codeのauto-memory(MEMORY.md)・settings.json・認証トークンがコンテナ再作成後も保持されます。チームで共有する場合はマウント先をプロジェクト固有のパス(~/.claude/projects/project-name/)に変えてください。

よくある質問

QDev ContainersなしでもClaude Codeは使えますか?

Aはい、Dev Containersはオプションです。ローカル環境で直接claudeコマンドを実行できます。Dev Containersは「隔離・再現性・セキュリティ」が必要な場合に特に有効です。チーム開発・クライアント案件・CI/CDへの組み込みを考えているなら導入を検討してください。

QWindowsでDev Containersを使う場合の注意点はありますか?

AWSL2(Windows Subsystem for Linux 2)が必要です。WSL2がインストールされていれば、VS CodeのDev Containers拡張機能で問題なく動作します。ただし、init-firewall.shのiptablesコマンドはLinuxカーネル機能のため、WSL2環境では一部制限がある場合があります。

QGitHub Codespacesでの認証はどうすればいいですか?

AANTHROPIC_API_KEYをGitHubのリポジトリシークレット(または組織シークレット)に登録し、devcontainer.jsonのremoteEnvで参照します:"remoteEnv": {"ANTHROPIC_API_KEY": "${localEnv:ANTHROPIC_API_KEY}"}。またはCodespaces起動後にclaude /loginで直接認証することもできます。

Qファイアウォール設定でnpmのインストールがブロックされてしまいます。

Aregistry.npmjs.orgのIPアドレスが変わっている可能性があります。またはnpmjs.orgに加えてcdn.npmjs.comfulcio.sigstore.dev(署名検証)などへのアクセスが必要な場合があります。init-firewall.shのALLOWED_DOMAINSに追加してください。

Qチームで.devcontainerをGitで管理する際の注意点は?

AAPIキーや認証情報は絶対にdevcontainer.json内に直接書かないでください。環境変数(localEnv:参照)またはGitHub Secrets経由で注入します。またinit-firewall.shに社内IPアドレス等が含まれる場合は、プライベートリポジトリでのみ管理することを検討してください。