🐳

Docker開発、編集はどこでする?VSCodeの「ローカル編集」と「Dev Containers」を徹底比較

に公開

はじめに:Docker開発の「2つのVSCode画面」問題

Dockerとdocker-compose.ymlを学び、volumesを設定し、docker-compose upでコンテナが起動した!さあ開発するぞ、と思った矢先、こんな混乱に陥りませんか?

  • 画面A: いつものVSCode。ターミナルはMacのzsh(%)
  • 画面B: VSCodeのReopen in Containerで開いた「新画面」。ターミナルはコンテナのsh(/app#)

「あれ、どっちで編集すればいいの? claude(AI拡張機能)やgitはどこにインストールすれば? volumesで同期してるならReopen in Containerって意味なくない?」

筆者もまさにこの点で混乱しましたが、この2つのスタイルの違いを理解することで、Docker開発の全体像がクリアになりました。

この記事では、この2つの開発スタイル(流派)の違いを解説します。

結論:2つの開発スタイル(流派)がある

docker-compose upでコンテナを起動した後、VSCodeで開発するには、大きく分けて2つの流派があります。

  • スタイルA:ホストで編集・管理し、コンテナで実行する(最もシンプル)
  • スタイルB:すべてをコンテナ内で完結させる(Dev Containers)

volumesによる同期は、どちらのスタイルでも(ほぼ)使いますが、その「目的」が少し異なります。

スタイルA:ホストで編集、コンテナで実行

これは、設定が最もシンプルで直感的なスタイルです。

やること:

  • **画面A(ホスト/Mac側)**のVSCodeでコードを編集します。
  • docker-compose upは、Macのターミナル(または画面Aのzshターミナル)で実行します。
  • volumes(./:/app)が、Mac側での編集をコンテナに自動で同期してくれます。

役割分担

このスタイルでは、「編集・管理」と「実行」を明確に分離します。

ホストOS (あなたのMac)

  • 役割: 編集とバージョン管理
  • ツール: VSCode, claude拡張機能, gitコマンド

あなたはMacにインストールされたgitやclaudeを使い、使い慣れたVSCodeでコードを編集・コミットします。

Dockerコンテナ (Linux)

  • 役割: 実行
  • ツール: npm run dev(Node.jsサーバ)

コンテナは、DockerfileのRUN npm ciで作られたコンテナ専用のnode_modulesを使い、コードを実行することに専念します。

メリットとデメリット

メリット:

  • 設定がdocker-compose.ymlのvolumesだけで済むため、とにかく楽。
  • 使い慣れたMacのツール(git, AI拡張機能)をそのまま使える。

デメリット(落とし穴):

  • 「環境のズレ」が起きる可能性がある。
    • 例:VSCode(Mac側)が参照するnodeのバージョンと、コンテナが実行するnodeのバージョンが異なると、Mac上ではエラーが出ないのにコンテナで実行するとエラーになる、といった問題が起こり得る

スタイルB:すべてをコンテナで完結(Dev Containers)

これは、スタイルAの「環境のズレ」というデメリットを完全に解消するための、より高度で厳密なスタイルです。

やること:

  • VSCodeのReopen in Containerで**画面B(コンテナ側)**を開きます。
  • 今後は、画面A(Mac側)のVSCodeは使わず、この画面Bだけで開発・実行・管理の全てを行います。

魔法の鍵:.devcontainer/devcontainer.json

このスタイルでは、volumesに加えてdevcontainer.jsonという「開発環境の構築マニュアル」が中心的な役割を果たします。

あなたが「画面B(コンテナ側)」でgitやclaudeを使いたい場合、devcontainer.jsonに**「コンテナを準備するとき、ついでにgitとclaude拡張機能もインストールしておいてね」**と書き込んでおく必要があります。

Discussion