コンテナ化開発環境プロジェクトテンプレート:言語・フレームワーク別完全ガイド

コンテナ化開発環境プロジェクトテンプレート:言語・フレームワーク別完全ガイド

コンテナ化開発環境の基礎を理解したら、次は実際のプロジェクトに特化した環境を構築しましょう。この記事では、Python データサイエンス、Web API、フルスタック開発など、具体的なプロジェクト要件に合わせた完全なテンプレートを提供します。

すぐに使える実践的な設定ファイルとベストプラクティスにより、チーム開発で即座に活用できる環境を手に入れることができます。

記事の前提知識

この記事は現代開発者のためのコンテナ化環境構築の続編です。以下の知識があることを前提としています:

  • Docker Engine の基本操作
  • Docker Compose の基本構成
  • VS Code DevContainer の基本設定
  • マルチステージビルドの理解

言語・フレームワーク別ベストプラクティス

Python データ分析環境の特化設定

データ分析や機械学習プロジェクトに特化したDocker環境です。Jupyter Lab、科学計算ライブラリ、GPUサポートなどを統合しています:

{
  "name": "Python Data Science Environment",
  "dockerComposeFile": "../docker-compose.yml",
  "service": "app",
  "workspaceFolder": "/app",

  "customizations": {
    "vscode": {
      "settings": {
        // データサイエンス特化設定
        "python.analysis.extraPaths": [
          "/app/src",
          "/app/notebooks"
        ],
        "jupyter.notebookFileRoot": "${workspaceFolder}/notebooks",
        "python.analysis.autoImportCompletions": true,

        // ノートブック設定
        "notebook.cellToolbarLocation": {
          "default": "right",
          "jupyter-notebook": "left"
        },
        "notebook.output.textLineLimit": 30,
        "notebook.formatOnSave.enabled": true,

        // データプレビュー設定
        "data-preview.theme": "auto",
        "csv-preview.lineNumbers": "source",
        "csv-preview.resizeColumns": "all"
      },

      "extensions": [
        // データサイエンス専用拡張機能
        "ms-toolsai.jupyter",
        "ms-toolsai.jupyter-keymap", 
        "ms-toolsai.jupyter-renderers",
        "ms-toolsai.datawrangler",
        "RandomFractalsInc.vscode-data-preview",
        "mechatroner.rainbow-csv",

        // 統計・可視化
        "ms-python.python",
        "ms-python.vscode-pylance",
        "kevinrose.vsc-python-indent",

        // プロジェクト管理
        "ms-vscode.vscode-json",
        "redhat.vscode-yaml"
      ]
    }
  },

  "forwardPorts": [8888, 8889, 5432, 6379],
  "portsAttributes": {
    "8888": {
      "label": "Jupyter Lab",
      "onAutoForward": "openBrowser"
    }
  }
}

FastAPI Web API環境の特化設定

Web API開発に最適化されたDevContainer設定です。API開発、テスト、データベース管理に必要なツールを統合しています:

{
  "name": "FastAPI Development Environment", 
  "dockerComposeFile": "../docker-compose.yml",
  "service": "app",
  "workspaceFolder": "/app",

  "customizations": {
    "vscode": {
      "settings": {
        // FastAPI特化設定
        "python.analysis.extraPaths": ["/app/src"],
        "python.testing.pytestArgs": [
          "tests/",
          "-v",
          "--cov=src/",
          "--cov-report=html"
        ],

        // OpenAPI設定
        "rest-client.environmentVariables": {
          "development": {
            "baseUrl": "http://localhost:8000",
            "token": "dev-token"
          }
        }
      },

      "extensions": [
        // Web開発専用拡張機能
        "ms-python.python",
        "ms-python.vscode-pylance",
        "ms-python.black-formatter",

        // API開発・テスト
        "humao.rest-client",
        "42Crunch.vscode-openapi",
        "Postman.postman-for-vscode",

        // データベース管理
        "ms-mssql.mssql",
        "ckolkman.vscode-postgres",

        // フロントエンド統合(必要に応じて)
        "bradlc.vscode-tailwindcss",
        "ms-vscode.vscode-typescript-next"
      ]
    }
  },

  "forwardPorts": [8000, 5432, 6379],
  "portsAttributes": {
    "8000": {
      "label": "FastAPI Server",
      "onAutoForward": "openBrowser"
    }
  }
}

カスタム拡張機能とツールチェーン

開発ワークフローをさらに最適化するためのカスタム設定です。カスタムコマンド、キーバインド、スニペットなどを設定して、個人の開発スタイルに合わせた環境を構築できます:

{
  "customizations": {
    "vscode": {
      "settings": {
        //======================================================================
        // カスタムコマンド設定
        //======================================================================
        "terminal.integrated.profiles.linux": {
          "dev-shell": {
            "path": "/bin/bash",
            "args": ["-c", "source /app/scripts/dev-aliases.sh && bash"]
          }
        },

        // タスク自動化設定
        "python.terminal.executeInFileDir": true,
        "code-runner.executorMap": {
          "python": "cd $dir && python -u $fileName"
        },

        // スニペット設定
        "editor.suggest.snippetsPreventQuickSuggestions": false,
        "editor.tabCompletion": "on"
      },

      // カスタムキーバインド
      "keybindings": [
        {
          "key": "ctrl+shift+t",
          "command": "python.execInTerminal"
        },
        {
          "key": "ctrl+shift+d",
          "command": "python.debugInTerminal"
        }
      ]
    }
  }
}

開発用エイリアス・スクリプト:

日常の開発作業で頻繁に使用するコマンドを簡単なエイリアスで実行できるようにするスクリプトです。コンテナ起動時に自動読み込みされます:

#!/bin/bash
# scripts/dev-aliases.sh - 開発効率向上のエイリアス

# よく使うコマンドのエイリアス
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# プロジェクト固有のエイリアス
alias runserver='python -m uvicorn src.main:app --reload --host 0.0.0.0'
alias test='python -m pytest tests/ -v'
alias testcov='python -m pytest tests/ --cov=src/ --cov-report=html'
alias format='black src/ tests/ && isort src/ tests/'
alias lint='pylint src/ && flake8 src/ tests/'
alias typecheck='mypy src/'

# データベース操作
alias dbshell='psql $DATABASE_URL'
alias dbreset='alembic downgrade base && alembic upgrade head'
alias dbmigrate='alembic revision --autogenerate -m'

# Docker操作
alias dclogs='docker compose logs -f'
alias dcrestart='docker compose restart'
alias dcrebuild='docker compose down && docker compose up --build -d'

# Jupyter操作
alias notebook='jupyter lab --ip=0.0.0.0 --allow-root --no-browser'

# Git操作の簡略化
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git push'
alias gl='git log --oneline -10'

echo "🛠️  開発用エイリアスを読み込みました"
echo "主要コマンド: runserver, test, testcov, format, lint, typecheck"

実戦プロジェクト構築

この章では、3つの実践的なプロジェクト例を実装します:

実装するプロジェクト:

  • データ分析環境: Jupyter + PostgreSQL + Redis による分析基盤
  • Web API環境: FastAPI + PostgreSQL + 認証システム
  • フルスタック環境: React + FastAPI + PostgreSQL

各プロジェクトは実際のビジネス要件を想定した本格的な構成です。

Python データ分析環境の完全コンテナ化

プロジェクト構成と要件

実際のデータサイエンスプロジェクトを想定した環境:

  • 大量データの効率的な処理
  • 可視化とレポート生成
  • チーム間でのノートブック共有
  • 本番環境へのモデルデプロイ対応

プロジェクト構造:

data-analysis-project/
├── 📄 Dockerfile                      # マルチステージビルド設定
├── 📄 docker-compose.yml              # 開発環境オーケストレーション
├── 📄 docker-compose.prod.yml         # 本番環境設定
├── 📁 .devcontainer/
│   ├── 📄 devcontainer.json          # VS Code DevContainer設定
│   └── 📄 Dockerfile                 # DevContainer専用イメージ
├── 📄 pyproject.toml                  # Poetry依存関係管理
├── 📄 .env.example                    # 環境変数テンプレート
├── 📁 src/
│   ├── 📄 __init__.py
│   ├── 📄 config.py                  # 設定管理
│   ├── 📄 database.py                # DB接続・ORM設定
│   ├── 📁 models/                    # データモデル定義
│   ├── 📁 analysis/                  # 分析ロジック
│   ├── 📁 visualization/             # 可視化機能
│   └── 📁 utils/                     # ユーティリティ
├── 📁 notebooks/                      # Jupyter ノートブック
│   ├── 📁 exploratory/               # 探索的データ分析
│   ├── 📁 reports/                   # レポート生成
│   └── 📁 experiments/               # 実験・プロトタイプ
├── 📁 data/
│   ├── 📁 raw/                       # 生データ
│   ├── 📁 processed/                 # 処理済みデータ
│   ├── 📁 external/                  # 外部データソース
│   └── 📁 outputs/                   # 分析結果・レポート
├── 📁 tests/                         # テストコード
├── 📁 scripts/
│   ├── 📄 setup.sh                   # 環境セットアップ
│   ├── 📄 data-pipeline.py           # データパイプライン
│   ├── 📄 health-check.py            # ヘルスチェック
│   └── 📄 deploy.sh                  # デプロイスクリプト
└── 📁 docs/                          # プロジェクトドキュメント

Poetry設定(pyproject.toml):

データサイエンスプロジェクトに必要な依存ライブラリとツールを定義したPoetry設定ファイルです。科学計算ライブラリから機械学習フレームワークまでを網羅しています:

[tool.poetry]
name = "data-analysis-project"
version = "0.1.0"
description = "コンテナ化データ分析環境"
authors = ["Your Name <your.email@example.com>"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.11"

# 科学計算・データ処理
numpy = "^1.24.0"
pandas = "^2.0.0"
scipy = "^1.10.0"
scikit-learn = "^1.3.0"

# 可視化
matplotlib = "^3.7.0"
seaborn = "^0.12.0"
plotly = "^5.14.0"
bokeh = "^3.1.0"

# Jupyter環境
jupyter = "^1.0.0"
jupyterlab = "^4.0.0"
ipywidgets = "^8.0.0"
jupyter-dash = "^0.4.0"

# データベース・ORM
sqlalchemy = "^2.0.0"
psycopg2-binary = "^2.9.0"
alembic = "^1.11.0"

# 機械学習・深層学習
tensorflow = "^2.13.0"
torch = "^2.0.0"
xgboost = "^1.7.0"
lightgbm = "^3.3.0"

# データ取得・処理
requests = "^2.31.0"
beautifulsoup4 = "^4.12.0"
aiohttp = "^3.8.0"

# 設定・環境管理
python-dotenv = "^1.0.0"
pydantic = "^2.0.0"
typer = "^0.9.0"

[tool.poetry.group.dev.dependencies]
# テスト
pytest = "^7.4.0"
pytest-cov = "^4.1.0"
pytest-asyncio = "^0.21.0"

# コード品質
black = "^23.7.0"
isort = "^5.12.0"
flake8 = "^6.0.0"
mypy = "^1.5.0"
pylint = "^2.17.0"

# 開発ツール
pre-commit = "^3.3.0"
jupyter-contrib-nbextensions = "^0.7.0"
nbstripout = "^0.6.0"

# プロファイリング・パフォーマンス
memory-profiler = "^0.61.0"
line-profiler = "^4.0.0"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

# ツール設定
[tool.black]
line-length = 88
target-version = ['py311']
include = '.pyi?$'
extend-exclude = '''
/(
  | notebooks/.*.ipynb
)/
'''

[tool.isort]
profile = "black"
multi_line_output = 3
line_length = 88
known_first_party = ["src"]

[tool.mypy]
python_version = "3.11"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true
exclude = ["notebooks/"]

[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
addopts = [
    "-v",
    "--strict-markers",
    "--strict-config",
    "--cov=src",
    "--cov-report=term-missing",
    "--cov-report=html",
    "--cov-fail-under=80"
]

データサイエンス特化Dockerfile:

GPU対応とJupyter Lab統合を含む、データサイエンス作業に最適化されたマルチステージDockerfileです:

# Dockerfile - データサイエンス特化マルチステージビルド
# GPU対応、Jupyter Lab統合、大容量データ処理対応

#==============================================================================
# ベースイメージ: CUDA対応Python(GPU使用時)
#==============================================================================
FROM nvidia/cuda:11.8-runtime-ubuntu22.04 as base-gpu
# GPU不要な場合は以下を使用
# FROM python:3.11-slim as base

# システムレベルの依存関係とGPUサポート
RUN apt-get update && apt-get install -y 
    # 基本開発ツール
    build-essential 
    curl 
    git 
    wget 
    unzip 
    # 科学計算ライブラリ用
    libblas-dev 
    liblapack-dev 
    libhdf5-dev 
    libffi-dev 
    # データベース接続
    libpq-dev 
    # 画像・動画処理
    libopencv-dev 
    ffmpeg 
    # LaTeX(レポート生成用)
    texlive-latex-extra 
    texlive-fonts-recommended 
    pandoc 
    && rm -rf /var/lib/apt/lists/* 
    && apt-get clean

# Poetryのインストール
ENV POETRY_HOME="/opt/poetry"
ENV POETRY_PATH="$POETRY_HOME/bin"
ENV PATH="$POETRY_PATH:$PATH"
RUN curl -sSL https://install.python-poetry.org | python3 -
RUN poetry config virtualenvs.create false

# Node.js(Jupyter拡張機能用)
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - 
    && apt-get install -y nodejs

WORKDIR /app

#==============================================================================
# 開発環境ステージ
#==============================================================================
FROM base-gpu as development

# 依存関係ファイルのコピーとインストール
COPY pyproject.toml poetry.lock ./
RUN poetry install --with dev

# Jupyter Lab拡張機能のインストール
RUN jupyter labextension install @jupyter-widgets/jupyterlab-manager 
    && jupyter labextension install jupyter-matplotlib 
    && jupyter labextension install @bokeh/jupyter_bokeh

# 開発用設定
ENV PYTHONPATH=/app
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV ENVIRONMENT=development
ENV JUPYTER_ENABLE_LAB=yes

# GPUサポート設定(NVIDIA GPU使用時)
ENV NVIDIA_VISIBLE_DEVICES=all
ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility

# ポート公開
EXPOSE 8888 8889 8000

# 開発用エントリーポイント
COPY scripts/entrypoint.dev.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--allow-root", "--no-browser"]

#==============================================================================
# 本番環境ステージ(推論API用)
#==============================================================================
FROM base-gpu as production

# 本番用依存関係のみインストール
COPY pyproject.toml poetry.lock ./
RUN poetry install --only main --no-dev

# アプリケーションコードのコピー
COPY src/ /app/src/
COPY scripts/entrypoint.prod.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# 本番用環境変数
ENV PYTHONPATH=/app
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV ENVIRONMENT=production

# セキュリティ: 非rootユーザーで実行
RUN adduser --disabled-password --gecos '' appuser 
    && chown -R appuser:appuser /app
USER appuser

EXPOSE 8000

ENTRYPOINT ["/entrypoint.sh"]
CMD ["python", "-m", "uvicorn", "src.api.main:app", "--host", "0.0.0.0", "--port", "8000"]

Docker Compose設定(データサイエンス用):

データ分析作業に必要な全てのサービスを統合したDocker Compose設定です。Jupyter Lab、データベース、キャッシュ、可視化ツールを含みます:

# docker-compose.yml - データサイエンス統合環境
services:
  #============================================================================
  # Jupyter Lab + Python 分析環境
  #============================================================================
  jupyter:
    build:
      context: .
      target: development
    container_name: ds-jupyter
    environment:
      - DATABASE_URL=postgresql://dsuser:dspass@postgres:5432/analytics
      - REDIS_URL=redis://redis:6379
      - JUPYTER_TOKEN=your-secure-token
    volumes:
      - .:/app
      - jupyter-data:/root/.jupyter
      - ./data:/app/data
      - ./notebooks:/app/notebooks
      - ./outputs:/app/outputs
    ports:
      - "8888:8888"  # Jupyter Lab
      - "8889:8889"  # Jupyter Notebook
      - "8000:8000"  # API Server
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_started
    # GPU使用時のリソース設定
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    networks:
      - ds-network

  #============================================================================
  # PostgreSQL データベース
  #============================================================================
  postgres:
    image: postgres:15
    container_name: ds-postgres
    environment:
      POSTGRES_DB: analytics
      POSTGRES_USER: dsuser
      POSTGRES_PASSWORD: dspass
      POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --locale=en_US.UTF-8"
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - ./sql/init:/docker-entrypoint-initdb.d
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U dsuser -d analytics"]
      interval: 5s
      timeout: 5s
      retries: 5
    networks:
      - ds-network

  #============================================================================
  # Redis キャッシュ
  #============================================================================
  redis:
    image: redis:7-alpine
    container_name: ds-redis
    command: redis-server --appendonly yes
    volumes:
      - redis-data:/data
    ports:
      - "6379:6379"
    networks:
      - ds-network

  #============================================================================
  # MLflow 実験追跡
  #============================================================================
  mlflow:
    image: python:3.11-slim
    container_name: ds-mlflow
    command: >
      bash -c "
        pip install mlflow psycopg2-binary &&
        mlflow server 
          --backend-store-uri postgresql://dsuser:dspass@postgres:5432/analytics
          --artifacts-destination /app/artifacts
          --host 0.0.0.0
          --port 5000
      "
    volumes:
      - ./mlflow-artifacts:/app/artifacts
    ports:
      - "5000:5000"
    depends_on:
      postgres:
        condition: service_healthy
    networks:
      - ds-network

  #============================================================================
  # Apache Superset (BI・可視化)
  #============================================================================
  superset:
    image: apache/superset:2.1.0
    container_name: ds-superset
    environment:
      - SUPERSET_SECRET_KEY=your-secret-key-here
      - SQLALCHEMY_DATABASE_URI=postgresql://dsuser:dspass@postgres:5432/analytics
    volumes:
      - superset-data:/app/superset_home
    ports:
      - "8088:8088"
    depends_on:
      postgres:
        condition: service_healthy
    networks:
      - ds-network

#==============================================================================
# データ永続化
#==============================================================================
volumes:
  postgres-data:
    driver: local
  redis-data:
    driver: local
  jupyter-data:
    driver: local
  superset-data:
    driver: local

#==============================================================================
# ネットワーク設定
#==============================================================================
networks:
  ds-network:
    driver: bridge

FastAPI Web API プロジェクトテンプレート

プロジェクト要件と構成

本格的なWeb APIサービスの開発環境:

  • 高性能なREST API開発
  • 認証・認可システム
  • 自動APIドキュメント生成
  • 包括的テストスイート
  • CI/CD パイプライン統合

FastAPI特化pyproject.toml:

Web API開発に必要な全てのライブラリとツールを含むPoetry設定です。FastAPI、認証、テスト、デプロイメントまでカバーしています:

[tool.poetry]
name = "fastapi-project"
version = "0.1.0"
description = "コンテナ化FastAPI Web API"
authors = ["Your Name <your.email@example.com>"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.11"

# Web フレームワーク
fastapi = "^0.103.0"
uvicorn = {extras = ["standard"], version = "^0.23.0"}

# データベース・ORM
sqlalchemy = "^2.0.0"
alembic = "^1.11.0"
psycopg2-binary = "^2.9.0"

# 認証・セキュリティ
python-jose = {extras = ["cryptography"], version = "^3.3.0"}
passlib = {extras = ["bcrypt"], version = "^1.7.0"}
python-multipart = "^0.0.6"

# 設定・バリデーション
pydantic = {extras = ["email"], version = "^2.0.0"}
pydantic-settings = "^2.0.0"
python-dotenv = "^1.0.0"

# HTTP・API
httpx = "^0.24.0"
requests = "^2.31.0"
aiofiles = "^23.1.0"

# キャッシュ・セッション
redis = "^4.6.0"
python-redis = "^4.6.0"

# ログ・監視
structlog = "^23.1.0"
prometheus-client = "^0.17.0"

# 日時処理
python-dateutil = "^2.8.0"
pytz = "^2023.3"

[tool.poetry.group.dev.dependencies]
# テスト
pytest = "^7.4.0"
pytest-asyncio = "^0.21.0"
pytest-cov = "^4.1.0"
httpx = "^0.24.0"
factory-boy = "^3.3.0"
faker = "^19.3.0"

# コード品質
black = "^23.7.0"
isort = "^5.12.0"
flake8 = "^6.0.0"
mypy = "^1.5.0"
pylint = "^2.17.0"

# 開発ツール
pre-commit = "^3.3.0"
watchfiles = "^0.19.0"

# API開発・テスト
openapi-generator-cli = "^4.3.0"

# デバッグ・プロファイリング
debugpy = "^1.6.0"
py-spy = "^0.3.0"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

# ツール設定
[tool.black]
line-length = 88
target-version = ['py311']
include = '.pyi?$'

[tool.isort]
profile = "black"
multi_line_output = 3
line_length = 88
known_first_party = ["src", "tests"]

[tool.mypy]
python_version = "3.11"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true
plugins = ["pydantic.mypy"]

[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
addopts = [
    "-v",
    "--strict-markers",
    "--strict-config",
    "--cov=src",
    "--cov-report=term-missing",
    "--cov-report=html",
    "--cov-fail-under=90"
]
asyncio_mode = "auto"

FastAPI Dockerfileテンプレート:

高性能なWeb API本番運用を考慮したマルチステージDockerfileです。開発効率と本番パフォーマンスを両立します:

# Dockerfile - FastAPI本番グレード設定
FROM python:3.11-slim as base

# システムレベルの依存関係
RUN apt-get update && apt-get install -y 
    # ビルドツール
    build-essential 
    curl 
    git 
    # データベース
    libpq-dev 
    # セキュリティ
    ca-certificates 
    # プロセス管理
    supervisor 
    && rm -rf /var/lib/apt/lists/* 
    && apt-get clean

# Poetryインストール
ENV POETRY_HOME="/opt/poetry"
ENV POETRY_PATH="$POETRY_HOME/bin"
ENV PATH="$POETRY_PATH:$PATH"
RUN curl -sSL https://install.python-poetry.org | python3 -
RUN poetry config virtualenvs.create false

WORKDIR /app

#==============================================================================
# 開発環境ステージ
#==============================================================================
FROM base as development

# 開発用依存関係の完全インストール
COPY pyproject.toml poetry.lock ./
RUN poetry install --with dev

# 開発用環境変数
ENV PYTHONPATH=/app
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV ENVIRONMENT=development
ENV FASTAPI_ENV=development

EXPOSE 8000 5678

# 開発用エントリーポイント(ホットリロード有効)
COPY scripts/entrypoint.dev.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]
CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]

#==============================================================================
# 本番環境ステージ
#==============================================================================
FROM base as production

# 本番用依存関係のみ
COPY pyproject.toml poetry.lock ./
RUN poetry install --only main --no-dev

# アプリケーションコードのコピー
COPY src/ /app/src/
COPY alembic/ /app/alembic/
COPY alembic.ini /app/
COPY scripts/entrypoint.prod.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# 本番用環境変数
ENV PYTHONPATH=/app
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV ENVIRONMENT=production
ENV FASTAPI_ENV=production

# セキュリティ設定
RUN adduser --disabled-password --gecos '' fastapi 
    && chown -R fastapi:fastapi /app
USER fastapi

# ヘルスチェック
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 
    CMD curl -f http://localhost:8000/health || exit 1

EXPOSE 8000

ENTRYPOINT ["/entrypoint.sh"]
CMD ["gunicorn", "src.main:app", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "--bind", "0.0.0.0:8000"]

CI/CD統合とGitHub Actions

GitHub Actions ワークフロー

コンテナ化開発環境との完全統合を実現するGitHub Actionsワークフローです。テスト、ビルド、デプロイまでを自動化します:

# .github/workflows/ci-cd.yml
name: CI/CD Pipeline

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  #============================================================================
  # テスト・品質チェック
  #============================================================================
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: [3.9, 3.10, 3.11]

    services:
      postgres:
        image: postgres:15
        env:
          POSTGRES_PASSWORD: postgres
          POSTGRES_DB: test_db
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 5432:5432

      redis:
        image: redis:7
        options: >-
          --health-cmd "redis-cli ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 6379:6379

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v4
      with:
        python-version: ${{ matrix.python-version }}

    - name: Install Poetry
      uses: snok/install-poetry@v1
      with:
        version: latest
        virtualenvs-create: true
        virtualenvs-in-project: true

    - name: Load cached venv
      id: cached-poetry-dependencies
      uses: actions/cache@v3
      with:
        path: .venv
        key: venv-${{ runner.os }}-${{ matrix.python-version }}-${{ hashFiles('**/poetry.lock') }}

    - name: Install dependencies
      if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'
      run: poetry install --with dev

    - name: Code quality checks
      run: |
        poetry run black --check .
        poetry run isort --check-only .
        poetry run flake8 .
        poetry run mypy src/

    - name: Run tests
      run: poetry run pytest --cov=src/ --cov-report=xml
      env:
        DATABASE_URL: postgresql://postgres:postgres@localhost:5432/test_db
        REDIS_URL: redis://localhost:6379
        SECRET_KEY: test-secret-key

    - name: Upload coverage to Codecov
      uses: codecov/codecov-action@v3
      with:
        file: ./coverage.xml
        flags: unittests
        name: codecov-umbrella

  #============================================================================
  # Docker ビルド・公開
  #============================================================================
  build-and-push:
    needs: test
    runs-on: ubuntu-latest
    if: github.event_name == 'push'

    permissions:
      contents: read
      packages: write

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v2

    - name: Log in to Container Registry
      uses: docker/login-action@v2
      with:
        registry: ${{ env.REGISTRY }}
        username: ${{ github.actor }}
        password: ${{ secrets.GITHUB_TOKEN }}

    - name: Extract metadata
      id: meta
      uses: docker/metadata-action@v4
      with:
        images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
        tags: |
          type=ref,event=branch
          type=ref,event=pr
          type=sha,prefix={{branch}}-
          type=raw,value=latest,enable={{is_default_branch}}

    - name: Build and push Docker image
      uses: docker/build-push-action@v4
      with:
        context: .
        platforms: linux/amd64,linux/arm64
        push: true
        tags: ${{ steps.meta.outputs.tags }}
        labels: ${{ steps.meta.outputs.labels }}
        target: production
        cache-from: type=gha
        cache-to: type=gha,mode=max

  #============================================================================
  # セキュリティスキャン
  #============================================================================
  security:
    needs: build-and-push
    runs-on: ubuntu-latest
    if: github.event_name == 'push'

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Run Trivy vulnerability scanner
      uses: aquasecurity/trivy-action@master
      with:
        image-ref: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
        format: 'sarif'
        output: 'trivy-results.sarif'

    - name: Upload Trivy scan results to GitHub Security tab
      uses: github/codeql-action/upload-sarif@v2
      with:
        sarif_file: 'trivy-results.sarif'

  #============================================================================
  # 本番デプロイ(mainブランチのみ)
  #============================================================================
  deploy:
    needs: [test, build-and-push, security]
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    environment: production

    steps:
    - name: Deploy to production
      run: |
        echo "🚀 本番環境へのデプロイを実行"
        # ここに実際のデプロイスクリプトを記述
        # 例: kubectl apply, docker-compose up, etc.

セキュリティ・本番運用考慮事項

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

本番環境でのセキュリティを確保するための重要な設定と監視項目です:

セキュリティ強化Dockerfile:

# セキュリティ強化された本番用Dockerfile
FROM python:3.11-slim as base

# セキュリティアップデート
RUN apt-get update && apt-get upgrade -y 
    && apt-get install -y --no-install-recommends 
        tini 
        ca-certificates 
    && rm -rf /var/lib/apt/lists/* 
    && apt-get clean

# 非特権ユーザーの作成
RUN groupadd -r appgroup 
    && useradd -r -g appgroup -d /app -s /bin/bash appuser

# ファイルシステムの読み取り専用設定
RUN mkdir -p /app/tmp /app/logs 
    && chown -R appuser:appgroup /app 
    && chmod 755 /app

# セキュリティ設定
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV PATH="/app/.local/bin:$PATH"

WORKDIR /app
USER appuser

# ヘルスチェック
HEALTHCHECK --interval=30s --timeout=10s --retries=3 
    CMD curl -f http://localhost:8000/health || exit 1

# Tiniプロセスマネージャーの使用
ENTRYPOINT ["tini", "--"]

secrets管理とDocker Compose:

# docker-compose.prod.yml - 本番環境設定
version: '3.8'

services:
  app:
    image: myapp:latest
    read_only: true
    tmpfs:
      - /tmp
      - /app/tmp
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
    security_opt:
      - no-new-privileges:true
    user: "1000:1000"
    environment:
      - DATABASE_URL_FILE=/run/secrets/db_url
      - SECRET_KEY_FILE=/run/secrets/secret_key
    secrets:
      - db_url
      - secret_key
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: '0.5'
        reservations:
          memory: 256M
          cpus: '0.25'

secrets:
  db_url:
    external: true
  secret_key:
    external: true

トラブルシューティング・運用ガイド

よくある問題と解決策

パフォーマンス最適化:

#!/bin/bash
# scripts/performance-check.sh - パフォーマンス診断

echo "🔍 コンテナリソース使用状況"
docker stats --no-stream

echo "📊 イメージサイズ分析"
docker images --format "table {{.Repository}}t{{.Tag}}t{{.Size}}"

echo "🗄️ ボリューム使用量"
docker system df

echo "🚿 未使用リソースのクリーンアップ"
docker system prune -f
docker volume prune -f

ログ管理と監視:

# docker-compose.monitoring.yml
services:
  app:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
        labels: "service,environment"

  prometheus:
    image: prom/prometheus:latest
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin

まとめ

この記事では、言語・フレームワーク別に特化したコンテナ化開発環境の実践的なテンプレートを提供しました。

習得した技術

プロジェクト特化設定:

  • Python データサイエンス環境(Jupyter + GPU対応)
  • FastAPI Web API環境(認証・API統合)
  • カスタム開発ツールチェーン

本番運用技術:

  • CI/CD パイプライン統合
  • セキュリティ強化設定
  • パフォーマンス最適化
  • 監視・ログ管理

実践的なベストプラクティス:

  • マルチステージビルド活用
  • 環境別設定管理
  • チーム開発標準化
  • トラブルシューティング

継続的な学習

これらのテンプレートを基盤として、以下の分野でさらに専門性を深めることをお勧めします:

  1. Kubernetes: コンテナオーケストレーション
  2. Service Mesh: マイクロサービス間通信
  3. Observability: 分散トレーシング・監視
  4. GitOps: インフラのコード化
  5. セキュリティ: ゼロトラスト・コンテナセキュリティ

このガイドのテンプレートを活用して、効率的で安全な開発環境を構築し、チーム全体の生産性向上を実現してください。

ご質問やご意見がありましたら、お問い合わせページからお気軽にご連絡ください!


関連記事:

コメントする