Dockerでローカル開発環境を整える方法
「自分のマシンでは動くのに、他のメンバーの環境だと動かない」という経験は誰にでもあるでしょう。Docker を使えば、OS やミドルウェアのバージョン差異に悩まされない、再現性の高い開発環境を構築できます。本記事では、Docker を使ったローカル開発環境のセットアップ手順を解説します。
最低限の Docker 知識
Docker はアプリケーションとその実行に必要な依存関係を「コンテナ」という単位でパッケージ化します。開発でよく使う概念は以下の3つです。
- Dockerfile: コンテナの設計図。どのベースイメージを使い、何をインストールするかを記述。
- docker-compose.yml: 複数のコンテナ(Webサーバー、DB、キャッシュなど)を一括で管理する設定ファイル。
- ボリュームマウント: コンテナからホストのファイルを参照する仕組み。ホットリロードに必須。
docker-compose でマルチサービス構成
フロントエンド + バックエンド + データベースのような構成は、docker-compose.yml 1つで定義できます。
version: "3.9"
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
volumes:
- ./frontend:/app
- /app/node_modules
command: npm run dev
backend:
build: ./backend
ports:
- "8000:8000"
volumes:
- ./backend:/app
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/app
db:
image: postgres:16
ports:
- "5432:5432"
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: app
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
各セクションのポイント
- volumes(ボリュームマウント):
./frontend:/appのようにホストのソースコードをコンテナ内にマウントします。ホストでファイルを変更するとコンテナ内にも即座に反映されるため、ホットリロードが機能します。 /app/node_modulesの匿名ボリューム:node_modulesだけはホストと同期しないようにします。Windows と Linux でネイティブモジュールの互換性問題が起きるのを防ぐための定石です。- environment: 環境変数で設定を注入。DB の接続情報などはここで渡します。
Dockerfile の開発向けベストプラクティス
開発用の Dockerfile は、本番用とは別に用意するのが一般的です。
# Dockerfile.dev
FROM node:20-alpine
WORKDIR /app
# 依存関係のインストールは先に行う(レイヤーキャッシュを効かせるため)
COPY package*.json ./
RUN npm install
# ソースコードはボリュームマウントでホットリロードするため COPY 不要
CMD ["npm", "run", "dev"]
ポイントは、COPY でソースコードを入れ込まないことです。代わりに docker-compose.yml の volumes でホストのディレクトリをマウントします。こうすれば、コンテナを再ビルドしなくてもコードの変更が即座に反映されます。
チームでの一貫性を保つ
Docker を導入する最大のメリットは、「全員が同じ環境で開発できる」ことです。以下のルールをチームで決めておくとトラブルが減ります。
docker-compose.ymlとDockerfileは Git で管理する.envファイル(秘密情報)は.gitignoreに追加し、サンプルとして.env.exampleをリポジトリに含めるMakefileやnpm scriptsにdocker compose upのラッパーコマンドを用意しておくと、Docker に不慣れなメンバーも迷わず起動できる
# Makefile
up:
docker compose up -d
down:
docker compose down
build:
docker compose build
logs:
docker compose logs -f
よくある注意点
- パフォーマンス: Windows(特に WSL2 非利用時)ではファイルマウントの速度が遅くなりがちです。WSL2 上で Docker Desktop を動かすか、
mutagenなどの同期ツールを検討しましょう。 - ポート競合: 複数プロジェクトで同じポート(例:3000)を使う場合は、
docker-compose.ymlのportsでホスト側のポートを変更します(例:"3001:3000")。 - ボリュームのクリーンアップ: 長期間開発していると不要なボリュームが溜まります。
docker compose down -vで削除できます。
まとめ
Docker をローカル開発に導入する最大の価値は、「環境の再現性」と「チーム内の一貫性」です。docker-compose で複数サービスをまとめて管理し、ボリュームマウントでホットリロードを維持すれば、開発体験を損なわずに恩恵を受けられます。まずは小さなプロジェクトで試しながら、チームの開発フローに取り入れてみてください。

