VSCodeでDocker環境を構築する方法

採用はこちら

VSCodeでDocker環境を構築すると、Node.jsやPython、PHP、データベースなどの開発環境をコンテナとして管理できるようになります。

PC本体へさまざまなソフトウェアを直接インストールする必要が少なくなり、プロジェクトごとに独立した環境を用意できるのが大きなメリットです。

また、Dockerfileやcompose.yamlなどをGitで共有すれば、チームメンバー間でもほぼ同じ開発環境を再現しやすくなります。

VSCodeでは、Dockerを管理する「Container Tools」や、Dockerコンテナそのものを開発環境として利用する「Dev Containers」といった拡張機能も利用できます。

ここでは、VSCodeでDocker環境を構築する基本的な方法から、Docker ComposeやDev Containersを利用する方法まで詳しく解説します。

目次

VSCodeでDockerを利用する仕組み

VSCodeだけをインストールしても、Dockerコンテナを実行することはできません。

実際にDockerイメージを作成したり、コンテナを起動したりするのはDocker Engineです。

VSCodeは、Dockerを操作したり、コンテナ内部で開発したりするためのインターフェースとして利用します。

基本的な関係は次のようになります。

VSCode
  ↓
Container Tools / Dev Containers
  ↓
Docker CLI
  ↓
Docker Engine
  ↓
Dockerコンテナ

そのため、VSCodeでDockerを利用するときは、基本的に次のような順番で環境を準備します。

Dockerをインストール
↓
Dockerの動作確認
↓
VSCodeをインストール
↓
Container Toolsをインストール
↓
Dockerfileを作成
↓
Dockerイメージをビルド
↓
コンテナを起動
↓
必要に応じてDocker Composeを利用
↓
必要に応じてDev Containersを利用

Dockerをインストールする

Windowsの場合

Windowsでは、Docker Desktopを利用する方法が分かりやすいでしょう。

Docker Desktopには、Docker Engine、Docker CLI、Docker Composeなど、Dockerを利用するための主要機能が含まれています。

WindowsでLinuxコンテナを扱う場合は、WSL 2バックエンドを利用する構成が一般的です。

まず、PowerShellなどでWSLの状態を確認します。

wsl --version

WSLがインストールされていない場合は、管理者権限のPowerShellなどから次のコマンドを実行できます。

wsl --install

WSLを更新する場合は、次のコマンドを使用します。

wsl --update

その後、Docker Desktopをインストールして起動します。

なお、WindowsではWSL 2以外のバックエンドも利用できるため、必ずWSL 2でなければならないわけではありません。

一般的なWeb開発でLinuxコンテナを利用する場合は、WSL 2が有力な選択肢となります。

macOSの場合

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

Docker Desktopをインストールすれば、Docker Engine、Docker CLI、Docker Composeなどをまとめて利用できます。

Intel MacとApple Silicon搭載Macでは配布されるDocker Desktopが異なる場合があるため、自分のMacに合ったものを選びます。

Linuxの場合

LinuxではDocker Engineを直接インストールする方法が一般的です。

Ubuntu、Debian、Fedoraなど、利用しているディストリビューションごとにインストール方法が異なります。

また、一般ユーザーからDockerを実行する場合は、ユーザー権限の設定が必要になることがあります。

Dockerが正常に動作するか確認する

Dockerをインストールしたら、VSCodeのターミナルなどから動作確認を行います。

まずDockerのバージョンを確認します。

docker --version

続いてDocker Composeを確認します。

docker compose version

現在は、基本的に次の形式を利用します。

docker compose

古い記事では、次のような形式が紹介されていることがあります。

docker-compose

現在はCompose V2のdocker composeを基本として覚えておくとよいでしょう。

さらに、Docker Engineまで正常に利用できるか確認します。

docker run hello-world

正常にメッセージが表示されれば、Docker環境の基本的な準備は完了です。

VSCodeにContainer Toolsをインストールする

VSCodeからDockerを扱いやすくするために、Microsoftの「Container Tools」をインストールします。

VSCodeの拡張機能画面を開きます。

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

Ctrl + Shift + X

検索欄で、次の名前を検索します。

Container Tools

Microsoftが提供しているContainer Toolsをインストールします。

Container Toolsを利用すると、VSCode上からDockerのコンテナやイメージなどを確認・管理しやすくなります。

代表的には、次のようなDockerリソースを確認できます。

Containers
Images
Volumes
Networks
Registries

従来はMicrosoftの「Docker」拡張機能がよく使われていましたが、現在はContainer ToolsがDocker開発・管理機能の中心となっています。

Docker用のプロジェクトを作成する

ここからはNode.jsを例に、実際のDocker環境を作成します。

例えば、次のようなプロジェクト構成を作ります。

docker-sample/
├─ package.json
├─ package-lock.json
├─ server.js
├─ Dockerfile
└─ .dockerignore

VSCodeから、このフォルダを開きます。

Node.jsアプリケーションを作成する

package.jsonを作成する

まず、次のようなpackage.jsonを用意します。

{
  "name": "docker-sample",
  "version": "1.0.0",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "express": "^5.0.0"
  }
}

依存パッケージをインストールしてpackage-lock.jsonも作成しておくと、Dockerビルド時にnpm ciを利用できます。

server.jsを作成する

続いて、簡単なWebサーバーを作成します。

const express = require("express");

const app = express();

app.get("/", (req, res) => {
  res.send("Hello Docker!");
});

app.listen(3000, "0.0.0.0", () => {
  console.log("Server running on port 3000");
});

ここでは明示的に0.0.0.0へバインドしています。

コンテナ内のWebサーバーへホスト側からアクセスする場合、このように外部インターフェースから受け付けられる状態にしておくと分かりやすくなります。

Dockerfileを作成する

プロジェクト直下に、次の名前でファイルを作成します。

Dockerfile

拡張子は付けません。

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

FROM node:22-alpine

WORKDIR /app

COPY package.json package-lock.json ./

RUN npm ci

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

FROMの意味

FROM node:22-alpine

Dockerイメージのベースとなる環境を指定します。

この例では、Node.js 22を利用できるAlpine Linuxベースのイメージを使用しています。

Alpine Linuxは軽量ですが、Dev Containers用の開発環境として利用する場合は、一部のVSCode拡張機能やネイティブライブラリとの互換性に注意が必要です。

WORKDIRの意味

WORKDIR /app

コンテナ内部で作業するディレクトリを指定します。

これ以降の命令は、基本的に/appを基準として実行されます。

COPYの意味

COPY package.json package-lock.json ./

ホスト側のファイルをDockerイメージ内へコピーします。

依存関係を記述したファイルを先にコピーすることで、Dockerのビルドキャッシュを効率的に利用しやすくなります。

RUNの意味

RUN npm ci

Dockerイメージをビルドするときにコマンドを実行します。

package-lock.jsonが存在するNode.jsプロジェクトでは、npm installよりnpm ciを利用すると、依存パッケージのバージョンを再現しやすくなります。

EXPOSEの意味

EXPOSE 3000

アプリケーションが3000番ポートを利用することを示します。

ただし、EXPOSE 3000を書くだけでは、ホストPCへ3000番ポートが公開されるわけではありません。

ホスト側へ公開するには、docker runの-pオプションやDocker Composeのportsを利用します。

CMDの意味

CMD ["npm", "start"]

コンテナを起動したときに実行するコマンドです。

この例では、npm startを実行します。

.dockerignoreを作成する

Dockerイメージへ不要なファイルを含めないため、.dockerignoreを作成します。

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

node_modules
npm-debug.log*
.git
.gitignore
.env
.env.*

特にnode_modulesを除外しておくことは重要です。

WindowsやmacOS上で作成されたnode_modulesをLinuxコンテナへコピーすると、OS依存のモジュールで問題が発生することがあります。

また、.envにはAPIキーやパスワードなどが含まれることがあるため、必要がなければDockerビルドコンテキストへ送らない方が安全です。

Dockerイメージをビルドする

Dockerfileを作成したら、VSCodeのターミナルで次のコマンドを実行します。

docker build -t docker-sample .

docker buildはDockerイメージを作成するコマンドです。

-t docker-sample

では、作成するDockerイメージへdocker-sampleという名前を付けています。

最後の、

.

は、現在のディレクトリをビルドコンテキストとして利用するという意味です。

ビルドしたイメージは、次のコマンドで確認できます。

docker image ls

または、次のコマンドも利用できます。

docker images

Dockerコンテナを起動する

作成したDockerイメージからコンテナを起動します。

docker run -d -p 3000:3000 --name docker-sample-container docker-sample

-dオプション

-d

コンテナをバックグラウンドで実行します。

-pオプション

-p 3000:3000

ホストPCの3000番ポートと、コンテナの3000番ポートを接続します。

基本的には、

ホスト側:コンテナ側

という順番です。

–nameオプション

--name docker-sample-container

コンテナへ分かりやすい名前を付けています。

起動後、ブラウザから次のURLへアクセスします。

http://localhost:3000

「Hello Docker!」と表示されれば、Docker環境でNode.jsアプリケーションが正常に動作しています。

Dockerコンテナの状態を確認する

起動中のコンテナを確認する

次のコマンドを使用します。

docker ps

停止済みコンテナも確認する

すべてのコンテナを確認したい場合は、次のようにします。

docker ps -a

Dockerコンテナのログを確認する

Docker環境でエラーが発生した場合は、ログの確認が重要です。

docker logs docker-sample-container

ログをリアルタイムで追跡する場合は、次のようにします。

docker logs -f docker-sample-container

-fを指定すると、新しいログが継続的に表示されます。

Dockerコンテナ内部へ入る

実行中のコンテナ内部でコマンドを実行したい場合は、docker execを使用します。

Alpine Linux系のコンテナであれば、次のようにします。

docker exec -it docker-sample-container sh

Ubuntuなど、bashがインストールされているコンテナでは、次のコマンドを利用できる場合があります。

docker exec -it docker-sample-container bash

コンテナ内へ入った後、例えば次のコマンドを実行できます。

node --version

ホストPCではなく、コンテナ内部にインストールされているNode.jsのバージョンが表示されます。

Dockerコンテナを停止・削除する

コンテナを停止する

docker stop docker-sample-container

コンテナを再起動する

docker start docker-sample-container

コンテナを削除する

停止済みコンテナを削除する場合は、次のようにします。

docker rm docker-sample-container

Dockerイメージを削除する

コンテナを削除した後、Dockerイメージも削除したい場合は、次のコマンドを利用します。

docker image rm docker-sample

そのイメージを使用しているコンテナが残っていると、イメージを削除できない場合があります。

そのため、基本的には、

コンテナ停止
↓
コンテナ削除
↓
イメージ削除

という順番で操作すると分かりやすいでしょう。

VSCodeからDockerfileを作成する

Container Toolsを利用すると、Docker関連ファイルをVSCodeから生成することもできます。

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

Ctrl + Shift + P

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

Containers: Add Docker Files to Workspace

プロジェクトの言語や構成を選択すると、Dockerfileや.dockerignoreなどを自動生成できます。

Dockerfileの書き方に慣れていない場合は、この機能を利用してひな形を作成すると便利です。

Docker Composeを利用する

Web開発では、アプリケーションだけでなく、データベースやキャッシュなど複数のサービスを利用することがあります。

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

Node.js
+
PostgreSQL
+
Redis

このような複数のコンテナをまとめて管理するときに便利なのがDocker Composeです。

ただし、Docker Composeは複数コンテナ専用というわけではありません。

単一コンテナでも、ポート、環境変数、ボリュームなどの実行設定をファイルとして管理したい場合に利用できます。

compose.yamlを作成する

Node.jsアプリケーションだけであれば、次のようなcompose.yamlを作成できます。

services:
  app:
    build: .
    ports:
      - "3000:3000"

起動するときは、次のコマンドを実行します。

docker compose up

バックグラウンドで起動する場合は、次のようにします。

docker compose up -d

Dockerイメージを再ビルドしてから起動したい場合は、次のコマンドが便利です。

docker compose up -d --build

Docker ComposeでPostgreSQLを利用する

Node.jsとPostgreSQLを組み合わせる場合は、例えば次のように記述できます。

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      DB_HOST: db
      DB_PORT: 5432
      DB_USER: app
      DB_PASSWORD: ${DB_PASSWORD}
      DB_NAME: appdb
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:17
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: appdb
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app -d appdb"]
      interval: 5s
      timeout: 5s
      retries: 5
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  postgres-data:

コンテナ間ではサービス名で通信する

この例では、Node.js側からPostgreSQLへ接続するときのホスト名は、

localhost

ではありません。

次のように、Composeのサービス名を利用します。

db

つまり、アプリケーションからPostgreSQLへ接続するときは、

db:5432

という考え方になります。

同じComposeプロジェクト内のサービスは、通常はサービス名を利用して通信できます。

depends_onだけではDBの準備完了まで待たない

Docker Composeでは、次のような単純な指定も可能です。

depends_on:
  - db

ただし、この書き方では「dbコンテナが起動したこと」は確認できますが、PostgreSQLが実際に接続可能な状態になるまで待つとは限りません。

そのため、アプリケーション起動時に確実にデータベースへ接続したい場合は、healthcheckとcondition: service_healthyを組み合わせる方法があります。

Docker Composeを停止する

Compose環境を停止・削除する場合は、次のコマンドを利用します。

docker compose down

単純に停止だけしたい場合は、次のコマンドです。

docker compose stop

再び開始する場合は、次のようにします。

docker compose start

名前付きボリュームは通常削除されない

docker compose down

を実行しても、通常は名前付きボリュームまでは削除されません。

例えばPostgreSQLのデータを、

volumes:
  - postgres-data:/var/lib/postgresql/data

として保存している場合、通常のdocker compose downでデータが保持されます。

ボリュームも削除したい場合は、次のようにします。

docker compose down -v

ただし、このコマンドを実行するとデータベースの保存データまで削除される可能性があります。

実行前に、本当に削除して問題ないか確認しましょう。

Docker Composeのログを確認する

Compose環境全体のログを見る場合は、次のコマンドを利用します。

docker compose logs

リアルタイムでログを確認する場合は、次のようにします。

docker compose logs -f

特定サービスだけ確認したい場合は、例えば次のように指定できます。

docker compose logs -f app

Dev Containersを利用する

VSCodeでDockerを利用するときに便利なのが「Dev Containers」です。

Container ToolsとDev Containersは似ていますが、役割が異なります。

Container Tools
→ Dockerコンテナやイメージを管理する

Dev Containers
→ DockerコンテナそのものをVSCodeの開発環境として利用する

Dev Containersを利用すると、Node.jsやPythonなどの実行環境だけでなく、開発ツールやVSCode拡張機能までプロジェクト単位でそろえやすくなります。

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

VSCodeの拡張機能画面を開いて、

Dev Containers

と検索します。

MicrosoftのDev Containers拡張機能をインストールします。

devcontainer.jsonを作成する

Dev Containersでは、主に次のファイルを利用します。

.devcontainer/devcontainer.json

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

docker-sample/
├─ .devcontainer/
│  └─ devcontainer.json
├─ Dockerfile
├─ package.json
└─ server.js

devcontainer.jsonは、例えば次のように記述できます。

{
  "name": "Node Docker Development",
  "build": {
    "dockerfile": "../Dockerfile"
  },
  "forwardPorts": [3000]
}

VSCode拡張機能も自動的にインストールしたい場合は、次のような設定が可能です。

{
  "name": "Node Docker Development",
  "build": {
    "dockerfile": "../Dockerfile"
  },
  "forwardPorts": [3000],
  "customizations": {
    "vscode": {
      "extensions": [
        "dbaeumer.vscode-eslint"
      ]
    }
  }
}

参考サイト

Dev Containersとは?Dockerを使った開発環境構築の決定版【図解で完全理解】

コンテナ内部でVSCodeを開く

devcontainer.jsonを作成したら、VSCodeのコマンドパレットを開きます。

Ctrl + Shift + P

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

Dev Containers: Reopen in Container

VSCodeが再読み込みされ、Dockerコンテナを開発環境として利用できるようになります。

例えばターミナルで、

node --version

を実行すると、ホストPCではなく、コンテナ内部のNode.jsが利用されます。

本番用DockerfileとDev Containers用Dockerfileを分ける方法

本番環境と開発環境では、必要なツールが異なることがあります。

本番環境では不要でも、開発環境では次のようなツールが必要になる場合があります。

Git
curl
デバッガー
リンター
シェル
VSCode拡張機能用ライブラリ

そのため、プロジェクトによっては次のようにDockerfileを分ける方法もあります。

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

例えば、

ルートのDockerfile
→ 本番環境・アプリ実行用

.devcontainer/Dockerfile
→ VSCode開発環境用

という役割分担です。

本番用イメージを軽量に保ちながら、開発環境では必要なツールを充実させることができます。

Dockerfile・Docker Compose・Dev Containersの違い

Docker関連のファイルは役割が似て見えるため、最初は混乱しやすい部分です。

整理すると次のようになります。

ファイル主な役割
DockerfileDockerイメージの作り方を定義する
compose.yamlコンテナの起動設定や複数サービスを管理する
devcontainer.jsonVSCodeの開発環境としてコンテナを利用する設定
.dockerignoreDockerビルドへ不要なファイルを除外する

例えば、次のように組み合わせて利用できます。

VSCode
↓
Dev Containers
↓
devcontainer.json
↓
Docker Compose
↓
appコンテナ + dbコンテナ
↓
Dockerfile

すべてを必ず利用する必要はありません。

小規模なプロジェクトならDockerfileだけでも構築できますし、複数サービスが必要になればDocker Composeを追加します。

開発環境そのものをコンテナ化したければ、さらにDev Containersを追加するとよいでしょう。

VSCodeでDockerを使うときによく利用するコマンド

Dockerのバージョンを確認する

docker --version

起動中のコンテナを確認する

docker ps

すべてのコンテナを確認する

docker ps -a

Dockerイメージを確認する

docker image ls

Dockerイメージをビルドする

docker build -t my-app .

Dockerコンテナを起動する

docker run -d -p 3000:3000 my-app

Dockerコンテナのログを確認する

docker logs -f コンテナ名

Dockerコンテナ内部でシェルを開く

docker exec -it コンテナ名 sh

Dockerコンテナを停止する

docker stop コンテナ名

Dockerコンテナを削除する

docker rm コンテナ名

Docker Composeを起動する

docker compose up -d

Docker Composeを再ビルドして起動する

docker compose up -d --build

Docker Composeを終了する

docker compose down

Dockerが動かない場合の確認ポイント

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

次のようなエラーが表示される場合があります。

Cannot connect to the Docker daemon

この場合は、Docker Engineが起動していない可能性があります。

WindowsやmacOSでは、まずDocker Desktopが正常に起動しているか確認しましょう。

WindowsではWSLの状態を確認する

WindowsでWSL 2バックエンドを利用している場合は、次のコマンドで状態を確認できます。

wsl --version

または、

wsl --status

WSL自体に問題があると、Docker Desktopが正常に起動しないことがあります。

ポートの競合を確認する

例えば、

docker run -p 3000:3000 ...

を実行したときにエラーが出る場合、ホストPCの3000番ポートを別のアプリケーションが使用している可能性があります。

その場合は、ホスト側のポート番号を変更します。

docker run -p 3001:3000 ...

これは、

ホストPC:3001
↓
コンテナ:3000

という意味です。

ブラウザからは次のURLへアクセスします。

http://localhost:3001

Dockerfileを変更したのに反映されない場合

Dockerfileを変更しても、以前のDockerイメージをそのまま利用している場合があります。

Docker Composeなら、次のコマンドで再ビルドできます。

docker compose up -d --build

Dockerのビルドキャッシュを利用せず、完全に最初からビルドしたい場合は、次の方法もあります。

docker build --no-cache -t docker-sample .

ただし、通常は毎回--no-cacheを使用する必要はありません。

キャッシュが原因と思われる問題を切り分ける場合などに利用します。

Docker環境でパスワードを扱うときの注意点

Docker Composeのサンプルでは、分かりやすさを優先してパスワードを直接書くことがあります。

しかし、実際のプロジェクトでは、次のようにパスワードを直接記述するのは避けた方がよいでしょう。

DB_PASSWORD: password

例えば、

DB_PASSWORD: ${DB_PASSWORD}

として、環境変数から値を渡す方法があります。

ただし、.envファイルにパスワードを書けば無条件に安全になるわけではありません。

.envをGitへコミットしないようにし、必要に応じてクラウドサービスのシークレット管理機能やDocker Secretsなどを利用することも検討します。

VSCodeでDocker環境を構築するメリット

Dockerを利用する最大のメリットの一つは、開発環境をコードとして管理しやすくなることです。

Dockerを使わない場合、開発者ごとに次のような違いが生じることがあります。

Aさん
Node.js 20

Bさん
Node.js 22

Cさん
Node.js 24

Dockerfileで、

FROM node:22-alpine

のように指定しておけば、プロジェクトで利用するNode.js環境を統一しやすくなります。

さらに、Dockerfile、compose.yaml、devcontainer.jsonなどをGitで管理すれば、新しいメンバーも同じ開発環境を構築しやすくなります。

初心者がDockerを学ぶおすすめの順番

Docker初心者の場合、最初からDocker ComposeやDev Containersまで一度に導入すると、それぞれの役割が分かりにくくなることがあります。

そのため、次のような順番で覚えると理解しやすいでしょう。

Docker Desktop
↓
docker run
↓
Dockerfile
↓
docker build
↓
docker run -p
↓
Docker Compose
↓
Container Tools
↓
Dev Containers

最初はDocker CLIで基本操作を理解し、その後VSCodeのGUI機能やDev Containersを利用すると、

Docker自体の機能
VSCodeの機能

を区別しやすくなります。

VSCodeでDocker環境を構築するときのおすすめ構成

Web開発でDockerを本格的に利用する場合は、例えば次のような構成にできます。

project/
├─ .devcontainer/
│  ├─ devcontainer.json
│  └─ Dockerfile
├─ src/
├─ Dockerfile
├─ compose.yaml
├─ .dockerignore
├─ package.json
├─ package-lock.json
└─ README.md

それぞれの役割は次の通りです。

Dockerfile
→ アプリケーション用Dockerイメージを作成

compose.yaml
→ アプリやDBなどのコンテナを管理

.devcontainer/devcontainer.json
→ VSCodeの開発環境を設定

.devcontainer/Dockerfile
→ Dev Containers専用の開発環境を構築

.dockerignore
→ Dockerビルドへ不要なファイルを除外

小規模なプロジェクトでは、最初からすべてを用意する必要はありません。

まずは、

Docker Desktop
+
Dockerfile
+
Container Tools

程度から始めても十分です。

データベースなど複数のサービスを利用するようになったらDocker Composeを導入し、チーム全体で開発環境まで完全に統一したくなった場合にDev Containersを加えるとよいでしょう。

VSCodeとDockerを組み合わせれば、開発環境を再現しやすくなり、プロジェクトごとの依存関係やバージョン違いによるトラブルも減らしやすくなります。

まずはDockerfileを使った単一コンテナの起動方法を理解し、その後Docker Compose、Dev Containersへ段階的に進むのがおすすめです。

以上、VSCodeでDocker環境を構築する方法についてでした。

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

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