Docker開発環境構築ガイド - 2025年版完全マニュアル

DockerDocker Compose開発環境コンテナDevOps仮想化

ガイド

Docker開発環境構築ガイド - 2025年版完全マニュアル

概要

Docker は、アプリケーションをコンテナと呼ばれる軽量で移植可能な単位にパッケージ化することで、開発から本番環境まで一貫した実行環境を提供する技術です。2025年現在、Docker Desktop の最新版では WSL 2 統合、GPU サポート、強化されたセキュリティ機能など、開発者の生産性を大幅に向上させる機能が搭載されています。本ガイドでは、Docker と Docker Compose を使用した開発環境の構築から、マルチコンテナアプリケーションの管理まで、実践的な手順を解説します。

詳細

Docker のインストール

Windows での Docker Desktop インストール

  1. システム要件の確認

    • Windows 10 64-bit: Pro、Enterprise、Education (Build 19041以降)
    • Windows 11 64-bit: Home、Pro、Enterprise、Education
    • WSL 2 有効化
    • ハードウェア仮想化サポート
  2. インストール手順

    # WSL 2 の有効化
    wsl --install
    
    # Docker Desktop のダウンロードとインストール
    # 公式サイトからインストーラーをダウンロード後、実行
    

macOS での Docker Desktop インストール

  1. システム要件

    • macOS 11.0 以降
    • Apple Silicon (M1/M2/M3) または Intel プロセッサ
    • 最小 4GB RAM
  2. インストール手順

    # 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"]

セキュリティのベストプラクティス

  1. ルートユーザーを避ける

    # 非ルートユーザーの作成
    RUN addgroup -g 1001 -S nodejs
    RUN adduser -S nodejs -u 1001
    USER nodejs
    
  2. 最小限のベースイメージを使用

    # Alpine Linux ベースの軽量イメージ
    FROM node:20-alpine
    
  3. シークレットの管理

    # ビルド時のシークレット使用
    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"

メリット・デメリット

メリット

  1. 環境の一貫性

    • 開発、テスト、本番環境で同一のコンテナイメージを使用
    • "私の環境では動く" 問題の解決
    • 依存関係の完全な管理
  2. 開発効率の向上

    • 新規開発者のセットアップ時間を大幅短縮
    • Docker Compose による複雑な環境の簡単な立ち上げ
    • ホットリロードによる即座のフィードバック
  3. スケーラビリティと移植性

    • 水平スケーリングの容易さ
    • クラウドプロバイダー間の移植性
    • マイクロサービスアーキテクチャのサポート
  4. リソース効率

    • VM と比較して軽量
    • 高速な起動時間
    • システムリソースの効率的な利用

デメリット

  1. 学習曲線

    • Docker の概念とコマンドの習得が必要
    • ネットワーキングとセキュリティの理解
    • トラブルシューティングスキルの必要性
  2. 複雑性の増加

    • 小規模プロジェクトでは過剰な場合がある
    • デバッグが複雑になる可能性
    • イメージサイズの管理が必要
  3. セキュリティの考慮事項

    • 適切な設定が必要
    • イメージの脆弱性管理
    • シークレット管理の複雑さ
  4. パフォーマンスオーバーヘッド

    • ネイティブ実行と比較して若干の性能低下
    • ストレージドライバーによる I/O 性能への影響
    • Windows/macOS でのファイルシステム同期の遅延

参考ページ

書き方の例

基本的な 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