docker について
dockerは、Dockerコンテナの構築と運用に関するリファレンススキルです。Dockerfileの例、基本コマンド、セキュリティと本番環境の指針、トラブルシューティングを提供します。
主な機能
- 01Node.jsとPythonのDockerfile例
- 02ビルドと実行コマンドの参照
- 03コンテナのセキュリティ指針
- 04本番運用のチェックリスト
- 05Dockerの一般的な問題の診断
活用シーン
- 01Node.jsまたはPythonアプリのDockerfile作成
- 02本番環境への移行前の設定確認
- 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 は使用しない)
- ヘルスチェックの設定
- ログローテーションの設定
- ネットワークの分離
- イメージに機密データを含めない
リファレンスドキュメント
コメント
Markdown 対応