「開発環境では動いたのに、本番では動かない」——エンジニアなら誰もが一度は経験するこの問題を根本から解決してくれるのがDocker(ドッカー)です。本記事では、コンテナ仮想化の基礎概念から、実際の開発環境構築、Docker Compose を使った複数コンテナの管理まで、2026年時点での実践的なノウハウを体系的に解説します。
Dockerとは何か:コンテナ仮想化の基礎
Docker は、アプリケーションを「コンテナ」と呼ばれる軽量な実行環境にパッケージ化する技術です。従来の仮想マシン(VM)がホスト OS の上にゲスト OS 全体を起動するのに対し、コンテナはホストの OS カーネルを共有しながらプロセスを分離します。この違いにより、コンテナは起動が数秒と高速で、消費リソースも大幅に少なくて済みます。
- 可搬性:一度作ったイメージはどの環境でも同じように動作する
- 軽量性:OSカーネルを共有するためVMより圧倒的に省リソース
- 再現性:Dockerfileにより環境をコードとして管理できる
基本用語の整理:イメージ・コンテナ・レジストリ
Dockerを学ぶ上で最初に押さえるべき3つの概念があります。イメージはアプリと依存関係をまとめた静的なテンプレート、コンテナはそのイメージを起動した実行中のインスタンス、レジストリはイメージを保管・共有する場所(Docker Hub など)です。
Dockerfileの書き方:最初のイメージを作る
Node.js アプリを例に、基本的な Dockerfile を見てみましょう。
# ベースイメージを指定
FROM node:20-alpine
# 作業ディレクトリを作成
WORKDIR /app
# 依存関係を先にコピーしてキャッシュを活用
COPY package*.json ./
RUN npm ci --production
# アプリケーションコードをコピー
COPY . .
# ポートを公開
EXPOSE 3000
# 起動コマンド
CMD ["node", "server.js"]
ここでのポイントは、package*.json を先にコピーしてから npm ci を実行している点です。Dockerはレイヤーごとにキャッシュを行うため、ソースコードだけを変更した場合に依存関係の再インストールをスキップでき、ビルドが高速化します。
よく使うDockerコマンド一覧
# イメージをビルド
docker build -t myapp:latest .
# コンテナを起動(ポートをマッピング)
docker run -d -p 3000:3000 --name myapp myapp:latest
# 実行中のコンテナを確認
docker ps
# コンテナのログを見る
docker logs -f myapp
# コンテナ内でシェルを起動
docker exec -it myapp sh
# コンテナを停止・削除
docker stop myapp && docker rm myapp
Docker Composeで複数コンテナを管理する
実際のアプリケーションは、Webサーバー・データベース・キャッシュなど複数のコンテナで構成されることがほとんどです。これらをまとめて定義・起動できるのが Docker Compose です。
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
DATABASE_URL: postgres://user:pass@db:5432/mydb
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
このファイルを compose.yaml として保存し、docker compose up -d を実行するだけで、WebアプリとPostgreSQLが連携した環境が一発で立ち上がります。volumes を使うことで、コンテナを削除してもデータベースの内容が保持される点も重要です。
本番運用で押さえるべきベストプラクティス
- マルチステージビルド:ビルド環境と実行環境を分離し、最終イメージを最小化する
- 非rootユーザーで実行:セキュリティ向上のため
USER命令で権限を下げる - .dockerignore の活用:不要なファイルをビルドコンテキストから除外する
- タグの明示:
latestではなくバージョンを固定して再現性を確保する
まとめ:Dockerは現代開発の必須スキル
Dockerを習得すれば、環境構築の手間が劇的に減り、チーム開発やCI/CD、クラウドへのデプロイまでがスムーズになります。まずは手元で簡単なDockerfileを書き、コンテナを起動するところから始めてみましょう。次のステップとして、KubernetesによるオーケストレーションやCI/CDパイプラインへの統合を学ぶことで、インフラエンジニアとしての市場価値をさらに高められます。