「コンテナ技術を勉強したいけど、DockerとKubernetesって何が違うの?」「本番環境への適用方法がわからない」という方へ。本記事ではDockerの基本からKubernetesの本番運用まで、現役エンジニアが実務で使える知識を体系的に解説します。
Dockerとは?コンテナ技術の基礎
Dockerは、アプリケーションとその依存関係を「コンテナ」という軽量な実行単位にパッケージ化するプラットフォームです。「開発環境では動くのに本番環境で動かない」という問題を解決し、どこでも同じ環境でアプリケーションを実行できます。
仮想マシン vs コンテナの違い
| 比較項目 | 仮想マシン(VM) | コンテナ(Docker) |
|---|---|---|
| 起動時間 | 数分 | 数秒 |
| リソース消費 | 大(GB単位) | 小(MB単位) |
| OS | 完全なOSを含む | ホストOSのカーネルを共有 |
| ポータビリティ | 低い | 非常に高い |
| セキュリティ隔離 | 強い | やや弱い |
Dockerの基本コマンド集
Dockerを使いこなすために、まず必須コマンドを覚えましょう。
# イメージの取得
docker pull nginx:latest
# コンテナの起動
docker run -d -p 8080:80 --name my-nginx nginx:latest
# 実行中コンテナの確認
docker ps
# コンテナのログ確認
docker logs my-nginx
# コンテナ内でコマンド実行
docker exec -it my-nginx bash
# コンテナの停止・削除
docker stop my-nginx
docker rm my-nginx
# イメージのビルド(Dockerfileから)
docker build -t my-app:1.0 .
Dockerfileの書き方ベストプラクティス
効率的な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
USER appuser
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s \
CMD wget -qO- http://localhost:3000/health || exit 1
CMD ["node", "dist/main.js"]
Docker Composeで複数コンテナを管理
実際のWebアプリケーションは、フロントエンド・バックエンド・データベースなど複数のサービスで構成されます。Docker Composeを使うと、これらを一元管理できます。
# docker-compose.yml の例
version: "3.9"
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
depends_on:
db:
condition: service_healthy
restart: unless-stopped
db:
image: postgres:15-alpine
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=mydb
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d mydb"]
interval: 10s
timeout: 5s
retries: 5
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/ssl:ro
depends_on:
- app
volumes:
postgres_data:
Kubernetesとは?なぜ必要なのか
Kubernetes(K8s)は、Googleが開発したコンテナオーケストレーションシステムです。複数のDockerコンテナを自動でスケーリング・負荷分散・障害回復する本番運用に不可欠なプラットフォームです。
Kubernetesの主要コンポーネント
- Pod:最小デプロイ単位。1つ以上のコンテナをまとめたもの
- Deployment:Podのレプリカ管理・ローリングアップデート
- Service:Podへのネットワークアクセスを提供(ClusterIP/NodePort/LoadBalancer)
- Ingress:外部からのHTTP/HTTPSトラフィックをルーティング
- ConfigMap / Secret:設定情報・機密情報の管理
- PersistentVolume:永続ストレージの管理
Kubernetes マニフェストの書き方
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:1.0
ports:
- containerPort: 3000
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
クラウドサービス別Kubernetes環境
| サービス | プロバイダー | 特徴 | 月額目安 |
|---|---|---|---|
| GKE(Google Kubernetes Engine) | Google Cloud | 最も安定。Autopilotモードあり | $72〜 |
| EKS(Elastic Kubernetes Service) | AWS | AWSサービスとの高い親和性 | $73〜 |
| AKS(Azure Kubernetes Service) | Microsoft Azure | コントロールプレーンが無料 | $0〜(ノード代別) |
まとめ:コンテナ技術習得のロードマップ
- Docker基礎(1週間):インストール、基本コマンド、Dockerfileの書き方
- Docker Compose(1〜2週間):複数コンテナの管理、ネットワーク設定
- Kubernetes基礎(1ヶ月):minikubeでローカル環境構築、基本リソースの理解
- 本番Kubernetes(2〜3ヶ月):クラウドK8s、CI/CD連携、監視・ロギング
コンテナ技術の習得は、現代のエンジニアにとって必須スキルです。まずDockerから始めて、徐々にKubernetesへとステップアップしていきましょう。クラウドネイティブな開発スキルを身につけることで、転職市場での価値も大きく向上します。