メインコンテンツへスキップ
Background Image

Docker コンテナ化完全ガイド:入門から本番デプロイまで

·630 文字·3 分· loading · loading · ·

🐳 Dockerコンテナ化革命
#

Dockerはコンテナ化技術の代表として、ソフトウェア開発とデプロイの方法を根本的に変え、「一度構築すれば、どこでも実行」という夢を実現しました。

✨ コンテナ化の利点
#

  • 環境の一貫性: 開発、テスト、本番環境が完全に一致
  • 高速デプロイ: 秒単位での起動と停止
  • リソース分離: アプリケーション間が相互独立、互いに影響しない
  • バージョン管理: イメージのバージョン管理、ロールバック対応

🚀 基本概念
#

1. コアコンポーネント
#

# イメージ (Image)
docker images                    # ローカルイメージの表示
docker pull nginx:latest        # イメージの取得
docker rmi nginx:latest         # イメージの削除

# コンテナ (Container)
docker ps                       # 実行中のコンテナの表示
docker ps -a                    # すべてのコンテナの表示
docker run nginx:latest         # コンテナの実行
docker stop <container_id>      # コンテナの停止

2. イメージの構築
#

# Dockerfile 例
FROM node:18-alpine

# 作業ディレクトリの設定
WORKDIR /app

# package.jsonのコピー
COPY package*.json ./

# 依存関係のインストール
RUN npm ci --only=production

# アプリケーションコードのコピー
COPY . .

# ポートの公開
EXPOSE 3000

# 起動コマンド
CMD ["npm", "start"]

🏗️ マルチステージビルド
#

1. イメージサイズの最適化
#

# マルチステージビルド例
FROM node:18-alpine AS builder

WORKDIR /app
COPY package*.json ./
RUN npm ci

COPY . .
RUN npm run build

# 本番ステージ
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

2. セキュリティ最適化
#

# 非rootユーザーの使用
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci

COPY . .
RUN npm run build

FROM node:18-alpine
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001

WORKDIR /app
COPY --from=builder --chown=nextjs:nodejs /app/dist ./

USER nextjs
EXPOSE 3000
CMD ["npm", "start"]

🚀 Docker Compose
#

1. 基本的な設定
#

# docker-compose.yml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
    depends_on:
      - db
  
  db:
    image: postgres:15
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

2. 環境別設定
#

# docker-compose.override.yml (開発環境)
version: '3.8'

services:
  web:
    build: .
    volumes:
      - .:/app
      - /app/node_modules
    environment:
      - NODE_ENV=development
    command: npm run dev

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

1. イメージのセキュリティ
#

# セキュリティ強化されたDockerfile
FROM node:18-alpine

# セキュリティアップデート
RUN apk update && apk upgrade

# 非特権ユーザーの作成
RUN addgroup -g 1001 -S appgroup
RUN adduser -S appuser -u 1001 -G appgroup

# 作業ディレクトリの設定
WORKDIR /app

# 依存関係のインストール
COPY package*.json ./
RUN npm ci --only=production

# アプリケーションコードのコピー
COPY --chown=appuser:appgroup . .

# ユーザーの切り替え
USER appuser

# ポートの公開
EXPOSE 3000

# ヘルスチェック
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:3000/health || exit 1

CMD ["npm", "start"]

2. ネットワークセキュリティ
#

# docker-compose.yml
version: '3.8'

services:
  web:
    build: .
    networks:
      - frontend
    ports:
      - "3000:3000"
  
  db:
    image: postgres:15
    networks:
      - backend
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password

networks:
  frontend:
  backend:
    internal: true  # 外部からのアクセスを制限

📊 監視とログ
#

1. ログ管理
#

# docker-compose.yml
version: '3.8'

services:
  web:
    build: .
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

2. ヘルスチェック
#

# ヘルスチェックの追加
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:3000/health || exit 1

🚀 本番環境でのデプロイ
#

1. 本番用Dockerfile
#

# 本番用Dockerfile
FROM node:18-alpine AS builder

WORKDIR /app
COPY package*.json ./
RUN npm ci

COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

2. CI/CDパイプライン
#

# .github/workflows/docker.yml
name: Docker Build and Deploy

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    
    - name: Build Docker image
      run: docker build -t myapp:${{ github.sha }} .
    
    - name: Push to registry
      run: |
        echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
        docker push myapp:${{ github.sha }}

💡 パフォーマンス最適化
#

1. レイヤーキャッシュの活用
#

# 依存関係を先にコピーしてキャッシュを活用
FROM node:18-alpine

WORKDIR /app

# 依存関係ファイルを先にコピー
COPY package*.json ./
RUN npm ci --only=production

# アプリケーションコードを後でコピー
COPY . .

EXPOSE 3000
CMD ["npm", "start"]

2. マルチステージビルドの最適化
#

# 最適化されたマルチステージビルド
FROM node:18-alpine AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci

FROM node:18-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build

FROM node:18-alpine AS runner
WORKDIR /app
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001

COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package*.json ./

USER nextjs
EXPOSE 3000
CMD ["npm", "start"]

📚 学習リソース
#

🎯 次のステップ
#

Dockerの基本を習得したので、次は:

  1. Kubernetesでのコンテナオーケストレーション
  2. マイクロサービスアーキテクチャの実装
  3. 本番環境での監視とログ管理
  4. セキュリティの強化

このガイドがDockerコンテナ化の理解と活用に役立つことを願っています!何か質問があれば、コメント欄で議論を歓迎します。