VSCodeからDockerコンテナへ接続する方法

採用はこちら

VSCodeからDockerコンテナへ接続すると、コンテナ内に構築したLinux環境やNode.js、Python、PHP、C++などの開発環境を、VSCode上から利用できます。

代表的な方法は、Microsoftが提供している「Dev Containers」拡張機能を使用する方法です。

Dev Containersを利用すると、コンテナ内のファイル編集だけでなく、ターミナル操作、IntelliSense、デバッグ、VSCode拡張機能、ポート転送などを利用できます。

単にコンテナ内部のシェルへ入るだけではなく、DockerコンテナをVSCodeの開発環境として利用できる点が特徴です。

目次

VSCodeからDockerコンテナへ接続する仕組み

Dev Containersを使用する場合、VSCodeの画面そのものは基本的にホストOS上で動作します。

一方、コンテナ内にはVS Code Serverが配置され、VSCodeからDocker経由で接続します。

イメージとしては、次のような構成です。

ホストOS
│
├─ VSCode
│
└─ Docker
     │
     ▼
Dockerコンテナ
├─ VS Code Server
├─ Node.js
├─ Python
├─ PHP
├─ GCC
├─ Git
└─ その他の開発ツール

そのため、VSCodeの操作画面はローカルPC上にありながら、ターミナルやデバッグ、言語サーバーなどはコンテナ側の環境を利用できます。

VSCodeからDockerへ接続するために必要なもの

Dockerコンテナへ接続するには、基本的に次の環境を用意します。

Docker
VSCode
Dev Containers拡張機能

WindowsやmacOSではDocker Desktopを利用する方法が一般的です。

LinuxではDocker Engineを利用できます。

Dockerが利用できるか確認する

まず、ターミナルやPowerShellからDockerが利用できるか確認します。

docker --version

Dockerが正しくインストールされていれば、バージョン情報が表示されます。

続いて、次のコマンドを実行します。

docker ps

Dockerデーモンへ接続できれば、現在実行中のコンテナ一覧が表示されます。

Docker Desktopを利用している場合は、Docker Desktop自体が起動していることも確認してください。

Dev Containers拡張機能をインストールする

VSCodeを起動し、拡張機能画面を開きます。

WindowsやLinuxでは、次のショートカットを使用できます。

Ctrl + Shift + X

macOSでは、VSCodeの拡張機能画面から同様に検索できます。

検索欄に次のように入力します。

Dev Containers

Microsoftが提供している「Dev Containers」をインストールします。

起動済みDockerコンテナへ接続する方法

すでに起動しているDockerコンテナへ接続する場合は、「Attach to Running Container」を利用します。

Dockerコンテナを確認する

まず、現在起動しているコンテナを確認します。

docker ps

例えば、次のようなコンテナが起動しているとします。

CONTAINER ID IMAGE STATUS NAMES
abc123def456 ubuntu:24.04 Up 5 minutes my-container

この場合、my-containerへVSCodeから接続できます。

コマンドパレットから接続する

VSCodeでコマンドパレットを開きます。

WindowsやLinuxでは、次のショートカットです。

Ctrl + Shift + P

macOSでは次のショートカットです。

Command + Shift + P

コマンドパレットに次のように入力します。

Dev Containers: Attach to Running Container...

表示されたコンテナ一覧から、接続したいコンテナを選択します。

すると、新しいVSCodeウィンドウが開き、対象コンテナへ接続されます。

Remote ExplorerからDockerコンテナへ接続する方法

コマンドパレットだけでなく、Remote ExplorerからもDockerコンテナへ接続できます。

VSCodeのActivity BarからRemote Explorerを開きます。

コンテナ一覧を表示し、対象のコンテナから「Attach to Container」を選択します。

頻繁に複数のコンテナを扱う場合は、Remote Explorerから操作するほうが分かりやすいこともあります。

Dockerコンテナ内のフォルダを開く

コンテナへ接続した直後は、作業対象のフォルダが開かれていない場合があります。

その場合は、VSCodeの「File」から「Open Folder」を選択します。

例えば、アプリケーションが次のディレクトリにある場合は、そこを開きます。

/app

または、開発環境によっては次のようなパスを使用します。

/workspace

Docker Composeで次のように設定している場合を考えてみます。

services:
  app:
    volumes:
      - .:/workspace

この場合、ホスト側のプロジェクトディレクトリが、コンテナ内の/workspaceへマウントされます。

VSCodeから/workspaceを開けば、ホスト側のソースコードをコンテナ環境で編集できます。

Dockerコンテナへ接続できる簡単な例

Ubuntuコンテナを作成して、VSCodeから接続してみます。

次のコマンドを実行します。

docker run -dit --name vscode-test ubuntu:24.04 bash

主なオプションの意味は次のとおりです。

-d
バックグラウンドで実行

-i
標準入力を維持

-t
仮想端末を割り当て

--name
コンテナ名を指定

起動状態を確認します。

docker ps

vscode-testが表示されたら、VSCodeから次の順番で操作します。

Ctrl + Shift + P
↓
Dev Containers: Attach to Running Container...
↓
vscode-test

これでUbuntuコンテナへ接続できます。

VSCodeからDockerコンテナ内のターミナルを利用する

Dockerコンテナへ接続した状態でVSCodeの統合ターミナルを開くと、コンテナ内でコマンドを実行できます。

WindowsやLinuxでは、次のショートカットでターミナルを開けます。

Ctrl + `

例えば、次のコマンドを実行します。

pwd

コンテナ内の現在位置が表示されます。

また、次のようなコマンドも実行できます。

ls
cat /etc/os-release

Ubuntuコンテナであれば、Ubuntuに関する情報が表示されます。

docker execとの違い

Dockerでは、次のコマンドでもコンテナ内部へ入れます。

docker exec -it コンテナ名 bash

ターミナル操作だけを見ると、Dev Containersによる接続と似ています。

ただし、Dev Containersではターミナル以外にも、ファイル編集、IntelliSense、デバッグ、VSCode拡張機能、ポート転送などを利用できます。

そのため、単にコンテナ内部のシェルを操作するだけならdocker exec、本格的にVSCodeから開発するならDev Containersと考えると分かりやすいです。

devcontainer.jsonを使って開発環境を構築する

本格的にDockerを開発環境として利用する場合は、devcontainer.jsonを使用する方法があります。

プロジェクト内に次のようなディレクトリを作成します。

project
├─ .devcontainer
│ └─ devcontainer.json
├─ src
└─ package.json

devcontainer.jsonには、VSCodeから利用する開発コンテナの設定を記述できます。

例えば、次のような内容です。

{
  "name": "Node Development",
  "image": "mcr.microsoft.com/devcontainers/javascript-node:1-22-bookworm",
  "forwardPorts": [3000],
  "customizations": {
    "vscode": {
      "extensions": [
        "dbaeumer.vscode-eslint"
      ]
    }
  }
}

devcontainer.jsonで設定できる主な内容

devcontainer.jsonでは、次のような内容を指定できます。

使用するDockerイメージ
使用するDockerfile
VSCodeが接続するサービス
ワークスペースのパス
ポート転送
VSCode拡張機能
接続ユーザー
環境変数
コンテナ作成後に実行するコマンド

開発環境の設定をファイルとして管理できるため、チーム開発との相性がよい方法です。

devcontainer.jsonからコンテナを開く方法

devcontainer.jsonを作成したら、VSCodeでプロジェクトを開きます。

その後、コマンドパレットから次のコマンドを実行します。

Dev Containers: Reopen in Container

VSCodeが設定内容を読み取り、必要に応じてDockerイメージを取得したり、コンテナをビルドしたりします。

処理が完了すると、プロジェクトがコンテナ環境で開かれます。

DockerfileをDev Containersで利用する

独自の開発環境を構築したい場合は、Dockerfileを利用できます。

例えば、次のような構成にします。

project
├─ .devcontainer
│ ├─ devcontainer.json
│ └─ Dockerfile
└─ src

Dockerfileの例は次のとおりです。

FROM node:22-bookworm

WORKDIR /workspace

RUN apt-get update \
    && apt-get install -y git curl \
    && rm -rf /var/lib/apt/lists/*

devcontainer.jsonでは、次のようにDockerfileを指定します。

{
  "name": "My Development Container",
  "build": {
    "dockerfile": "Dockerfile"
  }
}

これにより、Dockerfileで作成したイメージをDev Containersの開発環境として利用できます。

DockerfileとpostCreateCommandの違い

開発環境の初期化では、DockerfileとpostCreateCommandのどちらを使うべきか迷うことがあります。

Dockerfileに向いている処理

Dockerfileには、イメージそのものへ含めたい処理を記述します。

例えば、次のような内容です。

OSパッケージのインストール
Gitのインストール
Node.jsやPythonの導入
ビルドツールの導入

postCreateCommandに向いている処理

postCreateCommandは、開発コンテナが作成された後に実行したい処理に向いています。

例えば、次のように設定できます。

{
  "postCreateCommand": "npm install"
}

プロジェクトファイルを使用する依存関係のインストールなどでは、postCreateCommandのほうが適している場合があります。

Docker ComposeとDev Containersを組み合わせる

Web開発では、複数のコンテナをDocker Composeで管理することもあります。

例えば、次のような構成です。

Webアプリ
PostgreSQL
Redis
Nginx

Docker Composeの例は次のとおりです。

services:
  app:
    build: .
    volumes:
      - .:/workspace

  db:
    image: postgres:17
    environment:
      POSTGRES_PASSWORD: password

Dev Containersでは、どのComposeサービスへVSCodeを接続するのかを指定できます。

{
  "name": "Docker Compose Development",
  "dockerComposeFile": "../compose.yaml",
  "service": "app",
  "workspaceFolder": "/workspace"
}

この場合、appサービスへVSCodeが接続します。

イメージすると次のようになります。

Docker Compose

├─ app
│ └─ VSCodeが接続
│
└─ db

Docker Composeは事前に起動する必要があるのか

Attach to Running Containerを使用する場合は、対象コンテナが起動済みである必要があります。

一方、devcontainer.jsonからDocker Composeを利用する場合は、必ずしも事前にdocker compose upを実行する必要はありません。

Dev Containers側から必要なサービスを起動して開発環境を構築できます。

そのため、次のように整理できます。

Attach to Running Container
→ 起動済みコンテナへ接続

Reopen in Container
→ Dev Containers側から開発環境を作成・起動可能

forwardPortsとDocker Composeのportsの違い

Dev Containersでは、次のようにforwardPortsを指定できます。

{
  "forwardPorts": [3000]
}

これは、コンテナ内の3000番ポートをVSCode経由でローカル側へ転送する設定です。

一方、Docker Composeでは次のように記述できます。

ports:
  - "3000:3000"

これはDocker自身がコンテナのポートをホストへ公開する設定です。

両者は似ていますが、仕組みは異なります。

forwardPorts

Dev Containersによるポート転送です。

Dockerコンテナ
3000番ポート
↓
VSCode
↓
ローカルPC

ports

Dockerによるポート公開です。

Dockerコンテナ
3000番ポート
↓
Docker
↓
ホストPCの3000番ポート

必ずしも両方を設定する必要はありません。

Dev Containers中心で開発する場合はforwardPortsだけで十分なケースもあります。

ブラウザからコンテナ内のWebアプリへアクセスする

例えば、コンテナ内で次のコマンドを実行したとします。

npm run dev

アプリケーションが3000番ポートで起動している場合、forwardPortsで次のように指定できます。

{
  "forwardPorts": [3000]
}

通常は、ブラウザから次のようなURLへアクセスできます。

http://localhost:3000

ただし、ローカル側ですでに3000番ポートが使用されている場合などは、別のポート番号へ転送されることがあります。

実際の転送先ポートは、VSCodeの「PORTS」ビューで確認できます。

workspaceFolderを設定する

コンテナ接続時に、VSCodeで最初に開くディレクトリを指定できます。

例えば、次のように記述します。

{
  "workspaceFolder": "/workspace"
}

Docker Compose側で次のように設定している場合、相性のよい構成になります。

volumes:
  - .:/workspace

この場合、ホスト側のプロジェクトディレクトリと、コンテナ内の/workspaceが対応します。

コンテナ内で使用するユーザーを指定する

Dev Containersでは、remoteUserを指定できます。

例えば、次のように記述します。

{
  "remoteUser": "vscode"
}

remoteUserは主に、VSCodeやターミナル、タスク、デバッグなどがコンテナ内でどのユーザーとして動作するかを指定する設定です。

Dockerコンテナ自体の実行ユーザーを変更する設定とは必ずしも同じではありません。

ファイル所有者や権限問題を避けるために、開発環境では非rootユーザーを利用する設計が適している場合があります。

remoteEnvで環境変数を設定する

Dev Containersでは、VSCode側のプロセスに環境変数を設定できます。

例えば、次のように記述します。

{
  "remoteEnv": {
    "NODE_ENV": "development"
  }
}

remoteEnvは、主にVSCodeやVSCodeから起動されるプロセスへ適用される環境変数です。

Dockerコンテナ全体に設定される環境変数とは役割が異なります。

postAttachCommandを利用する

コンテナへ接続した後にコマンドを実行したい場合は、postAttachCommandを利用できます。

{
  "postAttachCommand": "echo connected"
}

VSCodeがコンテナへ接続するたびに実行したい処理に向いています。

ただし、依存関係のインストールのように毎回実行する必要がない処理では、postCreateCommandのほうが適している場合があります。

AttachとReopen in Containerの違い

「Attach to Running Container」と「Reopen in Container」は用途が異なります。

Attach to Running Container

Attach to Running Containerは、すでに起動しているDockerコンテナへVSCodeを接続する方法です。

docker run
↓
コンテナ起動
↓
VSCodeからAttach

一時的にコンテナ内を調査したい場合や、すでに動いている環境を利用したい場合に向いています。

なお、Attachの場合でも、Attached Container Configurationを利用して、ワークスペースやポート、ユーザーなどの設定を保存できます。

Reopen in Container

Reopen in Containerは、プロジェクト内のdevcontainer.jsonを使用して開発環境を構築する方法です。

プロジェクト
│
├─ ソースコード
│
└─ .devcontainer
    └─ devcontainer.json
          ↓
開発コンテナ作成
          ↓
VSCodeから接続

チーム開発や、再現可能な開発環境を構築したい場合に向いています。

VSCodeからDockerコンテナへ接続できない場合の対処法

Dockerコンテナへ接続できない場合は、順番に原因を確認します。

Dockerが起動しているか確認する

次のコマンドを実行します。

docker ps

Dockerデーモンへ接続できない場合は、Docker DesktopやDocker Engineの起動状態を確認します。

コンテナが起動しているか確認する

実行中コンテナを確認します。

docker ps

停止中コンテナも含めて確認する場合は、次のコマンドを使用します。

docker ps -a

停止しているコンテナは、次のように起動できます。

docker start コンテナ名

Dev Containersが有効になっているか確認する

VSCodeの拡張機能画面から「Dev Containers」がインストールされ、有効になっているか確認します。

LinuxでDockerの権限エラーが発生する場合

Linuxでは、一般ユーザーからDockerを実行した際に権限エラーが発生する場合があります。

Dockerグループへユーザーを追加する方法として、次のコマンドがあります。

sudo usermod -aG docker $USER

設定反映には、ログアウト・ログインなどが必要になる場合があります。

ただし、Dockerグループへ所属すると、実質的にroot相当の強い操作権限を持つことになります。

共有サーバーやセキュリティ要件の高い環境では、安易に追加せず、運用ポリシーを確認することが重要です。

必要に応じてDocker Rootless Modeを検討する方法もあります。

WindowsとWSL 2を使用する場合の注意点

WindowsでDocker DesktopとWSL 2を利用している場合は、Docker Desktop側の設定も確認します。

主に次の項目です。

Use the WSL 2 based engine

また、Docker Desktopの設定から対象のLinuxディストリビューションに対するWSL Integrationが有効になっているか確認します。

WSL内のプロジェクトをDockerとVSCodeで扱う場合は、この設定が原因で接続できないことがあります。

Alpine Linuxを使用する場合の注意点

Alpine LinuxベースのコンテナにもDev Containersから接続できます。

ただし、一部のVSCode拡張機能はネイティブライブラリとしてglibcを必要とすることがあります。

Alpine Linuxは一般的にmusl libcを使用するため、そのような拡張機能が正常に動作しない場合があります。

問題が発生した場合は、Debian系やUbuntu系のイメージを検討すると解決する場合があります。

ただし、Alpine LinuxそのものがDev Containersで利用できないという意味ではありません。

VSCodeとDockerを組み合わせるメリット

VSCodeとDockerを組み合わせる最大のメリットは、開発環境を統一しやすいことです。

例えば、チーム全員で次の環境を共有できます。

Node.jsのバージョン
Pythonのバージョン
Linuxディストリビューション
VSCode拡張機能
OSパッケージ
ポート設定

ホストPCへ大量の開発ツールを直接インストールする必要も減らせます。

また、プロジェクトごとに開発環境を分離できます。

案件A
→ Node.js環境

案件B
→ Python環境

案件C
→ PHP環境

それぞれを別のDev Containerとして管理すれば、バージョン競合や環境差によるトラブルを減らせます。

VSCodeからDockerコンテナへ接続する方法の使い分け

用途ごとに整理すると、次のようになります。

すでに動いているコンテナを操作したい場合

Dev Containers: Attach to Running Container...

を使用します。

既存コンテナの確認やデバッグ、簡単な開発に向いています。

プロジェクト専用の開発環境を構築したい場合

.devcontainer/devcontainer.json

を作成し、

Dev Containers: Reopen in Container

を使用します。

開発環境を再現可能な形で管理できるため、継続的な開発やチーム開発に向いています。

複数サービスを利用する場合

Docker Composeとdevcontainer.jsonを組み合わせます。

app
db
Redis
Nginx

など複数のコンテナを起動しながら、VSCodeはappコンテナだけに接続するといった構成が可能です。

まとめ

VSCodeからDockerコンテナへ接続する代表的な方法は、MicrosoftのDev Containers拡張機能を利用する方法です。

すでに起動しているコンテナへ接続する場合は、次のコマンドを使用します。

Dev Containers: Attach to Running Container...

一方、プロジェクト単位で開発環境を管理したい場合は、devcontainer.jsonを作成して次のコマンドを利用します。

Dev Containers: Reopen in Container

基本的には、次のように使い分けると分かりやすいです。

既存コンテナへ一時的に接続
→ Attach to Running Container

プロジェクトの開発環境をDockerで管理
→ devcontainer.json

WebアプリやDBなど複数サービスを利用
→ Docker Compose + devcontainer.json

VSCodeとDockerを組み合わせることで、開発環境をコンテナ単位で統一でき、PCごとの環境差やライブラリのバージョン違いによるトラブルを減らしやすくなります。

特に複数人で開発するプロジェクトでは、devcontainer.jsonまでリポジトリで管理すると、再現性の高い開発環境を構築しやすくなります。

以上、VSCodeからDockerコンテナへ接続する方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次