mcpField
D
docker-deployment

docker-deployment

github.com/pluginagentmarketplaceクラウド・DevOps2523 回インストール42 週間前に更新
リポジトリ

docker-deployment について

docker-deploymentは、DockerでNode.jsアプリをコンテナ化してデプロイする方法を学ぶスキルです。Dockerfile、イメージ、コンテナの基礎から、Compose、本番運用、CI/CDまで扱います。

主な機能

  1. 01Node.jsアプリ用Dockerfileの作成
  2. 02イメージのビルドとコンテナの実行
  3. 03Docker Composeによるサービス管理
  4. 04環境変数、ボリューム、ヘルスチェックの設定
  5. 05イメージ最適化と本番運用の学習

活用シーン

  1. 01開発・ステージング・本番環境の一貫性維持
  2. 02Node.jsマイクロサービスのコンテナ化
  3. 03CI/CDパイプラインへのDockerビルド導入

インストール

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

$npx skills add https://github.com/pluginagentmarketplace/custom-plugin-nodejs --skill docker-deployment

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

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
config.yaml
references/
GUIDE.md
scripts/
helper.py

詳細

Docker デプロイメントスキル

一貫性があり、移植可能なデプロイを実現するために、Node.js アプリケーションのコンテナ化と Docker によるデプロイを習得します。

クイックスタート

次の 3 ステップで Node.js アプリを Docker 化します。

  1. Dockerfile を作成 - コンテナイメージを定義します
  2. イメージをビルド - docker build -t myapp .
  3. コンテナを実行 - docker run -p 3000:3000 myapp

基本概念

基本的な Dockerfile
FROM node:18-alpine

WORKDIR /app

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

COPY . .

EXPOSE 3000

CMD ["node", "src/index.js"]
マルチステージビルド(最適化)
# Build stage
FROM node:18-alpine AS builder

WORKDIR /app

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

COPY . .

# Production stage
FROM node:18-alpine

WORKDIR /app

# Copy from builder
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app .

# Create non-root user
RUN addgroup -g 1001 -S nodejs && \
    adduser -S nodejs -u 1001

USER nodejs

EXPOSE 3000

HEALTHCHECK --interval=30s --timeout=3s \
  CMD node healthcheck.js || exit 1

CMD ["node", "src/index.js"]

学習パス

初級(1〜2 週間)
  • ✅ Docker の基本を理解する
  • ✅ シンプルな Dockerfile を作成する
  • ✅ コンテナをビルドして実行する
  • ✅ ボリュームとネットワークを管理する
中級(3〜4 週間)
  • ✅ マルチステージビルド
  • ✅ Docker Compose
  • ✅ 環境変数
  • ✅ ヘルスチェック
上級(5〜6 週間)
  • ✅ イメージの最適化
  • ✅ 本番環境のベストプラクティス
  • ✅ コンテナオーケストレーション
  • ✅ CI/CD との統合

Docker Compose

# docker-compose.yml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://db:5432/myapp
      - REDIS_URL=redis://redis:6379
    depends_on:
      - db
      - redis
    restart: unless-stopped

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

  redis:
    image: redis:7-alpine
    volumes:
      - redis-data:/data

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - app

volumes:
  postgres-data:
  redis-data:
Docker Compose コマンド
# Start services
docker-compose up -d

# View logs
docker-compose logs -f app

# Stop services
docker-compose down

# Rebuild images
docker-compose up -d --build

# Scale services
docker-compose up -d --scale app=3

.dockerignore

node_modules
npm-debug.log
.git
.gitignore
.env
.env.local
.vscode
*.md
tests
coverage
.github
Dockerfile
docker-compose.yml

Docker コマンド

# Build image
docker build -t myapp:latest .

# Run container
docker run -d -p 3000:3000 --name myapp myapp:latest

# View logs
docker logs -f myapp

# Enter container
docker exec -it myapp sh

# Stop container
docker stop myapp

# Remove container
docker rm myapp

# List images
docker images

# Remove image
docker rmi myapp:latest

# Prune unused resources
docker system prune -a

環境変数

# In Dockerfile
ENV NODE_ENV=production
ENV PORT=3000

# Or in docker-compose.yml
environment:
  - NODE_ENV=production
  - PORT=3000

# Or from .env file
env_file:
  - .env.production

永続化のためのボリューム

services:
  app:
    volumes:
      - ./logs:/app/logs              # Bind mount
      - node_modules:/app/node_modules # Named volume

volumes:
  node_modules:

ヘルスチェック

# In Dockerfile
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \
  CMD node healthcheck.js || exit 1
// healthcheck.js
const http = require('http');

const options = {
  host: 'localhost',
  port: 3000,
  path: '/health',
  timeout: 2000
};

const request = http.request(options, (res) => {
  console.log(`STATUS: ${res.statusCode}`);
  process.exit(res.statusCode === 200 ? 0 : 1);
});

request.on('error', (err) => {
  console.log('ERROR:', err);
  process.exit(1);
});

request.end();

イメージの最適化

# Use Alpine (smaller base image)
FROM node:18-alpine  # 180MB vs node:18 (1GB)

# Multi-stage build (remove build dependencies)
# Use .dockerignore (exclude unnecessary files)
# npm ci instead of npm install (faster, deterministic)
# Only production dependencies
RUN npm ci --only=production

# Combine RUN commands (fewer layers)
RUN apk add --no-cache git && \
    npm ci && \
    apk del git

本番環境のベストプラクティス

FROM node:18-alpine

# Don't run as root
RUN addgroup -g 1001 -S nodejs && \
    adduser -S nodejs -u 1001

WORKDIR /app

COPY --chown=nodejs:nodejs package*.json ./
RUN npm ci --only=production

COPY --chown=nodejs:nodejs . .

USER nodejs

# Health check
HEALTHCHECK CMD node healthcheck.js || exit 1

# Use node instead of npm start (better signal handling)
CMD ["node", "src/index.js"]

Docker Hub へのデプロイ

# Login
docker login

# Tag image
docker tag myapp:latest username/myapp:1.0.0
docker tag myapp:latest username/myapp:latest

# Push to Docker Hub
docker push username/myapp:1.0.0
docker push username/myapp:latest

# Pull from Docker Hub
docker pull username/myapp:latest

GitHub Actions による CI/CD

name: Docker Build & Deploy

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - uses: docker/setup-buildx-action@v2

      - uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - uses: docker/build-push-action@v4
        with:
          push: true
          tags: username/myapp:latest
          cache-from: type=gha
          cache-to: type=gha,mode=max

よくある問題と解決策

Node モジュールのキャッシュ
# Cache node_modules layer
COPY package*.json ./
RUN npm ci
COPY . .  # This doesn't rebuild node_modules
シグナル処理
# Use node directly (not npm)
CMD ["node", "src/index.js"]

# In app: Handle SIGTERM
process.on('SIGTERM', () => {
  server.close(() => process.exit(0));
});

使用する場面

次のような場合に Docker によるデプロイを使用します。

  • 一貫性のある環境(開発、ステージング、本番)が必要な場合
  • マイクロサービスをデプロイする場合
  • 簡単なスケーリングとオーケストレーションを実現したい場合
  • クラウドプラットフォーム(AWS、GCP、Azure)を使用する場合
  • CI/CD パイプラインを実装する場合

関連スキル

  • Express REST API(API のコンテナ化)
  • データベース統合(マルチコンテナ構成)
  • テストとデバッグ(コンテナ内でのテスト)
  • パフォーマンス最適化(イメージの最適化)

リソース

コメント