結論: Claude CodeをDockerのdevcontainerで動かすと、ホスト環境を隔離しながら --dangerously-skip-permissions を安全に使えます。Anthropic公式のdevcontainer実装が最短1コマンドで使えます。
この記事の要点:
- 要点1: 公式devcontainerはファイアウォール付き。外部通信をホワイトリスト制御できる
- 要点2: VS Code Dev Containers拡張と組み合わせると、チーム全員が同じ環境で使える
- 要点3: CI/CDパイプラインにClaude Codeを組み込むには、コンテナ化が事実上の必須条件
対象読者: Claude CodeをDockerで使いたいエンジニア、チームで統一された開発環境を整備したいテックリード
読了後にできること: Claude Code用のdevcontainerを今日から構築し、安全なAI開発環境を整備できる
「Claude Codeがホストマシンのファイルを書き換えるのが怖いんだけど、何か対策ある?」
これ、よく聞かれます。確かに、Claude Codeは便利ですが「AIがファイルを自動で変更する」という点で不安を感じる方も多いですよね。先日もあるスタートアップのCTOから「本番環境のコードベースでAIに権限を与えるのはリスクがある」という話を聞きました。
その解決策がDocker devcontainerです。コンテナの中でClaude Codeを動かすことで、万が一AIが意図しない変更をしても、ホストマシンには影響を与えません。さらにAnthropicが公式で提供しているdevcontainer設定にはファイアウォール機能まで内蔵されています。
この記事では、Claude Code × Dockerの構築方法を、コピペで使えるコード例つきで全公開します。
まず5分で動かす:公式devcontainerを使う
難しい設定は後で解説するとして、まず動かしましょう。
# ステップ1: VS Code と Dev Containers拡張をインストール
# VS Code: https://code.visualstudio.com/
# Dev Containers拡張: ms-vscode-remote.remote-containers
# ステップ2: Claude Codeのリポジトリをクローン
git clone https://github.com/anthropics/claude-code.git
cd claude-code
# ステップ3: VS Codeで開く
code .
# ステップ4: コマンドパレット(Cmd+Shift+P)を開いて
# "Dev Containers: Reopen in Container" を選択
# → 初回はDockerイメージのビルドに2〜3分かかります
# ステップ5: コンテナ内でClaude Codeを起動
claude
これだけです。公式のdevcontainerはそのまま使える形で提供されています。
AIエージェントとセキュリティの関係についての全体像はAIエージェント導入完全ガイドを参照いただくとして、ここではClaude Code×Docker特有の話に集中します。
DockerでClaude Codeを使う3つのメリット
メリット1:ホスト環境の保護(最重要)
コンテナ内のClaude Codeは、マウントしたディレクトリのみアクセスできます。~/.ssh/や~/.aws/などの個人設定ファイルはコンテナから見えません。
# コンテナ内からホストの重要ファイルへアクセスできない例
# (devcontainerが正しく設定されている場合)
ls ~/.ssh/ # → 空、またはエラー
cat ~/.aws/credentials # → 見えない
メリット2:再現性のある環境
「自分のMacでは動くのに、CIでは動かない」問題をゼロにできます。devcontainerの設定ファイルをGitで管理すれば、全チームメンバーが同じ環境でClaude Codeを使えます。
メリット3:–dangerously-skip-permissionsを安全に使える
通常、Claude Codeはファイル変更・コマンド実行のたびに確認を求めます。これを省略する --dangerously-skip-permissions フラグがありますが、ホスト環境では本当に危険です。
しかしdevcontainer内なら安全です。Anthropic公式のdevcontainerにはファイアウォールが内蔵されているため、コンテナ外への影響を防ぎながら無人自動実行ができます。
# devcontainer内での自動実行(CI/CD向け)
claude --dangerously-skip-permissions --print "テストを全部パスするようにコードを修正してください"
# ヘッドレス実行(コマンド1本で完結)
claude --print "READMEの英語部分を日本語に翻訳してください" > output.txt
公式devcontainerの設定解説
Anthropicの公式devcontainerは3つのファイルで構成されています。
devcontainer.json(コンテナ全体の設定)
// .devcontainer/devcontainer.json
{
"name": "Claude Code Dev Container",
"build": {
"dockerfile": "Dockerfile",
"context": ".."
},
// マウント設定(Claude Codeの認証情報を引き継ぎ)
"mounts": [
"source=${localEnv:HOME}/.claude,target=/home/user/.claude,type=bind,consistency=cached"
],
// VS Code拡張(コンテナ内に自動インストール)
"customizations": {
"vscode": {
"extensions": [
"anthropic.claude-code"
],
"settings": {
"terminal.integrated.defaultProfile.linux": "zsh"
}
}
},
// コンテナ起動時にファイアウォールを初期化
"postCreateCommand": "sudo /init-firewall.sh",
// 非rootユーザーで実行(セキュリティ強化)
"remoteUser": "user"
}
Dockerfile(コンテナイメージの定義)
# .devcontainer/Dockerfile
FROM node:20-bullseye-slim
# 必要ツールのインストール
RUN apt-get update && apt-get install -y \
git \
curl \
zsh \
fzf \
iptables \
iproute2 \
&& rm -rf /var/lib/apt/lists/*
# 非rootユーザーの作成(セキュリティ強化)
RUN useradd -m -s /zsh user && \
echo "user ALL=(ALL) NOPASSWD: /init-firewall.sh" >> /etc/sudoers
USER user
# Claude Codeのネイティブインストール
RUN curl -fsSL https://claude.ai/install.sh | bash
# PATHの設定
ENV PATH="/home/user/.local/bin:$PATH"
WORKDIR /workspace
init-firewall.sh(ネットワークアクセス制御)
#!/bin/bash
# .devcontainer/init-firewall.sh
# デフォルトでアウトバウンドを全部ブロック
iptables -P OUTPUT DROP
# 必要なサービスのみ許可(ホワイトリスト)
ALLOWED_HOSTS=(
"api.anthropic.com" # Claude API
"registry.npmjs.org" # npm
"github.com" # GitHub
"raw.githubusercontent.com"
"pypi.org" # Python
"objects.githubusercontent.com"
)
for host in "${ALLOWED_HOSTS[@]}"; do
iptables -A OUTPUT -d "$host" -j ACCEPT
done
# DNS(53番ポート)は常に許可
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
# ローカルホスト通信は許可
iptables -A OUTPUT -d 127.0.0.0/8 -j ACCEPT
echo "Firewall initialized. External connections restricted to allowlist."
docker-compose.ymlで開発環境を丸ごと管理
# docker-compose.yml
version: '3.8'
services:
# Claude Code開発環境
app:
build:
context: .
dockerfile: .devcontainer/Dockerfile
volumes:
# プロジェクトをマウント
- .:/workspace:cached
# Claude Code認証情報を引き継ぎ(読み取り専用)
- ${HOME}/.claude:/home/user/.claude:ro
environment:
- NODE_ENV=development
cap_add:
# ファイアウォール設定に必要
- NET_ADMIN
working_dir: /workspace
command: sleep infinity # コンテナを起動したままにする
# 開発用DBは別コンテナで管理(Claude Codeから直接アクセスさせない)
db:
image: postgres:15
environment:
POSTGRES_DB: devdb
POSTGRES_USER: devuser
POSTGRES_PASSWORD: devpass
# ホストに公開しない(他コンテナからのみアクセス)
expose:
- "5432"
# 使い方
docker-compose up -d
docker-compose exec app claude
# コンテナ内でClaude Codeを使う
# ホストのファイルシステムはマウント分のみアクセス可能
VS Code Dev Containersとの連携
Claude CodeのDockerコンテナ設定については、Claude Codeインストール完全ガイドのインストール手順を先に確認しておくと理解しやすくなります。
# ステップ1: VS Codeに Dev Containers拡張をインストール
code --install-extension ms-vscode-remote.remote-containers
# ステップ2: コマンドパレット(Cmd+Shift+P)で
# "Dev Containers: Open Folder in Container" を選択
# または、ルートに.devcontainer/があるフォルダを開くと
# 自動で「コンテナで開く?」の通知が表示される
# ステップ3: コンテナ内でそのままClaude Codeを使う
# VS Codeのターミナルで:
claude
一番助かるのが新メンバーのオンボーディングです。今まで「Macに必要なツールを全部インストールして…」という説明書を作っていた手間が、devcontainerを用意するだけでゼロになります。先日、3名の新エンジニアが入ったスタートアップで試したところ、開発環境構築が従来の3時間から30分に短縮できました。
# チームメンバーへの共有コマンド(これだけ渡せばOK)
git clone https://github.com/your-org/your-project.git
cd your-project
code .
# 「コンテナで開く?」→「はい」を選ぶだけ
CI/CDでClaude Codeを活用する
GitHub ActionsでClaude Codeを使う
# .github/workflows/ai-code-review.yml
name: AI Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
claude-review:
runs-on: ubuntu-latest
container:
# Claude Code入りのDockerイメージを使用
image: ghcr.io/your-org/claude-code-env:latest
options: --cap-add NET_ADMIN
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: ファイアウォール初期化
run: sudo /init-firewall.sh
- name: Claude Codeでコードレビュー
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
# 変更ファイルのリストを取得
CHANGED_FILES=$(git diff --name-only origin/main HEAD)
# Claude Codeでレビュー
echo "$CHANGED_FILES" | xargs -I {} claude --print \
"このファイルの潜在的なバグとセキュリティリスクを指摘してください: {}" \
> review_output.txt
- name: レビュー結果をPRコメントに投稿
uses: actions/github-script@v7
with:
script: |
const fs = require('fs')
const review = fs.readFileSync('review_output.txt', 'utf8')
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `## Claude Code自動レビュー\n\n${review}`
})
テスト自動生成パイプライン
# .github/workflows/generate-tests.yml
name: AI Test Generation
on:
push:
paths:
- 'src/**/*.ts'
jobs:
generate-tests:
runs-on: ubuntu-latest
container:
image: ghcr.io/your-org/claude-code-env:latest
steps:
- uses: actions/checkout@v4
- name: テストのないファイルを検出してテスト生成
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
for file in $(find src -name "*.ts" -not -name "*.test.ts"); do
test_file="${file%.ts}.test.ts"
if [ ! -f "$test_file" ]; then
claude --dangerously-skip-permissions --print \
"@$file のユニットテストをJestで書いてください。不足している情報があれば仮定として明記してください。" \
> "$test_file"
echo "Generated: $test_file"
fi
done
セキュリティベストプラクティス
# ✅ 推奨設定チェックリスト
# 1. 非rootユーザーで実行
# Dockerfile: USER user(rootで実行しない)
# 2. マウントは最小権限で
# 必要なディレクトリのみマウント
volumes:
- ./src:/workspace/src:cached # srcのみ
- ${HOME}/.claude:/home/user/.claude:ro # 認証情報は読み取り専用
# 3. 環境変数でシークレットを渡さない
# ❌ NG: docker-compose.ymlにAPIキーを直書き
# ✅ OK: .env.localやシークレット管理ツールを使用
# 4. ファイアウォールで外部通信を制限
# init-firewall.shでホワイトリスト制御
# 5. イメージのバージョンを固定
# ❌ FROM node:latest (いつの間にか変わる)
# ✅ FROM node:20.18.1-bullseye-slim (バージョン固定)
【要注意】Docker×Claude Codeの失敗パターン4選
失敗1:認証情報のマウント設定を忘れる
# ❌ よくある失敗: コンテナ内でclaude loginが毎回必要
# 原因: ~/.claudeをマウントしていない
# ✅ 解決策: devcontainer.jsonにマウント設定を追加
"mounts": [
"source=${localEnv:HOME}/.claude,target=/home/user/.claude,type=bind,consistency=cached"
]
失敗2:rootユーザーでコンテナを動かす
# ❌ よくある失敗: Dockerfileにユーザー設定なし
# → コンテナ内のすべての操作がrootで実行される
# ✅ 解決策: Dockerfileで非rootユーザーを作成
RUN useradd -m -s /bin/bash developer
USER developer
失敗3:–dangerously-skip-permissionsをホスト環境で使う
# ❌ よくある失敗
# devcontainerなしのホスト環境で --dangerously-skip-permissions
# ✅ 正しいアプローチ
# 必ずdevcontainer内でのみ使用
# Anthropic公式: "devcontainer provides substantial protections"
失敗4:ファイアウォール設定なしでdevcontainerを使う
# ❌ よくある失敗: ファイアウォールなしで --dangerously-skip-permissions
# 悪意あるプロジェクトが実行された場合、コンテナ内のデータ漏洩リスクあり
# ✅ 解決策: init-firewall.shでアウトバウンド通信を制限
# Anthropic公式ドキュメント: "no system is completely immune to all attacks"
# → 信頼できるリポジトリのみでdevcontainerを使うことを推奨
まとめ:今日から始める3つのアクション
- 今日やること:
git clone https://github.com/anthropics/claude-code.gitして公式devcontainerを動かしてみる - 今週中: 自分のプロジェクト用のdevcontainer.jsonを作成し、チームに共有する
- 今月中: CI/CDパイプラインにClaude Codeを組み込み、コードレビュー自動化を試験運用する
次回予告: 次の記事では「Claude Code MCPサーバー活用術」をテーマに、GitHub・Slack・DBなど外部ツールとの連携設定を詳しく解説します。
参考・出典
- Development containers — Claude Code公式ドキュメント(参照日: 2026-03-27)
- Claude Code公式devcontainer実装 — GitHub(参照日: 2026-03-27)
- Sandboxed devcontainer for Claude Code — Trail of Bits(参照日: 2026-03-27)
- Developing inside a Container — VS Code公式ドキュメント(参照日: 2026-03-27)
著者: 佐藤傑(さとう・すぐる)
株式会社Uravation代表取締役。早稲田大学法学部在学中に生成AIの可能性に魅了され、X(@SuguruKun_ai)フォロワー約10万人。100社以上の企業向けAI研修・導入支援を展開。著書『AIエージェント仕事術』(SBクリエイティブ)。SoftBank IT連載7回執筆(NewsPicks最大1,125ピックス)。
Claude Code活用のご相談はClaude Coachingまたはお問い合わせフォームからどうぞ。


