世界を動かす技術を、日本語で。

Docker内でのClaude CodeおよびVSCodeへの切り替え

概要

  • Claude CodeをDockerとVSCode Dev Containerで運用する方法の紹介
  • 旧AIコーディング環境からの移行理由と利点の整理
  • セキュリティとコスト面の現実的な選択
  • 導入手順とGitHub連携の実践的ガイド
  • リスク低減策と今後の改善案への言及

Claude CodeをDocker+VSCode Dev Containerで使う理由

  • 従来環境 :ChatGPT PlusとCursor Proの併用、月額合計40ドルのサブスクリプション
  • 不満点
    • コスト の割に利用頻度が低い
    • Cursorのレスポンス遅延 とリクエスト制限の変更
    • セキュリティリスク :AIエージェントがローカル環境全体へアクセス可能な点
  • Claude Codeへ移行 の決断理由
    • 月額20ドルでコスト削減
    • Webチャット体験 も良好
    • トークン消費の明確化 と適度な利用制限
    • CLIやVSCode連携による快適な開発体験
  • セキュリティ対策 としてのDocker利用
    • コンテナ内にClaude Codeを閉じ込めることで ローカル資産の保護
    • プロジェクト単位での アクセス制限 が可能

Claude CodeをDocker+VSCodeでセットアップする手順

  • 前提条件
    • DockerVSCode がインストール済み
    • Claude有料プラン契約
    • GitHubアカウントの利用(基本セットアップには不要)
  • セットアップ手順
    • プロジェクト用のルートフォルダを作成
    • その中に .devcontainer フォルダを作成
    • devcontainer.json ファイルを配置(GitHubリポジトリをクローン推奨)
      • git clone https://github.com/tim-sha256/claude-in-docker.git
    • VSCodeでルートフォルダを開き、「 Reopen in Container」を選択
    • ターミナルでclaudeコマンドが動作するか確認

GitHub連携とセキュリティ強化

  • SSHキーの代替策 として Fine-Grained Personal Access Token を利用
    • 最小限の権限 (RepositoryのContents: Read and writeのみ)でトークン発行
      • https://github.com/settings/personal-access-tokens/new で作成
    • クローンpush/pull 時にトークンを使って認証
      • git clone https://<USERNAME>:<TOKEN>@github.com/<USERNAME>/<REPO-NAME>.git
      • git remote set-url origin https://<USERNAME>:<TOKEN>@github.com/<USERNAME>/<REPO-NAME>.git
  • Claude Code からGitHubアカウントへの不正操作リスクを大幅低減

まとめと今後

  • この構成 は多くの一般ユーザーにとって 十分実用的で安全
  • より良い方法や改善案があれば コメントやメール で情報提供を歓迎
  • コスト・セキュリティ・利便性 のバランスを重視した現実的なAIコーディング環境の提案

連絡先 :hello@timsh.org(ご意見・ご感想歓迎)

Hackerたちの意見

VSCodeが嫌いな人(私みたいに)には、オープンソースでMicrosoftが作った公式のdevcontainer CLI [0]を使うと、同じことができるよ。これ、VSCodeが裏で使ってるやつなんだ。自動ポートフォワーディングはできないから、SSHエージェントフォワーディングも含めて、devcontainerにSSHをインストールするか、他のツールを使う必要があるかも。ポートフォワーディング用のツール [1]を作ったんだけど、VSCodeみたいに魔法みたいにはしたいけど、今のところ自分の目的には合ってるから、あんまり手をかけてないんだ。これを使えば、devserverにSSH接続して、devcontainer CLIを使ってiTerm2のTmux統合でtmuxセッションを開けるから、まるでローカルのウィンドウみたいに感じるよ。NeovideとリモートNeovimを同じチャンネルで組み合わせれば、近くのデータセンターにあるリモートdevcontainerでネイティブな感じの開発環境ができるんだ。[0] https://github.com/devcontainers/cli [1] https://gitlab.com/CGamesPlay/qtm

ありがとう!

devpodはこれにとても良いよね。https://devpod.sh/

コマンドにはCLIが好きだけど、雰囲気を楽しむためにはエージェントチャットインターフェースで作業したいな。残念ながら、これにどんどん依存してきてるけど、大きなプロジェクトでトラブルになったこともある。ローカルには多くの環境があって、いくつかは他の環境に依存してるし、ローカルデータベースが必要なものもある。プロダクションではコンテナを使ってるけど、ローカルではいつもそうじゃない。完全に隔離された開発環境を設定するのはほぼ地獄だよ。将来的にClaudeが俺の開発セットアップをk8sで隔離されたものに変換してくれるかもしれないけど、アプリやサービスをすべてローカルで動かす力はない。開発環境をクラウドに設定する必要があるけど、それに払うお金が足りないし、状況によってはローカルで動かさなきゃいけないものもあるから、うまくいかない。だから、Cursor AIをいろんなMCPサーバーと一緒に動かして、ツールの呼び出しを承認してるけど、隔離はしてないし、これがいつか痛い目に合うって分かってる。

サーバーにSSHで入って、devcontainer CLIツールを使ってdevコンテナ内でシェルを開いてる。コンテナごとにSSHをインストールするより、こっちの方が楽だし、コンテナがたくさんあるときは特にね。プロセスを助けるためにシンプルなコマンドラインツールを作ったから、長いコマンドを打たなくて済むんだ。それを実行すると、動いているdevコンテナがリストされて、各コンテナに番号を付けるから、フルIDを使わなくてもいい。

これありがとう。こんなのが出てたなんて知らなかったよ。

VSCodeが嫌いな人(私みたいに)は、VSCodeを嫌う理由は何?

Claude Codeをコンテナで動かすのが楽しいよ。私にとって一番の利点はセキュリティじゃなくて、バックグラウンドでエージェントを簡単に立ち上げられることなんだ。作業ディレクトリをコンテナにコピーして、Claude Codeを呼び出すシンプルなスクリプトを使ってるんだけど、その後はローカルにプランニングドキュメントを保存するか、GitHubでプルリクエストを開いてレビューするだけ。アイデアが浮かんだときにエージェントを立ち上げるのがすごくスムーズだから、結果を簡単に捨ててやり直せるのが気に入ってる。Maxプランのおかげで、このプロセス全体のコストを心配しなくて済むのもいいね。最初は慎重にコンテナを設定してたけど、正直言って、Claude Codeがgitで簡単に元に戻せないことをしたのを見たことがないから、もうあんまり心配してないよ。

スクリプトを共有する興味はある?

ローカルでも、複数のターミナルタブやウィンドウでClaudeが異なるタスクを並行してこなせるよ。

複数のgitワークツリーを設定するのも試した?それで大体の問題が解決するんじゃないかな。

こうして、機械は人間に対して無害であることへの信頼を築くことができた。これが最終的には有利になることが分かるんだよね。

もっとAIに関することはコンテナファーストで考えてほしいな。エージェントやバイブコーディングに関する議論やデモでこれがほとんど欠けてるのは、大きな赤信号だと思う。コードをYOLOするなら、少なくとも開発やテストのハーネスにはちょっと注意を払うべきじゃない? セキュリティに関心がなくても、再現性について考える価値はあるよね。みんながプロセスやツールを簡単に共有できれば、バイブコーディングの効果についてそんなに議論しなくても済むのに。ファイルシステムのサンドボックスや秘密(SSHキーなど)の漏洩が心配じゃないとしても、gitでのバージョン管理が十分な元に戻すボタンだとしても、毎回小さな実験のために新しい言語スタックや変な依存関係でシステムを混雑させたくないよね。新しいホットなものを使った実験はほとんど失敗するから、たくさんやる覚悟が必要だと思う。

コンテナには独自の問題があるよね。このスレッドでもいくつか例が挙がってるけど、主にホストOSとの通信に関すること。俺は、vibe coding(エージェンティックエンジニアリング)の再現可能な部分はテキストファイルだけだと思う。多くの人が、ワークフローにウェブアプリ(AIスタジオ)、Macアプリ(Wispr Flow)、他のUIツール(repo prompt)を混ぜて使ってるから、コンテナに入れられないものも多いしね。セキュリティが必要なら、コンテナだけじゃ足りないよ。VMを使う必要がある。でも、Claude CodeにGitHubリポジトリへのアクセスを与えたら、他に何を守る必要があるの?キーチェーンやsudoで守られてるもの以外に。

コンテナはエージェントにすごく合ってるみたいだね。並行して動かせるから! sudoを与えると、デスクトップではやりたくないような面白いこともできるし、例えばツールをインストールしたりtcpdumpでデバッグしたりね。(今、エージェントをコンテナで動かすためのプロジェクトを進めてるよ:sketch.dev)

そこで止まる必要はないよ。Claude Codeには、好きな環境で、好きなモデルを使って、あなたが定義した経済的な取り決めの下で動かせる素晴らしいオープンな代替手段もあるんだ。いくつかは https://oss-ai-swe.org/ で見てみて。今のところのお気に入りはOpenHandsとCodex CLIだよ。

それってトークンあたりのコストがめっちゃ高くない?

実は似たようなものを作ってるんだけど、Dockerの代わりにAppleの組み込みコンテナサポートを使って、シェルコマンドやコードをOSレベルで隔離して実行してるんだ。めっちゃ速いし(ミリ秒で立ち上がる)、Claude CodeやGemini CLIともいい感じに統合できる。これをCodeRunnerとしてオープンソースにしたよ。みんなの意見を聞きたいし、どう比較されるか話したいな。1. Appleコンテナ: https://github.com/apple/container 2. CodeRunner: https://github.com/BandarLabs/coderunner 注意: これを動かすにはM1/M2/M3/M4のMacが必要だよ。MacOS 26はオプションだけど、推奨。

今日は、既存のDockerファイルを使ってコンテナコマンドを実行できるってことを知ったよ。

だからこそ、Claude CodeよりもchatGPT codexを使ってるんだ(CCの方が良いかもしれないけど)。各チャットはそれぞれのクラウドベースのコンテナで動いてるから、秘密を漏らしたり、ファイルを削除したり、環境を壊したりするリスクがない。ローカルでコードを書き続けながら、3つを並行して動かせるのがいいね。ブランチで動いて、PRを通じて統合できる。素晴らしいDevExだ。誰か、これをローカルでできるようにハイパーバイザーフレームワークを使ったいいmacOSアプリを作ってくれ! :)

正直な質問なんだけど、なんでみんなDockerの中でコードを書くのを好むの?デプロイメントユニットとしてのDockerの利点は分かるけど、開発用コンテナを設定して使うのって、結局面倒じゃない?

依存関係の分離と、コンテナ同士を簡単に接続できるところだね。

.devcontainer.jsonと関連ファイルをコミットすれば、チーム全体が一貫したローカル感のある環境を無料で手に入れられるよ。コンテナ化は「私のマシンでは動く」っていうローカルと本番のギャップを解決したんだ。これはDev 1とDev 2の間の同じギャップを解決してるだけなんだよね。

個人的には、自分のマシンでnpmやpip、gradleなどを動かすのは信頼できないんだ。コンテナやVMの中で動かす方が安全に感じる。JetBrainsのような一部のIDEはリモート開発をサポートしてるけど、完璧じゃないけど、自分のマシンを危険にさらすよりはマシだよ。

もし私みたいに、クリーンな開発環境を維持したいなら、作業をする時にマシンが邪魔になってほしくないんだ。知らないところで何かが邪魔をするのは避けたいし、年を取るにつれて記憶もあまり良くなくなってきて、こういうことが大事になってくるんだよね。

ホストOSがLinuxじゃない(たいていはWindowsかmacOS)場合、「コンテナで実行する」ってのは「正しいOSで実行する」って意味になるね。

この設定はGitHub CodeSpacesとも互換性があって、Chromebookみたいなデバイスを使ってるなら、すごくいい開発体験だと思う。ローカルネットワークからも隔離されるし、開発モードでアプリを誰かに共有してフィードバックをもらうのも簡単。ネットワークに穴を開ける必要もないしね。それに、この環境ではCline拡張を使えば、カーソルスタイルのコパイロット的な体験もできるよ。

自宅のフォルダにClaude Codeを放つのはちょっと気が引けるな。別のユーザーアカウントを使えば解決するかな?例えば、/home/claudeにgitリポジトリを置いて、そのユーザーとしてClaudeを実行するって感じ?それとも何か見落としてる?