DockerとKubernetesは現代のクラウドネイティブ開発に欠かせない技術です。本記事では、Docker・Kubernetesの基礎から実践的な運用まで、エンジニアが知っておくべき知識をすべて解説します。
Dockerとは?コンテナ技術の基礎
Dockerはアプリケーションとその依存関係をコンテナと呼ばれる隔離された環境にパッケージ化する技術です。「自分のPCでは動くのに本番環境では動かない」という問題を解決します。
Dockerの主要コンセプト
- イメージ(Image):アプリと依存関係を含む読み取り専用のテンプレート
- コンテナ(Container):イメージから生成される実行中のプロセス
- Dockerfile:イメージを構築するための手順書
- Docker Hub:公開されているDockerイメージのレジストリ
- Docker Compose:複数コンテナを定義・実行するためのツール
Dockerのインストールと基本コマンド
# Dockerのインストール(Ubuntu)
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# バージョン確認
docker --version
# 基本コマンド
docker pull nginx:latest # イメージを取得
docker images # ローカルイメージ一覧
docker run -d -p 8080:80 nginx # コンテナ起動(バックグラウンド)
docker ps # 起動中のコンテナ一覧
docker ps -a # すべてのコンテナ一覧
docker stop # コンテナ停止
docker rm # コンテナ削除
docker rmi # イメージ削除
docker logs # ログ表示
docker exec -it bash # コンテナ内でシェル起動
Dockerfileの書き方
Dockerfileはイメージをビルドするための設計書です。Node.jsアプリを例に解説します。
# ベースイメージを指定
FROM node:20-alpine
# 作業ディレクトリの設定
WORKDIR /app
# package.jsonをコピー(キャッシュ最適化のため先にコピー)
COPY package*.json ./
# 依存パッケージのインストール
RUN npm ci --only=production
# アプリケーションのソースコードをコピー
COPY . .
# TypeScriptのビルド
RUN npm run build
# ポートを公開
EXPOSE 3000
# ヘルスチェック
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s CMD wget --quiet --tries=1 --spider http://localhost:3000/health || exit 1
# アプリケーションの起動
CMD ["node", "dist/index.js"]
# イメージのビルド
docker build -t my-node-app:1.0 .
# マルチステージビルド(本番向け軽量化)
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-alpine AS production
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/index.js"]
Docker Composeで複数コンテナを管理
実際のアプリケーションはWebサーバー、API、データベースなど複数のサービスで構成されます。Docker Composeを使うと、これらを一括管理できます。
# docker-compose.yml
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://postgres:password@db:5432/myapp
depends_on:
db:
condition: service_healthy
restart: unless-stopped
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: myapp
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- app
volumes:
postgres_data:
# Docker Composeコマンド
docker compose up -d # バックグラウンドで起動
docker compose down # すべて停止・削除
docker compose ps # ステータス確認
docker compose logs -f app # ログをリアルタイム表示
docker compose exec app bash # コンテナ内でコマンド実行
docker compose build --no-cache # キャッシュなしでビルド
Kubernetes(K8s)の基礎
Kubernetesは複数のコンテナを本番環境で管理・スケールするためのオーケストレーションツールです。Googleが開発し、現在はCloud Native Computing Foundation(CNCF)がメンテナンスしています。
Kubernetesの主要コンポーネント
- Pod:最小のデプロイ単位。1つ以上のコンテナをグループ化
- Deployment:Podの望ましい状態を定義し、自動で維持
- Service:Podへのネットワークアクセスを提供
- ConfigMap:設定情報をコンテナから分離して管理
- Secret:機密情報(パスワード、APIキー)を安全に管理
- Ingress:外部からのHTTPトラフィックをルーティング
- HorizontalPodAutoscaler:負荷に応じてPodを自動スケール
Kubernetesマニフェストの例
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-node-app
labels:
app: my-node-app
spec:
replicas: 3
selector:
matchLabels:
app: my-node-app
template:
metadata:
labels:
app: my-node-app
spec:
containers:
- name: my-node-app
image: my-registry/my-node-app:1.0
ports:
- containerPort: 3000
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"
readinessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 15
periodSeconds: 20
envFrom:
- configMapRef:
name: my-app-config
- secretRef:
name: my-app-secrets
---
apiVersion: v1
kind: Service
metadata:
name: my-node-app-service
spec:
selector:
app: my-node-app
ports:
- port: 80
targetPort: 3000
type: ClusterIP
# kubectlコマンド基礎
kubectl apply -f deployment.yaml # マニフェスト適用
kubectl get pods # Pod一覧
kubectl get deployments # Deployment一覧
kubectl get services # Service一覧
kubectl describe pod # Pod詳細
kubectl logs # ログ確認
kubectl exec -it -- bash # Pod内でシェル起動
kubectl scale deployment my-app --replicas=5 # スケール変更
kubectl rollout status deployment/my-app # ロールアウト状態確認
kubectl rollout undo deployment/my-app # ロールバック
AWS EKS・GKE・AKSの選び方
マネージドKubernetesサービスを利用することで、コントロールプレーンの運用を省力化できます。主要クラウドの特徴を比較します。
- AWS EKS:AWSサービスとの統合が強力。ECR、ALB、IAMとシームレスに連携
- Google GKE:Kubernetes本家のGoogleが提供。Autopilotモードで運用が簡単
- Azure AKS:Azure ADとの統合、Windowsコンテナのサポートが強み
まとめ:Docker・Kubernetesの学習ロードマップ
Docker・Kubernetesはクラウドエンジニア・バックエンドエンジニアにとって必須スキルです。まずDockerの基礎(イメージ・コンテナ・Dockerfile)を習得し、次にDocker Composeで複数コンテナ構成を理解、そしてKubernetesの概念(Pod・Deployment・Service)へと進む学習順序が最も効果的です。
AWS認定資格(Solutions ArchitectやDevOps Engineer)やCKA(Certified Kubernetes Administrator)の取得を目指すことで、スキルの証明と市場価値向上に繋がります。クラウドエンジニアの年収は700万〜1,200万円以上に達するケースも多く、投資対効果の高いスキルです。