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で安全な自動化 |
| クライアント案件ごとに環境を分離したい | 案件ごとにコンテナを作成。認証情報・コードが混在しない |
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
{
"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"
]
}
runArgsのNET_ADMINとNET_RAWは、init-firewall.shでiptablesを操作するために必要な権限です。mountsでは、ホストOSの~/.claude/(Claude Codeの設定・メモリ)と~/.gitconfigをコンテナ内に共有することで、コンテナを再作成しても設定が引き継がれます。
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が意図しない外部サービスにアクセスすることを防ぎます。
#!/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での起動
- VS CodeにDev Containers拡張機能(
ms-vscode-remote.remote-containers)をインストール - プロジェクトのルートに
.devcontainer/フォルダと上記3ファイルを作成 - VS Codeでプロジェクトを開くと右下に「Reopen in Container」プロンプトが表示されるのでクリック(または
Ctrl+Shift+P→ Dev Containers: Reopen in Container) - コンテナのビルドが完了すると、VS CodeがコンテナにアタッチされたClaude Code拡張を使用できる状態になる
- ターミナルで
claudeと入力して動作確認
GitHub Codespacesでの起動
GitHubリポジトリに.devcontainer/をコミットしておくと、GitHub Codespacesでもそのまま使えます。
- GitHubリポジトリの「Code」ボタン → 「Codespaces」タブ → 「Create codespace on main」
- 自動的にdevcontainerが起動し、ブラウザからVS Codeとして利用可能
- Claude Codeの認証は
claude /loginで行う
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の設定が完全に分離されます。
{
"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完全ガイドを参照してください。
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 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.com・fulcio.sigstore.dev(署名検証)などへのアクセスが必要な場合があります。init-firewall.shのALLOWED_DOMAINSに追加してください。
Qチームで.devcontainerをGitで管理する際の注意点は?
AAPIキーや認証情報は絶対にdevcontainer.json内に直接書かないでください。環境変数(localEnv:参照)またはGitHub Secrets経由で注入します。またinit-firewall.shに社内IPアドレス等が含まれる場合は、プライベートリポジトリでのみ管理することを検討してください。

