mcpField
D
docker

docker

github.com/claude-dev-suiteクラウド・DevOps4651 回インストール3 日前に更新
リポジトリ

docker について

dockerは、Dockerコンテナの構築と運用に関するリファレンススキルです。Dockerfileの例、基本コマンド、セキュリティと本番環境の指針、トラブルシューティングを提供します。

主な機能

  1. 01Node.jsとPythonのDockerfile例
  2. 02ビルドと実行コマンドの参照
  3. 03コンテナのセキュリティ指針
  4. 04本番運用のチェックリスト
  5. 05Dockerの一般的な問題の診断

活用シーン

  1. 01Node.jsまたはPythonアプリのDockerfile作成
  2. 02本番環境への移行前の設定確認
  3. 03ビルドや実行時の問題の診断

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/claude-dev-suite/claude-dev-suite --skill docker

インストール後、Claude Code で/dockerを入力して読み込まれたか確認します。

同梱ファイルquick-ref/commands.mdquick-ref/dockerfile.md

詳細

Docker の基礎知識

深い知識:包括的なドキュメントを参照するには、テクノロジーに docker を指定して mcp__documentation__fetch_docs を使用してください。

Dockerfile(Node.js)

# Build stage
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Production stage
FROM node:20-alpine
WORKDIR /app
ENV NODE_ENV=production

COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package*.json ./

USER node
EXPOSE 3000
CMD ["node", "dist/index.js"]

Dockerfile(Python)

FROM python:3.12-slim

WORKDIR /app

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

COPY . .

USER nobody
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

よく使うコマンド

# Build
docker build -t myapp:latest .
docker build -f Dockerfile.prod -t myapp:prod .

# Run
docker run -d -p 3000:3000 --name myapp myapp:latest
docker run --env-file .env myapp:latest

# Manage
docker ps                    # List running
docker logs myapp           # View logs
docker exec -it myapp sh    # Shell access
docker stop myapp           # Stop container
docker rm myapp             # Remove container

# Images
docker images               # List images
docker rmi myapp:latest     # Remove image
docker system prune         # Clean up

ベストプラクティス

推奨事項禁止事項
マルチステージビルドを使用するroot として実行する
.dockerignore を使用するnode_modules をコピーする
ベースイメージのタグを具体的に指定する本番環境で latest を使用する
コンテナごとにプロセスを1つにする不要なパッケージをインストールする
レイヤーキャッシュを活用する(最初に COPY package.json を実行)シークレットをハードコードする

.dockerignore

node_modules
.git
.env*
dist
*.log

このスキルを使用しない場合

次の場合はこのスキルを使用しないでください。

  • docker-compose.yml で複数コンテナのアプリケーションを管理する場合は、docker-compose スキルを使用してください
  • Kubernetes でコンテナをオーケストレーションする場合は、kubernetes スキルを使用してください
  • CI/CD パイプラインを自動化する場合は、github-actions スキルを使用してください
  • Dockerfile を作成せず、サードパーティのイメージを実行するだけの場合
  • Docker を抽象化するコンテナプラットフォーム(Heroku、Google Cloud Run の設定など)を使用する場合

アンチパターン

アンチパターン問題解決策
本番環境で :latest を使用するデプロイの予測が困難になる特定のバージョン node:20.10.0-alpine を固定する
root として実行するセキュリティ上の脆弱性USER node を使用するか、root 以外のユーザーを作成する
node_modules/ をコピーするビルドが遅くなり、プラットフォームの問題が発生する.dockerignore に追加し、コンテナ内で npm ci を実行する
開発用依存関係をインストールするイメージが肥大化するnpm ci --only=production を使用する
マルチステージビルドを使用しない本番用イメージが大きくなるビルドステージと実行ステージを分離する
ENV にシークレットをハードコードするイメージレイヤーでシークレットが露出するDocker secrets を使用するか、実行時にマウントする
コマンドごとに RUN を1つ使用するレイヤーが過剰になる関連するコマンドを && でつなぐ
.dockerignore を使用しないコンテキストの転送が遅くなる不要なファイルを除外する
不要なパッケージをインストールする攻撃対象領域が広がり、イメージサイズが増加する必要なパッケージのみをインストールする
ヘルスチェックを設定しない異常なコンテナが実行され続けるHEALTHCHECK ディレクティブを追加する

すぐにできるトラブルシューティング

問題原因の特定解決策
ビルドが遅いビルドコンテキストが大きい.dockerignore を追加し、レイヤーキャッシュを最適化する
イメージサイズが大きすぎる開発用依存関係、複数のステージマルチステージビルドを使用し、--only=production を指定する
コンテナ内で「Permission denied」が発生するroot として実行している、ファイルの所有者が正しくないUSER ディレクティブと COPY --chown を使用する
ビルドキャッシュが機能しない依存関係のインストール前に COPY している最初に package.json をコピーし、次にインストールしてから、コードをコピーする
コンテナがすぐにクラッシュするCMD/ENTRYPOINT が正しくない、依存関係が不足しているログを確認する:docker logs <container>
データベースに接続できないネットワークまたはホストが正しくないサービス名をホストとして使用し、ネットワークを確認する
「Exec format error」が発生するプラットフォームが正しくない(ARM と x86 の違い)正しいプラットフォーム向けにビルドする:--platform linux/amd64
ポートにアクセスできない公開またはパブリッシュされていないEXPOSE と docker run -p を使用する
ファイルが更新されないレイヤーがキャッシュされているキャッシュをクリアする:docker build --no-cache
削除後もボリュームのデータが残る名前付きボリュームが削除されていないdocker volume rm または docker-compose down -v を使用する

本番環境への対応

セキュリティ設定
# Security-hardened Dockerfile
FROM node:20-alpine AS builder

# Create non-root user
RUN addgroup -g 1001 appgroup && \
    adduser -u 1001 -G appgroup -s /bin/sh -D appuser

WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

COPY . .
RUN npm run build

# Production image
FROM node:20-alpine

# Security: install security updates
RUN apk update && apk upgrade && rm -rf /var/cache/apk/*

# Create non-root user
RUN addgroup -g 1001 appgroup && \
    adduser -u 1001 -G appgroup -s /bin/sh -D appuser

WORKDIR /app

# Copy with correct ownership
COPY --from=builder --chown=appuser:appgroup /app/dist ./dist
COPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modules
COPY --from=builder --chown=appuser:appgroup /app/package.json ./

# Drop privileges
USER appuser

# Security: read-only filesystem (use with docker run --read-only)
# Make /tmp writable if needed
VOLUME ["/tmp"]

# Health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1

EXPOSE 3000
CMD ["node", "dist/index.js"]
イメージのスキャン
# Scan for vulnerabilities
docker scout cves myapp:latest
docker scout recommendations myapp:latest

# Alternative: Trivy scanner
trivy image myapp:latest

# Scan during CI/CD
docker build -t myapp:latest .
trivy image --exit-code 1 --severity HIGH,CRITICAL myapp:latest
リソース制限
# docker-compose.yml with limits
services:
  app:
    image: myapp:latest
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M
    # Security options
    security_opt:
      - no-new-privileges:true
    read_only: true
    tmpfs:
      - /tmp
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
# Run with limits
docker run -d \
  --memory=512m \
  --memory-swap=512m \
  --cpus=1.0 \
  --read-only \
  --tmpfs /tmp \
  --security-opt=no-new-privileges:true \
  --cap-drop=ALL \
  myapp:latest
シークレット管理
# docker-compose.yml with secrets
services:
  app:
    image: myapp:latest
    secrets:
      - db_password
      - api_key
    environment:
      - DB_PASSWORD_FILE=/run/secrets/db_password

secrets:
  db_password:
    external: true  # Or use file: ./secrets/db_password.txt
  api_key:
    external: true
// Read secrets in application
import { readFileSync } from 'fs';

const dbPassword = process.env.DB_PASSWORD_FILE
  ? readFileSync(process.env.DB_PASSWORD_FILE, 'utf8').trim()
  : process.env.DB_PASSWORD;
ヘルスチェック
# Dockerfile health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:3000/health || exit 1
# docker-compose.yml health check
services:
  app:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 3s
      retries: 3
      start_period: 10s
ログのベストプラクティス
# docker-compose.yml logging
services:
  app:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
        labels: "service,environment"
        tag: "{{.Name}}/{{.ID}}"
# View logs with timestamps
docker logs --timestamps --tail 100 myapp

# Follow logs
docker logs -f myapp

# Logs from all containers
docker-compose logs -f --tail=100
ネットワークセキュリティ
# docker-compose.yml network isolation
services:
  app:
    networks:
      - frontend
      - backend

  db:
    networks:
      - backend  # Not accessible from frontend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true  # No external access
メトリクスの監視
メトリクスアラートのしきい値
コンテナの CPU 使用率> 80%
コンテナのメモリ使用率> 80%
コンテナの再起動回数5 分間に > 3 回
ヘルスチェックの失敗> 0
イメージの脆弱性(重大)> 0
本番環境用コマンド
# Cleanup unused resources
docker system prune -af --volumes

# Monitor resources
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

# Check container health
docker inspect --format='{{.State.Health.Status}}' myapp

# Update without downtime (with docker-compose)
docker-compose pull
docker-compose up -d --no-deps --build app
チェックリスト
  • コンテナ内で非 root ユーザーを使用
  • マルチステージビルド(最小限の最終イメージ)
  • .dockerignore の設定
  • 具体的なベースイメージのタグ(:latest は使用しない)
  • セキュリティ更新プログラムのインストール
  • イメージの脆弱性スキャン
  • リソース制限(CPU/メモリ)
  • 読み取り専用のルートファイルシステム
  • ケイパビリティの削除
  • Docker secrets でシークレットを管理(ENV は使用しない)
  • ヘルスチェックの設定
  • ログローテーションの設定
  • ネットワークの分離
  • イメージに機密データを含めない

リファレンスドキュメント

コメント