docker-patterns
コンテナ化された開発環境のセットアップやDocker設定のレビューに役立つ、Docker・Docker Composeのパターン集です。ローカル開発環境の構築、コンテナセキュリティ、ネットワーク設定、ボリューム戦略、マルチサービスのオーケストレーションなど幅広いユースケースに対応します。Dockerの設定を新規作成・見直す際に活用してください。
description の原文を見る
> Docker and Docker Compose patterns for local development, container security, networking, volume strategies, and multi-service orchestration. Use when setting up containerized development environments or reviewing Docker configurations.
SKILL.md 本文
Docker Patterns
コンテナ化された開発のための Docker と Docker Compose のベストプラクティス。
使用するタイミング
- ローカル開発用に Docker Compose をセットアップしている
- マルチコンテナアーキテクチャを設計している
- コンテナネットワーキングまたはボリュームの問題をトラブルシューティングしている
- セキュリティとサイズについて Dockerfile をレビューしている
- ローカル開発からコンテナ化されたワークフローに移行している
ローカル開発用 Docker Compose
標準的な Web アプリケーションスタック
# docker-compose.yml
services:
app:
build:
context: .
target: dev # Use dev stage of multi-stage Dockerfile
ports:
- "3000:3000"
volumes:
- .:/app # Bind mount for hot reload
- /app/node_modules # Anonymous volume -- preserves container deps
environment:
- DATABASE_URL=postgres://postgres:postgres@db:5432/app_dev
- REDIS_URL=redis://redis:6379/0
- NODE_ENV=development
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
command: npm run dev
db:
image: postgres:16-alpine
ports:
- "5432:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: app_dev
volumes:
- pgdata:/var/lib/postgresql/data
- ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init.sql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 3s
retries: 5
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redisdata:/data
mailpit: # Local email testing
image: axllent/mailpit
ports:
- "8025:8025" # Web UI
- "1025:1025" # SMTP
volumes:
pgdata:
redisdata:
開発環境と本番環境の Dockerfile
# Stage: dependencies
FROM node:22-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
# Stage: dev (hot reload, debug tools)
FROM node:22-alpine AS dev
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
EXPOSE 3000
CMD ["npm", "run", "dev"]
# Stage: build
FROM node:22-alpine AS build
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build && npm prune --production
# Stage: production (minimal image)
FROM node:22-alpine AS production
WORKDIR /app
RUN addgroup -g 1001 -S appgroup && adduser -S appuser -u 1001
USER appuser
COPY --from=build --chown=appuser:appgroup /app/dist ./dist
COPY --from=build --chown=appuser:appgroup /app/node_modules ./node_modules
COPY --from=build --chown=appuser:appgroup /app/package.json ./
ENV NODE_ENV=production
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost:3000/health || exit 1
CMD ["node", "dist/server.js"]
オーバーライドファイル
# docker-compose.override.yml (自動ロード、開発専用設定)
services:
app:
environment:
- DEBUG=app:*
- LOG_LEVEL=debug
ports:
- "9229:9229" # Node.js debugger
# docker-compose.prod.yml (本番環境用、明示的に指定)
services:
app:
build:
target: production
restart: always
deploy:
resources:
limits:
cpus: "1.0"
memory: 512M
# 開発環境(オーバーライドを自動ロード)
docker compose up
# 本番環境
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
ネットワーキング
サービスディスカバリー
同じ Compose ネットワーク内のサービスはサービス名で解決できます:
# 「app」コンテナから:
postgres://postgres:postgres@db:5432/app_dev # 「db」は db コンテナに解決
redis://redis:6379/0 # 「redis」は redis コンテナに解決
カスタムネットワーク
services:
frontend:
networks:
- frontend-net
api:
networks:
- frontend-net
- backend-net
db:
networks:
- backend-net # Only reachable from api, not frontend
networks:
frontend-net:
backend-net:
必要な部分だけを公開
services:
db:
ports:
- "127.0.0.1:5432:5432" # ホストからのみアクセス可能、ネットワークからはアクセス不可
# 本番環境ではポートを省略 -- Docker ネットワーク内からのみアクセス可能
ボリュームの戦略
volumes:
# Named volume: コンテナの再起動時に永続化、Docker で管理
pgdata:
# Bind mount: ホストディレクトリをコンテナにマッピング(開発用)
# - ./src:/app/src
# Anonymous volume: bind mount オーバーライドからのコンテナ生成コンテンツを保護
# - /app/node_modules
一般的なパターン
services:
app:
volumes:
- .:/app # ソースコード(hot reload 用 bind mount)
- /app/node_modules # コンテナの node_modules をホストから保護
- /app/.next # ビルドキャッシュを保護
db:
volumes:
- pgdata:/var/lib/postgresql/data # 永続データ
- ./scripts/init.sql:/docker-entrypoint-initdb.d/init.sql # 初期化スクリプト
コンテナセキュリティ
Dockerfile 強化
# 1. 特定のタグを使用(:latest は絶対に使用しない)
FROM node:22.12-alpine3.20
# 2. root 以外で実行
RUN addgroup -g 1001 -S app && adduser -S app -u 1001
USER app
# 3. ケーパビリティをドロップ(compose で)
# 4. 可能な限りルートファイルシステムを読み取り専用に
# 5. イメージレイヤーにシークレットを含めない
Compose セキュリティ
services:
app:
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp
- /app/.cache
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE # Only if binding to ports < 1024
シークレット管理
# 良い例:環境変数を使用(実行時に注入)
services:
app:
env_file:
- .env # .env を git にコミットしないこと
environment:
- API_KEY # ホスト環境から継承
# 良い例:Docker シークレット(Swarm モード)
secrets:
db_password:
file: ./secrets/db_password.txt
services:
db:
secrets:
- db_password
# 悪い例:イメージにハードコード
# ENV API_KEY=sk-proj-xxxxx # 絶対にこれをしないこと
.dockerignore
node_modules
.git
.env
.env.*
dist
coverage
*.log
.next
.cache
docker-compose*.yml
Dockerfile*
README.md
tests/
デバッグ
よく使うコマンド
# ログを表示
docker compose logs -f app # app のログをフォロー
docker compose logs --tail=50 db # db の最後 50 行
# 実行中のコンテナでコマンドを実行
docker compose exec app sh # app にシェルでアクセス
docker compose exec db psql -U postgres # postgres に接続
# 検査
docker compose ps # 実行中のサービス
docker compose top # 各コンテナ内のプロセス
docker stats # リソース使用状況
# リビルド
docker compose up --build # イメージをリビルド
docker compose build --no-cache app # 完全リビルドを強制
# クリーンアップ
docker compose down # コンテナを停止・削除
docker compose down -v # ボリュームも削除(破壊的)
docker system prune # 未使用のイメージ/コンテナを削除
ネットワークの問題をデバッグ
# コンテナ内の DNS 解決を確認
docker compose exec app nslookup db
# 接続性を確認
docker compose exec app wget -qO- http://api:3000/health
# ネットワークを検査
docker network ls
docker network inspect <project>_default
アンチパターン
# 悪い例:本番環境でオーケストレーションなしで docker compose を使用
# 本番環境のマルチコンテナワークロードには Kubernetes、ECS、Docker Swarm を使用
# 悪い例:ボリュームなしでコンテナにデータを保存
# コンテナはエフェメラル -- ボリュームなしで再起動するとすべてのデータが失われる
# 悪い例:root で実行
# 常に非root ユーザーを作成して使用
# 悪い例::latest タグを使用
# 再現可能なビルドのため特定のバージョンにピン留めする
# 悪い例:すべてのサービスを 1 つの巨大なコンテナに詰め込む
# 関心の分離:1 つのコンテナに 1 つのプロセス
# 悪い例:docker-compose.yml にシークレットを入れる
# .env ファイル(gitignored)または Docker シークレットを使用
このスキルを使用するタイミング
- ローカル開発用に Docker Compose をセットアップしている
- マルチコンテナアーキテクチャを設計している
- コンテナの問題をトラブルシューティングしている
- セキュリティについて Dockerfile をレビューしている
- コンテナベストプラクティスを実装している
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- affaan-m
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/affaan-m/everything-claude-code / ライセンス: MIT
関連スキル
superpowers-streamer-cli
SuperPowers デスクトップストリーマーの npm パッケージをインストール、ログイン、実行、トラブルシューティングできます。ユーザーが npm から `superpowers-ai` をセットアップしたい場合、メールまたは電話でサインインもしくはアカウント作成を行いたい場合、ストリーマーを起動したい場合、表示されたコントロールリンクを開きたい場合、後で停止したい場合、またはソースコードへのアクセスなしに npm やランタイムの一般的な問題から復旧したい場合に使用します。
catc-client-ops
Catalyst Centerのクライアント操作・監視機能 - 有線・無線クライアントのリスト表示・フィルタリング、MACアドレスによる詳細なクライアント検索、クライアント数分析、時間軸での分析、SSIDおよび周波数帯によるフィルタリング、無線トラブルシューティング機能を提供します。MACアドレスやIPアドレスでのクライアント検索、サイト別やSSID別のクライアント数集計、無線周波数帯の分布分析、Wi-Fi信号の問題調査が必要な場合に活用できます。
ci-cd-and-automation
CI/CDパイプラインの設定を自動化します。ビルドおよびデプロイメントパイプラインの構築または変更時に使用できます。品質ゲートの自動化、CI内のテストランナー設定、またはデプロイメント戦略の確立が必要な場合に活用します。
shipping-and-launch
本番環境へのリリース準備を行います。本番環境へのデプロイ準備が必要な場合、リリース前チェックリストが必要な場合、監視機能の設定を行う場合、段階的なロールアウトを計画する場合、またはロールバック戦略が必要な場合に使用します。
linear-release-setup
Linear Releaseに向けたCI/CD設定を生成します。リリース追跡の設定、LinearのCIパイプライン構築、またはLinearリリースとのデプロイメント連携を実施する際に利用できます。GitHub Actions、GitLab CI、CircleCIなど複数のプラットフォームに対応しています。
tracking-application-response-times
API エンドポイント、データベースクエリ、サービスコール全体にわたるアプリケーションのレスポンスタイムを追跡・最適化できます。パフォーマンス監視やボトルネック特定の際に活用してください。「レスポンスタイムを追跡する」「API パフォーマンスを監視する」「遅延を分析する」といった表現で呼び出せます。