はじめに
コンテナ技術が普及する中で、「Docker Compose」と「Kubernetes」という2つのツールを耳にする機会が増えています。どちらもコンテナオーケストレーションに関わるツールですが、その役割やスコープは大きく異なります。
この記事では、Docker ComposeとKubernetesの違いを明確にし、プロジェクトに応じた適切なツール選択ができるようになることを目指します。
対象読者
- Dockerの基本操作を理解している方
- Docker Composeを使った経験がある方
- Kubernetesに興味があり、導入を検討している方
前提知識
- Dockerコンテナの基本概念
- YAMLファイルの読み書き
- 基本的なネットワーク・インフラの知識
Docker Composeとは
Docker Composeは、複数のDockerコンテナを定義・管理するためのツールです。1つのYAMLファイル(docker-compose.yml)で複数のサービスを宣言的に記述し、docker compose upコマンド一発で環境を立ち上げることができます。
主な機能と特徴
| 特徴 | 説明 |
|---|---|
| シンプルな設定 | 1ファイルで複数コンテナを定義 |
| ローカル開発向け | 開発環境の構築に最適 |
| 依存関係管理 | サービス間の起動順序を制御可能 |
| ボリューム・ネットワーク | 永続化とコンテナ間通信を簡単に設定 |
設定ファイルの例
# docker-compose.yml
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
depends_on:
- api
api:
build: ./api
environment:
- DATABASE_URL=postgres://db:5432/app
depends_on:
- db
db:
image: postgres:15
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=app
- POSTGRES_PASSWORD=secret
volumes:
postgres_data:
このように、Web、API、データベースの3層構成を簡潔に記述できます。
Kubernetesとは
Kubernetes(K8sとも呼ばれます)は、コンテナ化されたアプリケーションのデプロイ、スケーリング、運用を自動化するためのプラットフォームです。Googleが開発し、現在はCNCF(Cloud Native Computing Foundation)が管理しています。
主なコンポーネント
Kubernetesは多くのコンポーネントで構成されています。主要なものを理解しておきましょう。
| コンポーネント | 役割 |
|---|---|
| Pod | 最小デプロイ単位。1つ以上のコンテナを含む |
| Service | Podへのネットワークアクセスを抽象化 |
| Deployment | Podのレプリカ数や更新戦略を管理 |
| ConfigMap/Secret | 設定情報や機密情報を管理 |
| Ingress | 外部からのHTTPルーティングを制御 |
設定ファイルの例
KubernetesではManifest(マニフェスト)ファイルでリソースを定義します。
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-deployment
spec:
replicas: 3
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: myapp/api:v1.0.0
ports:
- containerPort: 8080
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: api-service
spec:
selector:
app: api
ports:
- port: 80
targetPort: 8080
type: ClusterIP
Docker Composeと比較すると、設定がより詳細で冗長に見えますが、その分きめ細かい制御が可能です。
Docker ComposeとKubernetesの比較
アーキテクチャの違い
両者のアーキテクチャの違いを図で確認してみましょう。
比較表
| 観点 | Docker Compose | Kubernetes |
|---|---|---|
| 対象環境 | 単一ホスト | 複数ノードのクラスター |
| スケーラビリティ | 限定的 | 高い(水平スケーリング対応) |
| 可用性 | 自己修復なし | 自動復旧・ローリングアップデート |
| ネットワーク | シンプルなブリッジ | 高度なネットワークポリシー |
| 学習コスト | 低い | 高い |
| 運用コスト | 低い | 高い(ただしマネージドサービス利用で軽減可) |
| 設定の複雑さ | シンプル | 複雑(多くのリソースタイプ) |
| エコシステム | 限定的 | 豊富(Helm、Istio、ArgoCD等) |
スケーラビリティ
Docker Composeでは、docker compose up --scale api=3のようにレプリカ数を指定できますが、これはあくまで単一ホスト内での話です。ホストの物理リソースが上限となります。
Kubernetesでは、Deploymentのreplicasを変更するだけで、クラスター内の複数ノードにPodを分散配置できます。Horizontal Pod Autoscalerを使えば、CPU使用率などに基づいた自動スケーリングも可能です。
可用性・自己修復機能
Kubernetesの大きな強みは自己修復機能です。
- Podがクラッシュすると自動的に再起動
- ノードが故障すると別ノードにPodを再スケジュール
- ヘルスチェックにより異常なPodを自動的にサービスから除外
Docker Composeにはこのような機能がないため、障害発生時は手動での対応が必要になります。
ネットワーキング
| 機能 | Docker Compose | Kubernetes |
|---|---|---|
| サービスディスカバリ | コンテナ名で解決 | DNS・Service抽象化 |
| ロードバランシング | 基本的なラウンドロビン | 高度なトラフィック制御 |
| Ingress | なし | HTTPルーティング対応 |
| ネットワークポリシー | なし | Pod間通信の制御可能 |
どちらを選ぶべきか?〜 ユースケース別ガイド
Docker Composeが適しているケース
- ローカル開発環境:開発者が手元で動かす環境の構築
- CIパイプライン:テスト実行時の一時的な環境構築
- 小規模プロジェクト:トラフィックが少なく、単一サーバーで十分な場合
- プロトタイピング:素早くアイデアを形にしたい場合
Kubernetesが適しているケース
- 本番環境:高可用性が求められるサービス
- マイクロサービス:多数のサービスを管理する必要がある場合
- 大規模トラフィック:オートスケーリングが必要な場合
- マルチクラウド:複数のクラウドプロバイダーを跨ぐ運用
選択のフローチャート
Docker ComposeからKubernetesへの移行
組織やプロジェクトが成長すると、Docker ComposeからKubernetesへの移行を検討することがあります。
移行時の考慮点
- 学習コスト:チーム全体がKubernetesの概念を理解する必要がある
- インフラコスト:クラスター運用のためのリソースが必要
- 設定の書き換え:docker-compose.ymlをK8sマニフェストに変換
- 運用体制:監視・ログ収集・セキュリティの見直し
Komposeツールの紹介
Komposeは、docker-compose.ymlをKubernetesマニフェストに変換するツールです。
# インストール
brew install kompose
# 変換の実行
kompose convert -f docker-compose.yml
# 出力例
# - api-deployment.yaml
# - api-service.yaml
# - db-deployment.yaml
# - db-service.yaml
Komposeによる変換はあくまで出発点です。本番運用に向けては、リソース制限、ヘルスチェック、セキュリティコンテキストなどの追加設定が必要になります。
まとめ
Docker ComposeとKubernetesは、それぞれ異なる目的とスコープを持つツールです。
要点の振り返り
| ポイント | 内容 |
|---|---|
| Docker Compose | 単一ホストでの複数コンテナ管理。開発環境に最適 |
| Kubernetes | 分散クラスターでのコンテナオーケストレーション。本番環境に最適 |
| 選択基準 | 環境の規模、可用性要件、チームのスキルで判断 |
| 移行 | Komposeツールで変換可能。ただし追加設定は必須 |
次のステップ
- Docker Composeを深めたい方:公式ドキュメントでCompose Specificationを確認
- Kubernetesを始めたい方:minikubeやkindでローカル環境を構築して実践
- マネージドサービスを検討中の方:GKE、EKS、AKSなどの比較検討
両者は競合するものではなく、開発環境ではDocker Compose、本番環境ではKubernetesという使い分けが一般的です。プロジェクトのフェーズや要件に応じて、適切なツールを選択しましょう。