docker-management について
docker-management は、アプリケーションの開発とデプロイ向けの Docker スキルです。イメージとコンテナーの管理に加え、ビルドの最適化、セキュリティ設定、トラブルシューティングを扱います。
主な機能
- 01Dockerfile の作成と最適化
- 02イメージのビルド、タグ付け、プッシュ
- 03コンテナーの実行と管理
- 04ネットワーク、ボリューム、ヘルスチェックの設定
- 05セキュリティ強化と問題の調査
活用シーン
- 01アプリケーション用のマルチステージイメージ作成
- 02アプリケーションコンテナーのデプロイと管理
- 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 を使用します
関連スキル
- docker-compose - マルチコンテナアプリケーション
- container-scanning - セキュリティスキャン
- container-hardening - セキュリティの強化
コメント
Markdown 対応