サイトアイコンmaita tomoya dev io

コンテナ技術比較

comparison

コンテナ技術比較(Docker vs Docker Compose vs ECS vs EKS vs Fargate)

はじめに

コンテナ技術は現代のソフトウェア開発・デプロイにおいて不可欠な存在となった。「開発環境では動くのに本番で動かない」という問題を解決し、アプリケーションの移植性と再現性を飛躍的に向上させた。本ページでは、コンテナの基礎から各技術の位置づけ、選定基準までを整理する。

コンテナ技術の歴史

出来事
1979年chroot登場(UNIX V7)。プロセスのルートディレクトリを変更
2000年FreeBSD Jail。より完全なプロセス分離
2006年Google が cgroups を Linux カーネルに提案
2008年LXC(Linux Containers)登場。cgroups + namespaces を活用
2013年Docker 登場。コンテナ技術を一般開発者に普及
2014年Kubernetes Google がOSS公開
2014年Amazon ECS 発表
2015年Docker Compose 登場(旧 Fig)
2017年AWS Fargate 発表。サーバーレスコンテナ
2018年Amazon EKS 一般提供開始
2020年Kubernetes が Docker ランタイムを非推奨化(containerd推奨)

コンテナ vs 仮想マシン

graph TB subgraph 仮想マシン HW1[ハードウェア] --> HV[ハイパーバイザー<br/>VMware / KVM] HV --> VM1[ゲストOS 1<br/>+ アプリ A] HV --> VM2[ゲストOS 2<br/>+ アプリ B] HV --> VM3[ゲストOS 3<br/>+ アプリ C] end subgraph コンテナ HW2[ハードウェア] --> HOS[ホストOS<br/>Linux] HOS --> CR[コンテナランタイム<br/>containerd] CR --> C1[コンテナ A<br/>アプリ + 依存関係] CR --> C2[コンテナ B<br/>アプリ + 依存関係] CR --> C3[コンテナ C<br/>アプリ + 依存関係] end
項目仮想マシンコンテナ
分離レベルOSレベル(完全分離)プロセスレベル
起動時間分単位秒〜ミリ秒単位
サイズGB単位MB単位
リソース効率低い(ゲストOS分のオーバーヘッド)高い(カーネル共有)
移植性低い高い
セキュリティ高い(完全分離)中(カーネル共有)

各技術の位置づけ

graph TB subgraph ローカル開発 D[Docker<br/>単一コンテナ] --> DC[Docker Compose<br/>複数コンテナ管理] end subgraph 本番運用 AWS DC -->|小〜中規模| ECS[Amazon ECS<br/>AWSネイティブ<br/>オーケストレーション] DC -->|大規模・マルチクラウド| EKS[Amazon EKS<br/>マネージドKubernetes] ECS --> FG[AWS Fargate<br/>サーバーレスコンテナ] EKS --> FG ECS --> EC2[EC2起動タイプ<br/>サーバー管理型] EKS --> EC2_EKS[EC2ノード<br/>サーバー管理型] end style D fill:#2496ED,color:#fff style DC fill:#2496ED,color:#fff style ECS fill:#FF9900,color:#fff style EKS fill:#FF9900,color:#fff style FG fill:#FF9900,color:#fff

Docker

概要

Dockerはコンテナの作成・実行・配布を行うプラットフォーム。Dockerfileからイメージを構築し、そのイメージからコンテナを起動する。

基本概念

概念説明
Dockerfileイメージの設計図。ベースイメージ、依存関係、実行コマンドを記述
イメージコンテナの「テンプレート」。読み取り専用のファイルシステム
コンテナイメージから起動された実行中のプロセス
レジストリイメージの保管場所(Docker Hub, ECR, GCR)
ボリュームデータの永続化。コンテナ外にデータを保持

Dockerfile の例

# Node.js アプリケーション
FROM node:20-slim AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-slim
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
USER node
CMD ["node", "dist/index.js"]

よく使うコマンド

# イメージのビルド
docker build -t my-app:latest .

# コンテナの起動
docker run -d -p 3000:3000 --name my-app my-app:latest

# 実行中のコンテナ確認
docker ps

# ログ確認
docker logs my-app

# コンテナに入る
docker exec -it my-app /bin/sh

# イメージの配布
docker push my-registry/my-app:latest

Docker Compose

概要

Docker Composeは、複数のコンテナをまとめて定義・管理するツール。docker-compose.ymlに全サービスの設定を記述し、1コマンドで環境全体を起動・停止できる。

docker-compose.yml の例

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

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

  cache:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  postgres_data:

よく使うコマンド

# 全サービス起動
docker compose up -d

# ログ確認
docker compose logs -f app

# 全サービス停止・削除
docker compose down

# ボリュームも含めて削除
docker compose down -v

# 特定サービスの再ビルド
docker compose build app

Amazon ECS(Elastic Container Service)

概要

ECSはAWSネイティブのコンテナオーケストレーションサービス。AWSサービスとの統合が深く、Kubernetes を必要としないシンプルなコンテナ管理を提供する。

基本概念

概念説明
クラスターコンテナを実行する論理的なグループ
タスク定義コンテナの設計図(イメージ、CPU/メモリ、ポート、環境変数)
タスクタスク定義から起動されたコンテナの実行単位
サービスタスクの数を維持・管理する仕組み(常に3つ起動等)
起動タイプEC2(自分でサーバー管理)or Fargate(サーバーレス)

メリット

  • AWSサービスとの深い統合(ALB, CloudWatch, IAM, VPC)
  • Kubernetesより学習コストが低い
  • Fargateとの組み合わせで運用負荷が極めて低い

デメリット

  • AWSロックイン
  • Kubernetesほどの柔軟性・エコシステムがない
  • マルチクラウドには不向き

Amazon EKS(Elastic Kubernetes Service)

概要

EKSはAWSが提供するマネージドKubernetesサービス。Kubernetesのコントロールプレーンの運用をAWSが担い、ユーザーはワーカーノードとアプリケーションの管理に集中できる。

Kubernetes の基本概念

概念説明
Pod1つ以上のコンテナのグループ。最小デプロイ単位
DeploymentPodのレプリカ数管理、ローリングアップデート
ServicePodへのネットワークアクセスを提供(ロードバランシング)
Ingress外部からのHTTPルーティング
ConfigMap / Secret設定情報・機密情報の管理
Namespaceリソースの論理的な分離

メリット

  • Kubernetesエコシステムの活用(Helm, ArgoCD, Istio等)
  • マルチクラウド・オンプレミスとのポータビリティ
  • きめ細かいリソース制御
  • 大規模クラスタの運用に実績

デメリット

  • 学習コストが非常に高い
  • 運用の複雑さ(ノード管理、アップグレード)
  • 小規模チームにはオーバースペック
  • コントロールプレーンの固定費用(約$73/月)

AWS Fargate

概要

FargateはECS / EKSの「サーバーレスコンテナ」起動タイプ。EC2インスタンスの管理が不要で、コンテナに必要なCPU/メモリを指定するだけで実行できる。

EC2起動タイプ vs Fargate

項目EC2起動タイプFargate
サーバー管理必要(パッチ適用、スケーリング)不要
料金EC2インスタンス料金vCPU + メモリの従量課金
起動速度インスタンス起動分遅い数十秒〜
GPU対応対応非対応
カスタマイズ高い(カーネルパラメータ等)制限あり
コスト効率大規模で効率的小〜中規模で効率的

Fargateが適するケース

  • サーバー管理を一切したくない
  • トラフィックが可変(スケールアップ/ダウンが頻繁)
  • 小〜中規模のマイクロサービス
  • バッチ処理(必要な時だけ起動)

総合比較表

項目DockerDocker ComposeECSEKSFargate
用途コンテナ構築・実行ローカル複数コンテナ本番オーケストレーション本番K8sオーケストレーションサーバーレスコンテナ
環境ローカル/CIローカル/CIAWS本番AWS本番AWS本番
学習コスト
運用コスト
スケーラビリティ単一ホスト単一ホスト非常に高
マルチクラウド不可可能(K8s互換)不可
最小月額費用無料無料Fargate利用分~$73 + ノード費用利用分のみ

選定フローチャート

flowchart TD A[コンテナ技術を選ぶ] --> B{本番環境?} B -->|ローカル開発/CI| C{複数コンテナ?} C -->|1つ| D[Docker] C -->|複数| E[Docker Compose] B -->|本番| F{マルチクラウド/K8sエコシステムが必要?} F -->|はい| G[EKS] F -->|いいえ| H{サーバー管理をしたくない?} H -->|はい| I[ECS + Fargate] H -->|自分で管理OK<br/>コスト最適化| J{大規模?} J -->|はい| K[EKS + EC2ノード] J -->|いいえ| L[ECS + EC2]

構成パターン例

パターン1: スタートアップ(小規模)

開発: Docker Compose
本番: ECS + Fargate
CI/CD: GitHub Actions → ECR → ECS
  • サーバー管理不要
  • 初期費用が低い
  • 必要に応じてスケール

パターン2: 中規模サービス

開発: Docker Compose
本番: ECS + Fargate + EC2(コスト最適化)
CI/CD: GitHub Actions → ECR → ECS
監視: CloudWatch + X-Ray
  • ベースラインはEC2で、スパイクはFargateで吸収
  • コスト効率と柔軟性のバランス

パターン3: 大規模エンタープライズ

開発: Docker Compose + Skaffold
本番: EKS + EC2ノード + Fargate
CI/CD: ArgoCD (GitOps)
サービスメッシュ: Istio
監視: Prometheus + Grafana
  • Kubernetesエコシステムをフル活用
  • GitOpsによる宣言的デプロイ
  • 高度な監視・トレーシング

コンテナセキュリティのベストプラクティス

カテゴリベストプラクティス
イメージ公式ベースイメージを使用。不要なパッケージを含めない
権限rootユーザーで実行しない(USER node
スキャンイメージの脆弱性スキャン(Trivy, Snyk, ECR Scan)
シークレット環境変数やDockerfile にシークレットを含めない。Secrets Manager使用
ネットワーク必要なポートだけ公開。VPC内で通信
更新ベースイメージを定期的に更新

まとめ

  • Docker: コンテナ技術の基礎。全てのスタート地点
  • Docker Compose: ローカル開発での複数コンテナ管理に最適
  • ECS: AWSネイティブのシンプルなオーケストレーション
  • EKS: Kubernetesが必要な大規模・マルチクラウド環境向け
  • Fargate: サーバー管理不要のサーバーレスコンテナ実行環境

「まずはDocker → Docker Compose → ECS + Fargateの順に習得し、必要に応じてEKSへ」が推奨の学習パスである。

参考文献