𝕏 f B! L
案件・求人数 12,345
案件を探す(準備中) エージェントを探す(準備中) お役立ち情報 ログイン
案件・求人数 12,345
Claude CodeでDocker開発を効率化する方法|コンテナ化・Compose・本番運用ガイド

Claude CodeでDocker開発を効率化する方法|コンテナ化・Compose・本番運用ガイド

Claude CodeDockerコンテナ化SESエンジニア
目次
⚡ 3秒でわかる!この記事のポイント
  • Claude CodeでDockerfileとCompose設定を自動生成し開発時間を大幅短縮
  • マルチステージビルド・セキュリティ最適化まで一貫してAIがサポート
  • SES現場で即使えるコンテナ化ワークフローを実例付きで紹介

「Dockerを使いたいけど、Dockerfile の書き方がよくわからない」「Docker Composeの設定が複雑で手が止まる」「本番環境向けのコンテナ最適化をどうすればいいか…」

そんなSESエンジニアの悩みを解決するのが、Claude Code × Dockerの組み合わせです。

結論から言うと、Claude Codeを使えばDockerfile の自動生成からDocker Compose構築、マルチステージビルドの最適化、セキュリティ対策まで、コンテナ化に関するほぼすべての作業を効率化できます。手動で1時間かかっていた環境構築が、Claude Codeなら10分で完了します。

この記事はClaude Code完全攻略シリーズのEp.32として、Docker開発に特化した活用法を詳しく解説します。

この記事でわかること
  • Claude CodeでDockerfileを自動生成する方法
  • Docker Compose環境の構築テクニック
  • マルチステージビルドの最適化
  • コンテナセキュリティの自動チェック
  • SES現場での実践的なコンテナ化ワークフロー

なぜClaude Code × Dockerなのか

Claude CodeによるDocker開発ワークフロー

Docker は現代の開発現場で不可欠な技術ですが、設定ファイルの記述には多くの知識が必要です。ベースイメージの選定、レイヤーキャッシュの最適化、セキュリティ設定、ネットワーク構成——考慮すべき点が多く、経験が浅いエンジニアにとってはハードルが高い領域です。

Claude Codeは、プロジェクトのコードベースを分析し、最適なDocker設定を自動生成します。単にテンプレートを出力するのではなく、実際のコードの依存関係やビルドプロセスを理解した上で、プロダクションレディな設定を提案してくれます。

Claude Code × Dockerの3つの強み

強み詳細
コンテキスト理解package.json, requirements.txtなどから依存関係を自動解析
ベストプラクティス適用マルチステージビルド・非rootユーザー・ヘルスチェックを標準で含む
反復的改善「もっと軽量に」「セキュリティ強化して」と対話的に最適化可能

Dockerfileの自動生成

基本的なNode.jsアプリのコンテナ化

プロジェクトルートで以下のプロンプトを実行します:

# Claude Codeに最適なDockerfileを生成させる
claude "このNode.jsプロジェクトのDockerfileを作成して。
マルチステージビルドで、本番用に最適化して。
package.jsonの依存関係を分析して適切なベースイメージを選んで"

Claude Codeが生成する典型的な出力:

# ============================================
# Stage 1: 依存関係のインストール
# ============================================
FROM node:20-alpine AS deps

WORKDIR /app

# パッケージマネージャのロックファイルをコピー
COPY package.json package-lock.json ./

# プロダクション依存のみインストール
RUN npm ci --only=production && \
    npm cache clean --force

# ============================================
# Stage 2: ビルド
# ============================================
FROM node:20-alpine AS builder

WORKDIR /app

COPY package.json package-lock.json ./
RUN npm ci

# ソースコードをコピーしてビルド
COPY . .
RUN npm run build

# ============================================
# Stage 3: 本番イメージ
# ============================================
FROM node:20-alpine AS runner

# セキュリティ: 非rootユーザーで実行
RUN addgroup --system --gid 1001 nodejs && \
    adduser --system --uid 1001 appuser

WORKDIR /app

# 依存関係とビルド成果物のみコピー
COPY --from=deps /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package.json ./

# ヘルスチェック
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
  CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1

# 非rootユーザーに切り替え
USER appuser

EXPOSE 3000

CMD ["node", "dist/index.js"]

Pythonアプリのコンテナ化

claude "このPython FastAPIプロジェクトをコンテナ化して。
requirements.txtの依存関係を見て、最小限のイメージにして。
gunicornでの本番実行も含めて"
# マルチステージビルド: Python FastAPI
FROM python:3.12-slim AS builder

WORKDIR /app

# システム依存パッケージのインストール
RUN apt-get update && \
    apt-get install -y --no-install-recommends gcc && \
    rm -rf /var/lib/apt/lists/*

# 仮想環境を作成して依存関係をインストール
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 本番イメージ
FROM python:3.12-slim AS runner

# 非rootユーザー作成
RUN groupadd -r appgroup && useradd -r -g appgroup appuser

WORKDIR /app

# 仮想環境をコピー
COPY --from=builder /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"

COPY . .

# ヘルスチェック
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
  CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')" || exit 1

USER appuser

EXPOSE 8000

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

Docker Compose環境の構築

マイクロサービス構成の自動生成

claude "以下のサービス構成でdocker-compose.ymlを作成して:
- Next.jsフロントエンド(ポート3000)
- FastAPI バックエンド(ポート8000)
- PostgreSQL データベース
- Redis キャッシュ
- Nginx リバースプロキシ
開発環境と本番環境で分けて"

Claude Codeが生成する構成:

# docker-compose.yml(開発環境)
version: '3.8'

services:
  # フロントエンド
  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile.dev
    ports:
      - "3000:3000"
    volumes:
      - ./frontend:/app
      - /app/node_modules
    environment:
      - NEXT_PUBLIC_API_URL=http://localhost:8000
    depends_on:
      - backend
    networks:
      - app-network

  # バックエンド
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile.dev
    ports:
      - "8000:8000"
    volumes:
      - ./backend:/app
    environment:
      - DATABASE_URL=postgresql://user:password@db:5432/appdb
      - REDIS_URL=redis://redis:6379/0
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    networks:
      - app-network

  # データベース
  db:
    image: postgres:16-alpine
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: appdb
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d appdb"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - app-network

  # キャッシュ
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - app-network

  # リバースプロキシ
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - frontend
      - backend
    networks:
      - app-network

volumes:
  postgres-data:
  redis-data:

networks:
  app-network:
    driver: bridge

本番用のオーバーライド設定

claude "docker-compose.ymlの本番用オーバーライドファイルを作って。
リソース制限、ログ設定、再起動ポリシーを含めて"
# docker-compose.prod.yml
version: '3.8'

services:
  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile
      args:
        - NODE_ENV=production
    volumes: []  # 開発用のボリュームマウントを無効化
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
    restart: unless-stopped
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    volumes: []
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 1G
      replicas: 2
    restart: unless-stopped
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

  db:
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 2G
    restart: unless-stopped

  redis:
    deploy:
      resources:
        limits:
          cpus: '0.25'
          memory: 256M
    restart: unless-stopped
    command: redis-server --maxmemory 200mb --maxmemory-policy allkeys-lru

マルチステージビルドの最適化

イメージサイズの削減

Claude Codeに最適化を依頼する具体的な手順:

# 現在のイメージサイズを確認
docker images myapp

# Claude Codeにサイズ最適化を依頼
claude "このDockerfileのイメージサイズを最小化して。
現在800MBあるので、できれば100MB以下にしたい。
distrolessベースイメージの採用も検討して"

最適化前(800MB)→ 最適化後(45MB)の例:

# distrolessベースイメージで超軽量化
FROM golang:1.22 AS builder

WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download

COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
    go build -ldflags="-s -w" -o /app/server ./cmd/server

# 最小イメージ(シェルすら含まない)
FROM gcr.io/distroless/static-debian12:nonroot

COPY --from=builder /app/server /server
COPY --from=builder /app/configs /configs

EXPOSE 8080
ENTRYPOINT ["/server"]

ビルドキャッシュの最適化

claude "このDockerfileのビルドキャッシュを最適化して。
依存関係の変更時だけ再インストールされるようにして"
# レイヤーキャッシュを最大限活用する構成
FROM node:20-alpine AS builder

WORKDIR /app

# Step 1: パッケージ定義のみコピー(変更頻度: 低)
COPY package.json package-lock.json ./

# Step 2: 依存関係インストール(キャッシュが効く)
RUN --mount=type=cache,target=/root/.npm \
    npm ci

# Step 3: 設定ファイルをコピー(変更頻度: 中)
COPY tsconfig.json next.config.js ./

# Step 4: ソースコードをコピー(変更頻度: 高)
COPY src/ ./src/
COPY public/ ./public/

# Step 5: ビルド
RUN npm run build

コンテナセキュリティの自動チェック

脆弱性スキャンの統合

claude "このDockerfileにセキュリティのベストプラクティスを適用して。
脆弱性スキャンも含めたCI/CDパイプラインも提案して"

Claude Codeが提案するセキュリティチェックリスト:

# .github/workflows/docker-security.yml
name: Docker Security Scan

on:
  push:
    paths:
      - 'Dockerfile*'
      - 'docker-compose*.yml'

jobs:
  security-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Build image
        run: docker build -t myapp:scan .

      - name: Trivy vulnerability scan
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: 'myapp:scan'
          format: 'sarif'
          output: 'trivy-results.sarif'
          severity: 'CRITICAL,HIGH'

      - name: Hadolint(Dockerfile linting)
        uses: hadolint/[email protected]
        with:
          dockerfile: Dockerfile

      - name: Dockle(ベストプラクティスチェック)
        uses: erzz/dockle-action@v1
        with:
          image: 'myapp:scan'
          failure-threshold: 'WARN'

セキュリティ対策の自動適用

Claude Codeにセキュリティ強化を依頼すると、以下のような改善を自動で行います:

# セキュリティ強化済みDockerfile
FROM node:20-alpine AS runner

# 1. 不要なパッケージを削除
RUN apk --no-cache add dumb-init && \
    rm -rf /var/cache/apk/*

# 2. 非rootユーザーで実行
RUN addgroup -g 1001 -S appgroup && \
    adduser -S appuser -u 1001 -G appgroup

# 3. ファイルの所有権を明示
COPY --chown=appuser:appgroup --from=builder /app/dist ./dist
COPY --chown=appuser:appgroup --from=deps /app/node_modules ./node_modules

# 4. 読み取り専用ファイルシステム対応
RUN mkdir -p /tmp/app && chown appuser:appgroup /tmp/app
ENV TMPDIR=/tmp/app

# 5. シグナルハンドリング(graceful shutdown)
ENTRYPOINT ["dumb-init", "--"]

USER appuser

CMD ["node", "dist/index.js"]

SES現場での実践ワークフロー

案件参画初日のDocker環境構築

SES案件に参画した初日、開発環境のセットアップにDockerを使う典型的なシナリオ:

# Step 1: リポジトリをクローン
git clone https://github.com/company/project.git
cd project

# Step 2: Claude Codeで環境を理解
claude "このプロジェクトの構成を分析して、
Docker環境を構築して。READMEに書かれていない
暗黙の依存関係も検出して含めて"

# Step 3: Claude Codeが生成したdocker-compose.ymlで起動
docker compose up -d

# Step 4: 動作確認
claude "docker compose logsを確認して、
エラーがあれば修正して"

既存プロジェクトのコンテナ移行

レガシープロジェクトをDockerに移行する場合:

claude "このプロジェクトをDockerに移行したい。
現在の構成:
- Java 17 Spring Bootアプリ
- MySQL 8.0
- Redis
- 環境変数がハードコードされている

以下を実施して:
1. Dockerfileを作成(Gradleビルド対応)
2. docker-compose.ymlを作成
3. 環境変数を.env.exampleに抽出
4. READMEにDocker起動手順を追記"

よく使うClaude Codeプロンプト集

シチュエーションプロンプト例
イメージが大きい「このDockerfileのイメージサイズを半分以下にして」
ビルドが遅い「ビルドキャッシュを最適化してビルド時間を短縮して」
本番デプロイ「Kubernetes用のマニフェストも一緒に生成して」
デバッグ「コンテナが起動しない原因を調査して。docker logsの出力はこれ:…」
セキュリティ「このDockerfileのセキュリティを監査して改善して」

トラブルシューティング

よくあるDockerエラーとClaude Codeでの解決

エラー1: ポートの競合

# エラー: Bind for 0.0.0.0:3000 failed: port is already allocated
claude "ポート3000が使用中でDockerが起動しない。
使用中のプロセスを特定して、docker-compose.ymlの
ポートマッピングを変更して"

エラー2: メモリ不足

# Node.jsアプリのOOM
claude "Dockerコンテナ内のNode.jsアプリがOOM Killerで停止する。
メモリ制限の設定とNode.jsのヒープサイズ調整をして"

エラー3: ボリュームの権限問題

# Permission denied
claude "Dockerボリュームマウントで権限エラーが出る。
ホストとコンテナのUID/GIDを合わせる設定にして"

Docker開発におけるClaude Codeの料金目安

作業内容所要時間Claude Code使用量手動との比較
Dockerfile生成2分約$0.0530分→2分
Compose構築5分約$0.101時間→5分
セキュリティ監査3分約$0.082時間→3分
トラブルシューティング5分約$0.101時間→5分

SES案件での市場価値

Docker/コンテナ技術のスキルはSES市場で非常に高い需要があります:

  • Docker基本操作 → 多くの案件で必須スキル
  • Docker Compose構築 → 月額5〜10万円のスキルアップ要素
  • Kubernetes連携 → 月額70〜100万円の高単価案件で必須
  • コンテナセキュリティ → セキュリティ案件で差別化ポイント

まとめ

Claude Code × Dockerの組み合わせは、コンテナ化のあらゆるフェーズを効率化します。

この記事のまとめ
  • Claude CodeでDockerfileを自動生成し、開発環境構築を大幅時短
  • マルチステージビルド・キャッシュ最適化で本番品質のイメージを作成
  • セキュリティのベストプラクティスを自動適用
  • Docker Compose構成も対話的に構築・改善
  • SES現場でのコンテナスキルは高単価案件への直結スキル

Claude Code完全攻略シリーズの他の記事も合わせてご覧ください:

SES案件をお探しですか?

SES記事をもっと読む →
🏗️

SES BASE 編集長

SES業界歴10年以上のメンバーが在籍する編集チーム。SES企業での営業・エンジニア経験、フリーランス独立経験を持つメンバーが、業界のリアルな情報をお届けします。

📊 業界データに基づく記事制作 🔍 IPA・経済産業省データ参照 💼 SES実務経験者が執筆・監修