mcpField
D
docker-management

docker-management

github.com/bagelholeクラウド・DevOps1.2k515 回インストール23 週間前に更新
リポジトリ

docker-management について

docker-management は、アプリケーションの開発とデプロイ向けの Docker スキルです。イメージとコンテナーの管理に加え、ビルドの最適化、セキュリティ設定、トラブルシューティングを扱います。

主な機能

  1. 01Dockerfile の作成と最適化
  2. 02イメージのビルド、タグ付け、プッシュ
  3. 03コンテナーの実行と管理
  4. 04ネットワーク、ボリューム、ヘルスチェックの設定
  5. 05セキュリティ強化と問題の調査

活用シーン

  1. 01アプリケーション用のマルチステージイメージ作成
  2. 02アプリケーションコンテナーのデプロイと管理
  3. 03コンテナーの起動や接続の障害調査

インストール

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

$npx skills add https://github.com/bagelhole/devops-security-agent-skills --skill docker-management

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

同梱ファイルreferences/docker-commands.md

詳細

Docker の管理

アプリケーションのデプロイと開発に向けて、Docker コンテナをビルド、実行、管理します。

このスキルを使用する場面

次の場合にこのスキルを使用します。

  • Dockerfile の作成と最適化
  • Docker イメージのビルドとタグ付け
  • コンテナの実行と管理
  • コンテナの問題のデバッグ
  • Docker のネットワークとボリュームの設定
  • コンテナセキュリティのベストプラクティスの導入

前提条件

  • Docker Engine のインストール(20.10 以降)
  • コマンドラインの基本的な知識
  • アプリケーションのデプロイに関する理解

Dockerfile のベストプラクティス

マルチステージビルド
# Build stage
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

# Production stage
FROM node:20-alpine AS production
WORKDIR /app
RUN addgroup -g 1001 -S nodejs && \
    adduser -S nodejs -u 1001
COPY --from=builder --chown=nodejs:nodejs /app/dist ./dist
COPY --from=builder --chown=nodejs:nodejs /app/node_modules ./node_modules
USER nodejs
EXPOSE 3000
CMD ["node", "dist/index.js"]
レイヤーの最適化
FROM python:3.12-slim

# Install dependencies first (cached unless requirements change)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Copy application code (changes frequently)
COPY . .

CMD ["python", "app.py"]
セキュリティの強化
FROM node:20-alpine

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

WORKDIR /app

# Copy with proper ownership
COPY --chown=appuser:appgroup . .

# Drop privileges
USER appuser

# Use exec form for proper signal handling
CMD ["node", "server.js"]

イメージのビルド

基本的なビルド
# Build with tag
docker build -t myapp:1.0 .

# Build with build args
docker build --build-arg NODE_ENV=production -t myapp:prod .

# Build for specific platform
docker build --platform linux/amd64 -t myapp:amd64 .

# Build with no cache
docker build --no-cache -t myapp:fresh .
マルチプラットフォームビルド
# Create builder
docker buildx create --name multiplatform --use

# Build for multiple architectures
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t myregistry/myapp:latest \
  --push .

コンテナの実行

基本操作
# Run container
docker run -d --name myapp -p 8080:3000 myapp:latest

# Run with environment variables
docker run -d \
  -e DATABASE_URL=postgres://localhost/db \
  -e NODE_ENV=production \
  myapp:latest

# Run with resource limits
docker run -d \
  --memory="512m" \
  --cpus="1.0" \
  myapp:latest

# Run with restart policy
docker run -d --restart=unless-stopped myapp:latest
ボリューム管理
# Named volume
docker volume create mydata
docker run -v mydata:/app/data myapp:latest

# Bind mount
docker run -v $(pwd)/config:/app/config:ro myapp:latest

# tmpfs mount (memory)
docker run --tmpfs /tmp:rw,noexec,nosuid myapp:latest
ネットワーク
# Create network
docker network create mynetwork

# Run on network
docker run -d --network mynetwork --name api myapp:latest

# Connect existing container
docker network connect mynetwork existing-container

# Expose specific ports
docker run -d -p 127.0.0.1:8080:3000 myapp:latest

コンテナのライフサイクル

管理コマンド
# List containers
docker ps -a

# Stop container
docker stop myapp

# Remove container
docker rm myapp

# Force remove running container
docker rm -f myapp

# Prune stopped containers
docker container prune -f
ログとモニタリング
# View logs
docker logs myapp

# Follow logs
docker logs -f --tail 100 myapp

# View resource usage
docker stats myapp

# Inspect container
docker inspect myapp

コンテナのデバッグ

対話型アクセス
# Execute command in running container
docker exec -it myapp /bin/sh

# Run container with shell
docker run -it --rm myapp:latest /bin/sh

# Debug failed container
docker run -it --entrypoint /bin/sh myapp:latest
トラブルシューティング
# Check container logs for errors
docker logs myapp 2>&1 | grep -i error

# Inspect container state
docker inspect --format='{{.State.Status}}' myapp

# Check container processes
docker top myapp

# View container filesystem changes
docker diff myapp

# Export container filesystem
docker export myapp > myapp-fs.tar
ヘルスチェック
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:3000/health || exit 1
# Check health status
docker inspect --format='{{.State.Health.Status}}' myapp

イメージ管理

タグ付けとプッシュ
# Tag image
docker tag myapp:latest myregistry.com/myapp:v1.0

# Push to registry
docker push myregistry.com/myapp:v1.0

# Pull image
docker pull myregistry.com/myapp:v1.0
クリーンアップ
# Remove unused images
docker image prune -a

# Remove all unused resources
docker system prune -a --volumes

# Remove specific image
docker rmi myapp:old

# List image sizes
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
イメージ分析
# View image history
docker history myapp:latest

# Inspect image layers
docker inspect myapp:latest

# Check image vulnerabilities (with Docker Scout)
docker scout cves myapp:latest

Docker Compose との連携

# docker-compose.yml
version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
    volumes:
      - app-data:/app/data
    depends_on:
      - db
    restart: unless-stopped

  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  app-data:
  db-data:

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

イメージのセキュリティ
# Use specific version tags
FROM node:20.10-alpine3.18

# Don't run as root
USER nobody

# Remove unnecessary packages
RUN apk del --purge build-dependencies

# Use COPY instead of ADD
COPY . .
実行時のセキュリティ
# Run with security options
docker run -d \
  --security-opt=no-new-privileges \
  --cap-drop=ALL \
  --cap-add=NET_BIND_SERVICE \
  --read-only \
  myapp:latest

# Use user namespace remapping
# Add to /etc/docker/daemon.json: {"userns-remap": "default"}

よくある問題

問題:コンテナがすぐに終了する

問題:コンテナが起動してすぐに停止します 解決策:CMD/ENTRYPOINT がフォアグラウンドプロセスを実行しているか確認し、docker logs でエラーを確認します

問題:コンテナに接続できない

問題:ポートにアクセスできません 解決策:ポートマッピング(-p)を確認し、コンテナが実行中であることと、ファイアウォールのルールを確認します

問題:ディスク容量が不足している

問題:Docker がディスクを使いすぎています 解決策:docker system prune -a --volumes を実行し、サイズの大きい未使用イメージがないか確認します

問題:ビルドキャッシュが機能しない

問題:ビルドのたびに依存関係がダウンロードされます 解決策:Dockerfile の命令を、変更頻度が低いものから高いものへと並べます

ベストプラクティス

  • マルチステージビルドを使用してイメージサイズを最小限に抑えます
  • イメージにシークレットを保存せず、実行時に注入します
  • 再現性を確保するため、ベースイメージのバージョンを固定します
  • 本番環境のコンテナにはヘルスチェックを導入します
  • 不要なファイルを除外するために .dockerignore を使用します
  • コンテナは root 以外のユーザーとして実行します
  • イメージの脆弱性を定期的にスキャンします
  • ビルドを高速化するために Docker BuildKit を使用します

関連スキル

コメント