Docker + Kubernetes完全入門【2026年版】コンテナ化からK8s本番デプロイまで一気に理解する

Dockerとは?コンテナ技術の基礎

Dockerはアプリケーションをコンテナとしてパッケージ化し、環境に依存しない実行を可能にするプラットフォームです。「自分のPCでは動くのに本番では動かない」という問題を根本的に解決します。

Dockerの基本コマンド

# イメージの取得
docker pull nginx:latest

# コンテナの起動
docker run -d -p 8080:80 --name my-nginx nginx:latest

# 起動中のコンテナ一覧
docker ps

# コンテナのログ確認
docker logs my-nginx -f

# コンテナに入る
docker exec -it my-nginx /bin/bash

# コンテナの停止・削除
docker stop my-nginx
docker rm my-nginx

# イメージのビルド
docker build -t myapp:1.0 .

# レジストリへのプッシュ
docker tag myapp:1.0 ghcr.io/username/myapp:1.0
docker push ghcr.io/username/myapp:1.0

本番に使えるDockerfileの書き方

# マルチステージビルドでイメージを最小化(Node.js例)
# ─── ビルドステージ ───
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

COPY . .
RUN npm run build

# ─── 本番ステージ ───
FROM node:20-alpine AS production
WORKDIR /app

# セキュリティ:rootユーザーを使わない
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

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

# ヘルスチェック
HEALTHCHECK --interval=30s --timeout=3s   CMD wget -qO- http://localhost:3000/health || exit 1

USER appuser
EXPOSE 3000
CMD ["node", "dist/index.js"]

Docker Composeで複数コンテナを管理

# docker-compose.yml
version: '3.9'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/mydb
      - REDIS_URL=redis://redis:6379
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
    volumes:
      - ./logs:/app/logs
    restart: unless-stopped

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d mydb"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru

volumes:
  postgres_data:

Kubernetes(K8s)入門

Kubernetesは複数のコンテナを大規模に管理・オーケストレーションするシステムです。Google発のOSSで、現在はクラウドネイティブアプリの標準基盤となっています。

基本リソースの理解

# Deployment - アプリケーションの定義
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 3  # 3つのPodを起動
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: ghcr.io/username/myapp:1.0
        ports:
        - containerPort: 3000
        resources:
          requests:
            memory: "128Mi"
            cpu: "100m"
          limits:
            memory: "256Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 3000
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 3000
          initialDelaySeconds: 5
          periodSeconds: 5
---
# Service - Podへのアクセス窓口
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
  - port: 80
    targetPort: 3000
  type: ClusterIP

HPA(水平オートスケーリング)

# CPU使用率に応じて自動でPodをスケール
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  minReplicas: 2
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

ローカルK8s環境の構築

# minikubeのインストール(macOS)
brew install minikube
minikube start --driver=docker --cpus=4 --memory=8g

# あるいはkindを使う
brew install kind
kind create cluster --name my-cluster

# kubectlの基本操作
kubectl get pods -n default
kubectl get services
kubectl apply -f deployment.yaml
kubectl rollout status deployment/myapp
kubectl rollout undo deployment/myapp  # ロールバック
kubectl logs -f deployment/myapp
kubectl port-forward service/myapp-service 8080:80

まとめ:コンテナ技術は現代エンジニアの必須スキル

Docker + Kubernetesはクラウドネイティブ開発の基盤です。まずDockerでコンテナ化を学び、次にKubernetesでのオーケストレーションへとステップアップしましょう。AWS EKS・Google GKE・Azure AKSなどのマネージドK8sを使えば、インフラ管理の負担を大幅に削減できます。

投稿者 kasata

IT企業でエンジニアとして勤務後、テクノロジー情報メディア「Tech Athletes(テック・アスリート)」を運営。プログラミング、クラウドインフラ(AWS/GCP/Azure)、AI活用、Webサービス開発を専門とする。エンジニア・ビジネスパーソン向けに、実際に使ってみた経験をもとに信頼できる技術情報を発信中。資格:AWS認定ソリューションアーキテクト、Python 3 エンジニア認定試験合格。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です