
このような 「環境依存によるトラブル」 を解消し、どこでも同じように動く環境を即座に再現できる技術、それが Docker です。本記事では、Dockerの基礎から、現場で必須となる実践的な使い方までを体系的に解説します。
1. Dockerとコンテナの基本:仮想マシンとの違い#
Dockerは 「コンテナ型仮想化」 を用いたプラットフォームです。従来の仮想マシン(VM)とは仕組みが大きく異なります。
コンテナ vs 仮想マシン (VM)#

| 項目 | コンテナ (Docker) | 仮想マシン (VM) |
|---|---|---|
| ゲストOS | 不要(ホストOSを共有) | 必要(個別にインストール) |
| 起動速度 | 数秒(プロセス起動に近い) | 数分(OS起動が必要) |
| リソース消費 | 非常に少ない | 多い(CPU/メモリを占有) |
| 分離レベル | プロセス単位(論理的分離) | ハードウェア単位(物理的分離) |
コンテナはゲストOSを丸ごと持たないため、極めて軽量かつ高速です。これにより、開発者が手軽に環境を作成・破棄できる「使い捨ての環境」が実現します。
2. Dockerの3要素:Dockerfile、イメージ、コンテナ#

Dockerを理解する上で、以下の3つの関係性を「料理」に例えると分かりやすいです。
- Dockerfile (レシピ): イメージを作成するための「手順書」。
- イメージ (料理の型): 実行に必要なアプリ・設定が詰まった「設計図」。不変(Immutable)なバイナリ。
- コンテナ (完成した料理): イメージを実体化した「実行環境」。
3. 【実践】Dockerfile を書いてみよう#

単に用語を覚えるよりも、実際に書くのが近道です。ここでは Node.js の Web アプリを Docker 化する例を見てみましょう。
実務で使える Dockerfile (Node.js)#
# 1. 軽量なベースイメージを選択
FROM node:20-slim
# 2. 作業ディレクトリの設定
WORKDIR /app
# 3. 依存関係の定義ファイルをコピー(キャッシュ活用のため)
COPY package*.json ./
RUN npm install --production
# 4. アプリのソースコードをコピー
COPY . .
# 5. 起動コマンドの指定
EXPOSE 3000
CMD ["node", "app.js"]ビルドと実行#
# イメージの作成
docker build -t my-node-app .
# コンテナの起動
docker run -p 8080:3000 my-node-app4. 現場で必須の概念:ボリュームとネットワーク#
実際の開発では、「コンテナを消してもデータを残したい」「コンテナ同士で通信したい」という場面が必ず出てきます。
ボリューム (Volume) によるデータの永続化#
コンテナ内のデータは、コンテナを削除すると消えてしまいます。DBのデータなどを残すには、ボリュームを使ってホストPCのディレクトリと同期(マウント)させます。
ポートマッピング (-p)#
docker run -p 8080:3000 と指定することで、ホストの8080番へのアクセスを、コンテナ内の3000番へ転送します。これが無いと、ブラウザからコンテナにアクセスできません。
5. Docker Compose で複数コンテナを一括管理#
実際のアプリは、Node.js だけでなく DB(PostgreSQL等)もセットで動くのが普通です。これらを一つの設定ファイルで管理するのが Docker Compose です。
# docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "8080:3000"
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: passworddocker-compose up 一発で、アプリと DB の両方が立ち上がり、互いに通信できる状態で準備されます。
6. まとめ:Docker は「環境」を「コード」にする#
Dockerを導入することは、単にツールを増やすことではなく 「環境構築という不確実な作業を、コードによる管理(IaC)へと進化させること」 です。
- 環境差異による「動かない」を撲滅できる。
- 新メンバーのジョインコストを最小化できる。
- 本番環境へのデプロイが劇的に安全になる。
まずは、自分のプロジェクトを一つのDockerfileにまとめることから始めてみてください。一度その「再現性の高さ」を体験すれば、もう手動での環境構築には戻れなくなるはずです。🚀











