Docker開発環境構築ガイド - 2025年版完全マニュアル
ガイド
Docker開発環境構築ガイド - 2025年版完全マニュアル
概要
Docker は、アプリケーションをコンテナと呼ばれる軽量で移植可能な単位にパッケージ化することで、開発から本番環境まで一貫した実行環境を提供する技術です。2025年現在、Docker Desktop の最新版では WSL 2 統合、GPU サポート、強化されたセキュリティ機能など、開発者の生産性を大幅に向上させる機能が搭載されています。本ガイドでは、Docker と Docker Compose を使用した開発環境の構築から、マルチコンテナアプリケーションの管理まで、実践的な手順を解説します。
詳細
Docker のインストール
Windows での Docker Desktop インストール
-
システム要件の確認
- Windows 10 64-bit: Pro、Enterprise、Education (Build 19041以降)
- Windows 11 64-bit: Home、Pro、Enterprise、Education
- WSL 2 有効化
- ハードウェア仮想化サポート
-
インストール手順
# WSL 2 の有効化 wsl --install # Docker Desktop のダウンロードとインストール # 公式サイトからインストーラーをダウンロード後、実行
macOS での Docker Desktop インストール
-
システム要件
- macOS 11.0 以降
- Apple Silicon (M1/M2/M3) または Intel プロセッサ
- 最小 4GB RAM
-
インストール手順
# Homebrew を使用したインストール brew install --cask docker # Docker Desktop の起動 open /Applications/Docker.app
Linux でのインストール
# Ubuntu/Debian の場合
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# RHEL/CentOS/Fedora の場合
sudo yum update
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# インストール確認
docker --version
docker compose version
Docker の基本概念
イメージとコンテナ
- イメージ: アプリケーションの実行に必要なすべてのファイルとメタデータを含む読み取り専用のテンプレート
- コンテナ: イメージから作成される実行可能なインスタンス
- レジストリ: Docker イメージを保存・配布するためのリポジトリ(Docker Hub など)
ボリュームとネットワーク
- ボリューム: コンテナ間でデータを永続化・共有するためのストレージ
- ネットワーク: コンテナ間の通信を管理する仮想ネットワーク
- ブリッジネットワーク: デフォルトのネットワークドライバ
Dockerfile のベストプラクティス
効率的な Dockerfile の作成
# syntax=docker/dockerfile:1
# マルチステージビルドの使用
FROM node:20-alpine AS base
WORKDIR /app
# 依存関係のキャッシュ最適化
FROM base AS deps
COPY package*.json ./
RUN npm ci --only=production
# 開発環境用ステージ
FROM base AS dev
COPY package*.json ./
RUN npm ci
COPY . .
CMD ["npm", "run", "dev"]
# 本番環境用ステージ
FROM base AS production
COPY --from=deps /app/node_modules ./node_modules
COPY . .
ENV NODE_ENV=production
CMD ["node", "app.js"]
セキュリティのベストプラクティス
-
ルートユーザーを避ける
# 非ルートユーザーの作成 RUN addgroup -g 1001 -S nodejs RUN adduser -S nodejs -u 1001 USER nodejs
-
最小限のベースイメージを使用
# Alpine Linux ベースの軽量イメージ FROM node:20-alpine
-
シークレットの管理
# ビルド時のシークレット使用 RUN --mount=type=secret,id=npm_token \ NPM_TOKEN=$(cat /run/secrets/npm_token) \ npm ci
Docker Compose による開発環境構築
基本的な compose.yaml
services:
# Webアプリケーション
web:
build:
context: .
target: dev
ports:
- "3000:3000"
volumes:
- ./:/app
- /app/node_modules
environment:
- NODE_ENV=development
- DEBUG=true
depends_on:
- db
- redis
# データベース
db:
image: postgres:16-alpine
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_USER: myapp
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
POSTGRES_DB: myapp_dev
secrets:
- db_password
# キャッシュ
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
secrets:
db_password:
file: ./secrets/db_password.txt
Compose Watch による自動リロード
services:
web:
build: .
develop:
watch:
# ソースコードの自動同期
- action: sync
path: ./src
target: /app/src
# package.json 変更時の再ビルド
- action: rebuild
path: package.json
# 設定ファイル変更時の再起動
- action: sync+restart
path: ./config
target: /app/config
マルチコンテナアプリケーションの管理
環境別設定の管理
# compose.yaml (ベース設定)
services:
web:
image: myapp:latest
depends_on:
- db
# compose.override.yaml (開発環境、自動適用)
services:
web:
build: .
volumes:
- '.:/code'
ports:
- 8080:80
environment:
DEBUG: 'true'
# compose.prod.yaml (本番環境)
services:
web:
ports:
- 80:80
environment:
PRODUCTION: 'true'
複数の compose ファイルの使用
# 開発環境の起動
docker compose up -d
# 本番環境の起動
docker compose -f compose.yaml -f compose.prod.yaml up -d
# 環境変数ファイルの指定
docker compose --env-file .env.production up -d
本番環境への考慮事項
ヘルスチェックの実装
services:
web:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
リソース制限の設定
services:
web:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
ロギングとモニタリング
services:
web:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
labels: "service=web"
メリット・デメリット
メリット
-
環境の一貫性
- 開発、テスト、本番環境で同一のコンテナイメージを使用
- "私の環境では動く" 問題の解決
- 依存関係の完全な管理
-
開発効率の向上
- 新規開発者のセットアップ時間を大幅短縮
- Docker Compose による複雑な環境の簡単な立ち上げ
- ホットリロードによる即座のフィードバック
-
スケーラビリティと移植性
- 水平スケーリングの容易さ
- クラウドプロバイダー間の移植性
- マイクロサービスアーキテクチャのサポート
-
リソース効率
- VM と比較して軽量
- 高速な起動時間
- システムリソースの効率的な利用
デメリット
-
学習曲線
- Docker の概念とコマンドの習得が必要
- ネットワーキングとセキュリティの理解
- トラブルシューティングスキルの必要性
-
複雑性の増加
- 小規模プロジェクトでは過剰な場合がある
- デバッグが複雑になる可能性
- イメージサイズの管理が必要
-
セキュリティの考慮事項
- 適切な設定が必要
- イメージの脆弱性管理
- シークレット管理の複雑さ
-
パフォーマンスオーバーヘッド
- ネイティブ実行と比較して若干の性能低下
- ストレージドライバーによる I/O 性能への影響
- Windows/macOS でのファイルシステム同期の遅延
参考ページ
- Docker 公式ドキュメント
- Docker Hub
- Docker Compose ドキュメント
- Docker Desktop
- Dockerfile ベストプラクティス
- Docker セキュリティベストプラクティス
書き方の例
基本的な Node.js アプリケーション
# Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
# compose.yaml
services:
app:
build: .
ports:
- "3000:3000"
environment:
NODE_ENV: production
Python Flask アプリケーション
# Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
# compose.yaml
services:
web:
build: .
ports:
- "5000:5000"
environment:
FLASK_ENV: development
volumes:
- ./:/app
フルスタックアプリケーション
# compose.yaml
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
depends_on:
- backend
backend:
build: ./backend
ports:
- "8000:8000"
environment:
DATABASE_URL: postgresql://user:pass@db:5432/mydb
depends_on:
db:
condition: service_healthy
db:
image: postgres:16
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user"]
interval: 10s
timeout: 5s
retries: 5
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- frontend
- backend
volumes:
db_data:
開発環境の自動化
#!/bin/bash
# dev-setup.sh
# 環境変数ファイルのコピー
cp .env.example .env
# Docker イメージのビルド
docker compose build
# データベースの起動と初期化
docker compose up -d db
sleep 5
docker compose exec db psql -U postgres -c "CREATE DATABASE myapp_dev;"
# アプリケーションの起動
docker compose up -d
# ログの表示
docker compose logs -f
CI/CD パイプライン統合
# .github/workflows/docker.yml
name: Docker CI/CD
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build and test
run: |
docker compose build
docker compose run --rm app npm test
- name: Push to registry
run: |
echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
docker compose push