🐳 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の基本を習得したので、次は:
- Kubernetesでのコンテナオーケストレーション
- マイクロサービスアーキテクチャの実装
- 本番環境での監視とログ管理
- セキュリティの強化
このガイドがDockerコンテナ化の理解と活用に役立つことを願っています!何か質問があれば、コメント欄で議論を歓迎します。