Docker + Kubernetes入門2026:最小構成から始めるコンテナ化
Dockerがなぜ2026年も必須なのか
コンテナ技術は「流行」ではなくインフラの標準になりました。
2026年のコンテナ採用率:
- 大企業:約80%がコンテナを本番利用
- スタートアップ:約70%がDockerを採用
- フリーランス案件:「Docker経験必須」が急増
Docker基礎:最小構成のWebアプリをコンテナ化
# ✅ 本番用Dockerfile(マルチステージビルド)
# ビルドステージ
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 実行ステージ(軽量化)
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
# セキュリティ:rootで実行しない
RUN addgroup -g 1001 -S nodejs && \
adduser -S nextjs -u 1001
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
CMD ["node", "server.js"]
# docker-compose.yml(開発環境)
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=${DATABASE_URL}
depends_on:
db:
condition: service_healthy
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: myapp
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${DB_PASSWORD}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Kubernetes:本番運用の最小構成
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
namespace: production
spec:
replicas: 3
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web-app
image: your-registry/web-app:v1.2.3
ports:
- containerPort: 3000
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 3000
initialDelaySeconds: 5
periodSeconds: 5
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: web-app-service
spec:
selector:
app: web-app
ports:
- port: 80
targetPort: 3000
type: LoadBalancer
セキュリティベストプラクティス
# ✅ セキュアなDockerfile作成の原則
# 1. ベースイメージは公式・最小版を使う
FROM node:20-alpine # alpine は最小構成
# 2. 脆弱性スキャン
# $ docker scout cves your-image:latest
# 3. シークレットをビルドに含めない
# ❌ 悪い例
ENV API_KEY=secret123 # イメージ履歴に残る
# ✅ 良い例:実行時に環境変数で渡す
# docker run -e API_KEY=secret123 your-image
# 4. .dockerignoreで不要なファイルを除外
# .dockerignore の内容:
# node_modules
# .env
# .env.local
# .git
CI/CD連携(GitHub Actions)
# .github/workflows/deploy.yml
name: Build and Deploy
on:
push:
branches: [main]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build Docker image
run: |
docker build -t ${{ secrets.REGISTRY }}/app:${{ github.sha }} .
- name: Push to registry
run: |
echo ${{ secrets.REGISTRY_PASSWORD }} | docker login \
-u ${{ secrets.REGISTRY_USERNAME }} --password-stdin
docker push ${{ secrets.REGISTRY }}/app:${{ github.sha }}
- name: Deploy to Kubernetes
run: |
kubectl set image deployment/web-app \
web-app=${{ secrets.REGISTRY }}/app:${{ github.sha }}
GitHub Actionsの詳細な活用法はGitHub Actions AI自動化2026で解説しています。
クラウド別Kubernetesサービス比較
| サービス | クラウド | 特徴 | コスト(3ノード) |
|---|---|---|---|
| EKS | AWS | 最も採用例多 | ¥15,000〜/月 |
| GKE | GCP | 管理コスト低 | ¥13,000〜/月 |
| AKS | Azure | Microsoft製品連携 | ¥14,000〜/月 |
AWS・GCP・Azureの詳細比較はAWS vs GCP vs Azure比較2026をご覧ください。
Dockerを使ったローカル開発環境の構築
# よく使うDockerコマンド集
# コンテナ起動(バックグラウンド)
docker compose up -d
# ログ確認
docker compose logs -f app
# コンテナ内でシェル実行
docker compose exec app sh
# ボリュームごと削除(完全リセット)
docker compose down -v
# イメージのサイズ最適化確認
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
# 脆弱性スキャン
docker scout cves your-image:latest
ヘルスチェックの設計パターン
本番環境では、コンテナの健全性を適切に監視することが不可欠です。
Dockerのヘルスチェック
# Dockerfile — ヘルスチェック付き
FROM node:20-alpine
WORKDIR /app
COPY . .
RUN npm ci && npm run build
# ヘルスチェック設定
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
CMD wget -qO- http://localhost:3000/health || exit 1
CMD ["node", "dist/server.js"]
ヘルスチェックエンドポイントは2つ用意します。
/health(Liveness): プロセスの生存確認。常に200を返す/ready(Readiness): DB・Redis等の接続確認。依存サービスが使えない場合は503を返す
Kubernetesでは3種類のProbeを使い分けます。
| Probe | 目的 | 失敗時の動作 |
|---|---|---|
| startupProbe | 起動完了の確認 | 起動待ち(他のProbe開始を遅延) |
| livenessProbe | プロセス生存確認 | コンテナ再起動 |
| readinessProbe | トラフィック受付可否 | Serviceから切り離し |
リソース制限の設計
コンテナのリソース制限は、安定した本番運用に不可欠です。
Kubernetesでは requests(確保量)と limits(上限)の2つを設定します。limits のmemoryを超えるとOOMKillされ、CPUを超えるとスロットリングが発生します。
アプリケーション種別ごとの推奨値
| 用途 | requests (memory/cpu) | limits (memory/cpu) |
|---|---|---|
| APIサーバー | 256Mi / 250m | 512Mi / 1000m |
| バッチ処理 | 512Mi / 500m | 2Gi / 2000m |
| フロントエンド(SSR) | 512Mi / 500m | 1Gi / 1000m |
Namespaceレベルで ResourceQuota(全体上限)と LimitRange(デフォルト値)を設定すると、リソース設定漏れを防止できます。
監視環境の構築
本番Kubernetes環境には、Prometheus + Grafanaの組み合わせが定番です。
監視の実装手順
- アプリケーションで
/metricsエンドポイントを公開(prom-clientライブラリ使用) - Prometheusでメトリクスを15秒間隔で収集
- Grafanaでダッシュボードを構築
- AlertManagerで閾値超過時にSlack通知
Node.jsの場合、prom-client でHTTPリクエスト数・レスポンスタイム・エラー率などのメトリクスを簡単に公開できます。
まとめ:Docker/Kubernetesの習得ロードマップ
Week 1: Docker基礎
→ docker run / build / compose
→ Dockerfile の書き方
Week 2-3: Docker Compose
→ 複数サービスの連携
→ 開発環境の完全コンテナ化
Month 2: Kubernetes基礎
→ minikube でローカルクラスター
→ Deployment / Service / Ingress
Month 3: 本番運用
→ クラウドKubernetes (EKS/GKE/AKS)
→ Helm でパッケージ管理
→ Monitoring (Prometheus / Grafana)
関連記事
-
GitHub Actions AI自動化2026 — CI/CDパイプラインの自動化
-
Terraform AWS完全ガイド2026 — IaCでインフラ管理
-
AWS vs GCP vs Azure比較2026 — クラウドKubernetes比較
-
PostgreSQLパフォーマンス最適化2026 — DBのパフォーマンスチューニング