Dockerはモダンなソフトウェア開発に欠かせないコンテナ技術です。「自分のPCでは動くのに本番環境で動かない」という問題を根本から解決し、開発・ステージング・本番環境を完全に統一できます。本記事では、Dockerの基礎概念から実際のdocker-compose.ymlの書き方、本番運用のベストプラクティスまで解説します。
Dockerとは何か:コンテナ技術の基礎
Dockerはコンテナと呼ばれる軽量な仮想環境を作成・管理するためのプラットフォームです。従来の仮想マシン(VM)と比較して、OSを共有するため起動が速く、リソース消費も少ないのが特徴です。
Dockerの主要コンセプト:
- イメージ:コンテナの設計図。アプリケーションの実行に必要なすべてが含まれる
- コンテナ:イメージから作成された実行中のインスタンス
- Dockerfile:イメージを作成するための設定ファイル
- Docker Hub:公式イメージを公開・共有するレジストリ
- docker-compose:複数コンテナをまとめて管理するツール
Dockerインストールと基本コマンド
まずDocker Desktopをインストールしましょう。macOS・Windows・Linuxすべてに対応しています。
# バージョン確認
docker --version
docker compose version
# イメージの取得
docker pull nginx:latest
# コンテナの起動
docker run -d -p 8080:80 --name my-nginx nginx:latest
# 起動中のコンテナ確認
docker ps
# コンテナのログ確認
docker logs my-nginx
# コンテナに入る(シェル実行)
docker exec -it my-nginx /bin/bash
# コンテナの停止・削除
docker stop my-nginx
docker rm my-nginx
Dockerfileの書き方:Node.jsアプリの例
# Node.jsアプリのDockerfile例
FROM node:20-alpine
# 作業ディレクトリの設定
WORKDIR /app
# package.jsonのコピーと依存関係インストール
# (ソースコードより先にコピーしてキャッシュを活用)
COPY package*.json ./
RUN npm ci --only=production
# ソースコードのコピー
COPY . .
# ビルド
RUN npm run build
# 非rootユーザーで実行(セキュリティ対策)
USER node
# ポートの公開
EXPOSE 3000
# アプリの起動
CMD ["node", "dist/index.js"]
docker-composeで複数サービスを管理する
実際のWebアプリケーションは、フロントエンド・バックエンド・データベース・Redisなど複数のサービスで構成されます。docker-composeを使えばこれらを一括管理できます。
# docker-compose.yml(Webアプリの典型的な構成)
version: '3.9'
services:
# Next.jsフロントエンド
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- NEXT_PUBLIC_API_URL=http://backend:4000
depends_on:
- backend
volumes:
- ./frontend:/app
- /app/node_modules
# Node.js/Expressバックエンド
backend:
build:
context: ./backend
dockerfile: Dockerfile
ports:
- "4000:4000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/myapp
- REDIS_URL=redis://redis:6379
- NODE_ENV=development
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
# PostgreSQLデータベース
db:
image: postgres:16-alpine
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=myapp
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d myapp"]
interval: 5s
timeout: 5s
retries: 5
# Redisキャッシュ
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
本番環境のベストプラクティス
本番環境でDockerを使う際は、セキュリティと効率性を意識した設計が重要です。
- マルチステージビルド:ビルド環境と実行環境を分離してイメージサイズを削減
- 非rootユーザー実行:セキュリティリスクを低減
- .dockerignore:不要なファイルをイメージに含めない
- ヘルスチェック:サービスの正常稼働を監視
- シークレット管理:環境変数やDocker Secretsで機密情報を管理
- イメージタグの固定:latestではなく特定バージョンを指定
まとめ
Dockerをマスターすることで、環境の再現性が保証され、チーム開発や本番デプロイが劇的に楽になります。まずはdocker-compose upでローカル開発環境を構築することから始めて、徐々にKubernetesなどのオーケストレーションツールへとステップアップしていきましょう。