🔐

個人用とクライアント(会社)用の Claude Code を併用する方法 - Dev Container + ボリューム分離で安全に

に公開

この記事を読むべき人

  • フリーランスエンジニア・コンサルタント
  • 複数のクライアントプロジェクトを抱えている開発者
  • 個人プロジェクトと仕事プロジェクトを両立している人
  • Claude Code を安全に使いたいと考えている人

よくある困りごと

シナリオ 1: 「誤って個人アカウントでクライアントコードにアクセスしてしまった...」

あなたは個人の趣味プロジェクトで Claude Code を使っていました。ある日、クライアントワークで Claude Code を起動したら、同じアカウントでログインされていました。

問題点:

  • 個人アカウントの会話履歴にクライアントの機密コードが混ざる
  • API 使用料金の請求を分けられない
  • クライアントに「個人アカウントでアクセスしました」と報告しにくい
  • 監査やコンプライアンスの観点で問題になる可能性

シナリオ 2: 「クライアント A のコードがクライアント B の Claude セッションに...」

複数のクライアントプロジェクトを同時進行中。Claude Code でクライアント A のプロジェクトを作業後、クライアント B のプロジェクトに切り替えたら、同じセッションが続いていました。

問題点:

  • クライアント A のコードや設計がクライアント B のセッションに残る
  • 誤って別クライアントの情報を参照してしまう
  • セキュリティ違反のリスク
  • NDA(秘密保持契約)違反の可能性

この記事の解決策: Dev Container + ボリューム分離

これらの問題を技術的に完全に解決する方法を紹介します。

解決策の全体像

個人プロジェクト
  → devcontainer でローカルの ~/.claude をマウント
  → 自分のアカウントをそのまま使用

クライアント A(例: client-a)
  → 専用の devcontainer
  → 専用のボリューム(claude-client-a)
  → クライアント A のアカウントでログイン
  → セキュリティポリシー適用

クライアント B(例: client-b)
  → 専用の devcontainer
  → 専用のボリューム(claude-client-b)
  → クライアント B のアカウントでログイン
  → セキュリティポリシー適用

重要なポイント: 各クライアントは物理的に隔離された環境で動作します。

マウント方式の違い

用途 マウント方式 設定例 特徴
個人プロジェクト bind マウント source=${localEnv:HOME}/.claude ローカルの ~/.claude を直接共有
クライアント Docker ボリューム source=claude-client-a 隔離された専用領域(ローカルにアクセス不可)

Bind Mount vs Volume Mount の違い

クライアント用の devcontainer は Docker ボリュームを使うため、ローカルの ~/.claude には物理的にアクセスできません。これにより、クライアント環境から個人の認証情報や履歴が漏れることを防ぎます。

なぜこの方法が優れているのか

1. 完全な隔離 = 混ざらない保証

Dev Container とは:

  • Docker コンテナ内で開発環境を動かす仕組み
  • 各プロジェクトが別々の仮想マシンのように動作
  • クライアント A のコンテナからクライアント B のファイルに物理的にアクセスできない

ボリューム分離とは:

  • Claude Code の認証情報やセッション履歴を保存する場所
  • claude-client-a と claude-client-b は完全に別の場所
  • 一方のセッションが他方に影響することは技術的に不可能

2. 多層的なセキュリティ

Dev Container による物理的な隔離で、より堅牢なセキュリティを実現できます。

  • コンテナ外のファイルに物理的にアクセスできない
  • ホストマシンの ~/.ssh や ~/.aws などの機密情報から保護
  • 万が一の事故でも影響範囲がコンテナ内に限定される

3. 監査証跡の明確化

ボリューム = アカウント = プロジェクト という対応関係で、監査やセキュリティレビューに対応しやすくなります。

4. ログイン切り替えの手間を解消

クライアントごとにアカウントを分けると、毎回 claude /logout → claude /login の切り替えが必要になります。Dev Container + ボリューム分離なら、コンテナを切り替えるだけで自動的にアカウントも切り替わるため、この手間がなくなります。

使い方: 2つの方法

Dev Container を使う方法は2つあります。

方法 1: VS Code 拡張機能

VS Code には Dev Containers 拡張機能(旧 Remote - Containers)が用意されています。

  1. VS Code に「Dev Containers」拡張機能をインストール
  2. プロジェクトに .devcontainer/devcontainer.json を配置
  3. コマンドパレットから「Dev Containers: Reopen in Container」を実行
  4. コンテナ内で Claude Code 拡張機能を使用

VS Code ユーザーには最も馴染みやすい方法です。

方法 2: Dev Container CLI

ターミナルから直接操作したい場合は Dev Container CLI を使います。

# インストール
npm install -g @devcontainers/cli

# コンテナを起動
devcontainer up --workspace-folder .

# コンテナ内に入る
devcontainer exec --workspace-folder . zsh

# Claude Code を起動
claude

エディタに依存しないので、Vim/Neovim ユーザーや複数エディタを使い分ける人に便利です。

セットアップ

ステップ 1: 前提条件

  • Docker Desktop がインストールされていること
  • VS Code + Dev Containers 拡張機能、または Dev Container CLI

ステップ 2: devcontainer.json を作成

プロジェクトに .devcontainer/devcontainer.json を作成します。

個人プロジェクト用(ローカルの ~/.claude を使う)

{
  "name": "My Personal Project",
  "image": "mcr.microsoft.com/devcontainers/javascript-node:20",

  "mounts": [
    "source=${localEnv:HOME}/.claude,target=/home/node/.claude,type=bind",
    "source=${localEnv:HOME}/.gitconfig,target=/home/node/.gitconfig,type=bind,consistency=cached"
  ],

  "postCreateCommand": "npm install -g @anthropic-ai/claude-code",

  "remoteUser": "node"
}

ポイント: type=bind でローカルの ~/.claude を直接マウント。設定や履歴がローカルと共有されます。

クライアント用(隔離されたボリュームを使う)

{
  "name": "Client A Project",
  "image": "mcr.microsoft.com/devcontainers/javascript-node:22", // 適宜変更

  "mounts": [
    "source=claude-client-a,target=/home/node/.claude,type=volume",
    "source=${localEnv:HOME}/.gitconfig,target=/home/node/.gitconfig,type=bind,consistency=cached"
  ],

  "postCreateCommand": "sudo chown -R node:node /home/node/.claude && npm install -g @anthropic-ai/claude-code",

  "remoteUser": "node"
}

ポイント: type=volume で Docker 管理の隔離されたボリュームを使用。ローカルの ~/.claude にはアクセスできません。ボリューム名(claude-client-a)をクライアントごとに変更します。

ステップ 3: 起動

VS Code の場合:
コマンドパレット → 「Dev Containers: Reopen in Container」

CLI の場合:

devcontainer up --workspace-folder .
devcontainer exec --workspace-folder . zsh
claude

初回起動時に Claude Code にログインすると、認証情報がボリュームに保存されます。

ステップ 4: 別のクライアントを追加

新しいクライアントのプロジェクトでは、ボリューム名を変更するだけです。

{
  "mounts": [
    "source=claude-client-b,target=/home/node/.claude,type=volume"
  ]
}

Docker Compose を使う場合

node_modules のパフォーマンス最適化などで Docker Compose を使いたい場合、構文が少し異なります。

個人プロジェクト用(compose.yaml)

volumes:
  node_modules:

services:
  app:
    image: mcr.microsoft.com/devcontainers/typescript-node:20
    volumes:
      - ..:/workspaces/my-project:cached
      - node_modules:/workspaces/my-project/node_modules
      - ${HOME}/.claude:/home/node/.claude           # bind mount
      - ${HOME}/.gitconfig:/home/node/.gitconfig:ro
    tty: true
    stdin_open: true

クライアント用(compose.yaml)

volumes:
  node_modules:
  claude-client-a:

services:
  app:
    image: mcr.microsoft.com/devcontainers/typescript-node:20
    volumes:
      - ..:/workspaces/client-project:cached
      - node_modules:/workspaces/client-project/node_modules
      - claude-client-a:/home/node/.claude           # Docker volume
      - ${HOME}/.gitconfig:/home/node/.gitconfig:ro
    tty: true
    stdin_open: true

構文の違い

設定ファイル 環境変数
devcontainer.json ${localEnv:HOME}
compose.yaml ${HOME}

セキュリティ設定

.claude/settings.json で Claude Code のアクセス権限を制御できます(Dev Container の有無に関わらず使える機能です)。

{
  "permissions": {
    "deny": [
      "Read(./.env*)",
      "Read(./secrets/**)",
      "Read(~/.ssh/**)",
      "Read(~/.aws/**)",
      "Bash(curl:*)",
      "Bash(wget:*)",
      "Bash(git push:--force)"
    ],
    "ask": [
      "Bash(git:*)",
      "Bash(yarn:add*)",
      "Bash(rm:*)"
    ]
  }
}
  • deny: 完全にブロック(確認なしで拒否)
  • ask: 実行前に確認が入る

日常的な使い方

複数クライアントでの並行作業

# クライアント A で作業
cd ~/projects/client-a
devcontainer exec --workspace-folder . zsh
claude

# クライアント B で作業(別ターミナル)
cd ~/projects/client-b
devcontainer exec --workspace-folder . zsh
claude

両方のコンテナが同時に動作しても、互いに干渉しません。

ボリューム管理

# 全てのクライアント用ボリュームを確認
docker volume ls | grep claude-client

# 認証情報をリセットしたい場合
docker volume rm claude-client-a

既知の注意点

Dev Container 環境で Claude Code を使う際に、いくつかの制限があります。

VS Code 拡張機能でグローバルコマンドが認識されない

2025/12/05 時点で、ローカルの ~/.claude/commands/ に定義したカスタムスラッシュコマンドは、CLI では使えますが、VS Code 拡張機能では認識されません。

# CLI(ターミナル)では動作する
claude
> /your:custom-command  # ✅ 使える

# VS Code 拡張機能では動作しない
> /your:custom-command  # ❌ 認識されない

これは Claude Code の既知の問題として報告されています。

回避策:

  1. VS Code の設定で claudeCode.useTerminal を true にする - ターミナルベースで動作するため、この問題が発生しません
  2. Dev Container 内で CLI (claude コマンド) を直接使用する
  3. プロジェクトローカルの .claude/commands/ にコマンドを配置する

ただし、起動がちょっと遅いのが難点です。

Skills と Commands の混同

VS Code 拡張機能では、.claude/skills/ に配置した Skills が / のオートコンプリートにスラッシュコマンドとして表示されることがあります。これは Skills と Commands の境界が曖昧な設計上の問題です。

まとめ

  • 完全な隔離: クライアント間で情報が混ざることが技術的に不可能
  • セキュリティ: 環境変数や SSH キーを Claude から保護
  • 監査証跡: どのプロジェクトでどのアカウントを使ったか明確
  • ログイン切り替え不要: コンテナを切り替えるだけでアカウントも自動切り替え

VS Code の Dev Containers 拡張機能か Dev Container CLI を使って、安全にクライアントワークを進めましょう。

GitHubで編集を提案

Discussion