T-CREATOR

Docker Swarm 徹底入門:Kubernetes に移行する前に理解すべきこと

Docker Swarm 徹底入門:Kubernetes に移行する前に理解すべきこと

コンテナオーケストレーションの世界では、Kubernetes が圧倒的な地位を築いている現在でも、Docker Swarm は特定の場面で重要な役割を果たしています。Kubernetes への移行を検討している方も、まずは Docker Swarm の本質を理解することで、より適切な技術選定ができるでしょう。

本記事では、Docker Swarm の基礎概念から実践的な使い方まで、初心者の方にもわかりやすく解説いたします。Kubernetes との違いや、どのような場面で Docker Swarm を選ぶべきかについても詳しく説明していきますね。

背景

Docker Swarm が生まれた理由

Docker が登場した初期の頃、コンテナは主に開発環境での利用に留まっていました。しかし、コンテナ技術の成熟とともに、本格的なプロダクション環境での活用が求められるようになったのです。

単一のコンテナを手動で管理していた時代から、複数のコンテナを効率的に運用する必要性が高まりました。Docker 社は、Docker エンジンとの親和性を重視し、シンプルで使いやすいオーケストレーションツールとして Docker Swarm を開発したのです。

mermaidtimeline
    title Docker Swarm の誕生背景
    2013年 : Docker登場
          : 単一コンテナ管理
    2014年 : プロダクション利用増加
          : 複数コンテナ管理ニーズ
    2015年 : Docker Swarm 1.0 リリース
          : 初期オーケストレーション
    2016年 : Docker Swarm Mode 登場
          : Docker Engine 統合

Docker Swarm は、既存の Docker コマンドをそのまま活用できる点が大きな特徴でした。開発者が新しいツールを覚える負担を最小限に抑えながら、スケーラブルなコンテナ環境を構築できるソリューションとして注目されました。

コンテナオーケストレーションの必要性

現代のアプリケーション開発では、マイクロサービスアーキテクチャが主流となっています。1 つのアプリケーションが複数の小さなサービスで構成され、それぞれが独立したコンテナとして動作します。

このような環境では、以下のような課題に直面することになります。

課題項目詳細説明
サービス発見動的に変化するコンテナ間の通信経路管理
負荷分散トラフィックの適切な分散処理
故障時の対応コンテナ障害時の自動復旧機能
スケーリング負荷に応じた自動的なインスタンス調整
設定管理機密情報や設定値の安全な管理
mermaidflowchart TD
    user[ユーザーリクエスト] --> lb[ロードバランサー]
    lb --> svc1[マイクロサービス A]
    lb --> svc2[マイクロサービス B]
    lb --> svc3[マイクロサービス C]

    svc1 --> db1[(データベース A)]
    svc2 --> db2[(データベース B)]
    svc3 --> cache[(Redis キャッシュ)]

    style svc1 fill:#e1f5fe
    style svc2 fill:#e1f5fe
    style svc3 fill:#e1f5fe

上図のような複雑な構成を手動で管理するのは現実的ではありません。オーケストレーションツールが、これらの課題を自動化によって解決してくれるのです。

Kubernetes 登場以前の Docker Swarm の位置づけ

Kubernetes が業界標準となる以前、Docker Swarm は非常に有力なオーケストレーションソリューションでした。Google が Kubernetes をオープンソース化したのは 2014 年ですが、実際に本格的な普及が始まったのは 2016 年以降のことです。

この期間において、Docker Swarm は以下のような優位性を持っていました。

シンプルさと学習コストの低さ

  • 既存の Docker コマンドがそのまま使える
  • 新しい概念や用語が少ない
  • セットアップが簡単で迅速

Docker エコシステムとの統合

  • Docker Compose ファイルがそのまま利用可能
  • Docker Registry との親和性が高い
  • Docker 社による公式サポート

多くの企業や開発チームが、Kubernetes の複雑さを避けて Docker Swarm を選択していた時期がありました。特に、小規模から中規模のプロジェクトでは、Docker Swarm の手軽さが重宝されていたのです。

課題

単体コンテナ運用の限界

単一のサーバーで少数のコンテナを運用している場合、手動での管理も可能です。しかし、アプリケーションの成長とともに、この手法には明確な限界が見えてきます。

リソース制約による課題 1 つのサーバーのリソース(CPU、メモリ、ディスク)には物理的な上限があります。アクセス数の増加やデータ量の拡大に対応するためには、追加のサーバーリソースが必要になるでしょう。

bash# 単一サーバーでの限界例
# CPU使用率が90%を超える状況
docker stats --no-stream
CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %
abc123def456   web-app    89.45%    1.5GiB / 2GiB        75.00%
def456ghi789   database   45.20%    800MiB / 1GiB        78.13%

運用作業の属人化 手動でのコンテナ管理では、特定の担当者に運用ノウハウが集中してしまいます。障害対応や設定変更の手順が文書化されていない場合、チーム全体の運用効率に大きな影響を与えることになります。

高可用性とスケーラビリティの課題

本格的なプロダクション環境では、サービスの継続性が極めて重要です。単体コンテナ運用では、以下のような深刻な課題に直面します。

単一障害点(SPOF)の問題 サーバーが 1 台しかない場合、そのサーバーに障害が発生すると、すべてのサービスが停止してしまいます。これは、24 時間 365 日のサービス提供が求められる現代のビジネス環境では致命的な問題です。

mermaidstateDiagram-v2
    [*] --> 正常運用状態
    正常運用状態 --> サーバー障害発生
    サーバー障害発生 --> 全サービス停止
    全サービス停止 --> 手動復旧作業
    手動復旧作業 --> 正常運用状態

    note right of 全サービス停止
        ユーザーアクセス不可
        ビジネス損失発生
    end note

トラフィック急増への対応困難 想定を超えるアクセス集中が発生した場合、単一サーバーでは適切に対応できません。手動でのスケールアウトには時間がかかり、その間にサービス品質が著しく低下する可能性があります。

管理コストと運用複雑性の問題

アプリケーションの規模が拡大するにつれて、管理すべき要素が急激に増加していきます。

設定管理の複雑化

  • 環境変数や機密情報の管理
  • ネットワーク設定とポート管理
  • ストレージのマウントと権限設定
  • ログとモニタリングの設定

これらを手動で管理していると、設定ミスによる障害リスクが高くなります。また、環境間(開発、ステージング、本番)での設定の一貫性を保つことも困難になるでしょう。

デプロイプロセスの非効率性 新しいバージョンのデプロイ作業が、手動のステップを多く含む複雑なプロセスになってしまいます。これは、アジャイル開発での頻繁なリリースサイクルに対応することを困難にします。

解決策

Docker Swarm の基本概念

Docker Swarm は、複数の Docker ホストを 1 つの仮想的な Docker ホストとして管理するオーケストレーションシステムです。この仕組みにより、前章で述べた課題を効果的に解決できます。

Swarm の核となる 4 つの概念

mermaidflowchart LR
    subgraph cluster[Swarm クラスター]
        manager[Manager Node<br/>・クラスター状態管理<br/>・タスク配布<br/>・API エンドポイント]
        worker1[Worker Node 1<br/>・タスク実行<br/>・コンテナ起動]
        worker2[Worker Node 2<br/>・タスク実行<br/>・コンテナ起動]
    end

    manager --> worker1
    manager --> worker2

    style manager fill:#ffcdd2
    style worker1 fill:#e8f5e8
    style worker2 fill:#e8f5e8

上図のように、Docker Swarm では Manager Node が全体の管理を行い、Worker Node が実際のコンテナ実行を担当します。この役割分担により、効率的なクラスター運用が実現されます。

基本的な用語と概念

用語説明具体例
NodeSwarm クラスターに参加している Docker ホスト物理サーバー、仮想マシン、クラウドインスタンス
Serviceアプリケーションを構成するコンテナ群の定義Web サーバー、データベース、キャッシュサーバー
TaskService で定義されたコンテナの実行単位nginx コンテナ 1 つ、postgres コンテナ 1 つ
Stack複数の Service をまとめた構成単位Web アプリケーション全体のサービス群

ノード管理とクラスター構成

Docker Swarm のクラスター構成は、高可用性を重視した設計となっています。Manager Node の冗長化により、単一障害点を排除できるのです。

Manager Node の冗長化

bash# 初期化:最初の Manager Node を作成
docker swarm init --advertise-addr 192.168.1.10

# 出力例:他のノードを追加するためのコマンドが表示される
Swarm initialized: current node (abc123def456) is now a manager.

To add a worker to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-xxxxx 192.168.1.10:2377

To add a manager to this swarm, run 'docker swarm join-token manager'

クラスター内で Manager Node を複数配置することで、1 台の Manager が故障してもクラスター全体は継続稼働します。推奨される Manager Node の数は、クラスターサイズに応じて以下のように決定されます。

クラスターサイズ推奨 Manager 数許容可能な Manager 故障数
3-5 ノード31
6-10 ノード52
11-20 ノード73

Worker Node の動的追加

bash# Worker Node をクラスターに追加
docker swarm join --token SWMTKN-1-xxxxx 192.168.1.10:2377

# Node の状態確認
docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS
abc123def456 *                manager1   Ready     Active         Leader
def456ghi789                  worker1    Ready     Active
ghi789jkl012                  worker2    Ready     Active

この仕組みにより、サーバーリソースが不足した場合でも、新しいノードを動的に追加してクラスターを拡張できます。

サービス定義とタスク管理

Docker Swarm でのアプリケーション定義は、従来の Docker Compose とほぼ同じ記法を使用できます。これにより、既存の知識をそのまま活用できるでしょう。

基本的なサービス定義

yaml# docker-compose.yml(Swarm 用設定)
version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - '80:80'
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
    networks:
      - webnet

  api:
    image: node:16-alpine
    deploy:
      replicas: 2
      resources:
        limits:
          memory: 512M
        reservations:
          memory: 256M
    networks:
      - webnet
      - dbnet

networks:
  webnet:
    driver: overlay
  dbnet:
    driver: overlay
    internal: true

スタック形式でのデプロイ

bash# スタック全体をデプロイ
docker stack deploy -c docker-compose.yml myapp

# サービスの状態確認
docker service ls
ID             NAME       MODE         REPLICAS   IMAGE
abc123def456   myapp_web  replicated   3/3        nginx:latest
def456ghi789   myapp_api  replicated   2/2        node:16-alpine

# 特定サービスの詳細確認
docker service ps myapp_web
ID             NAME          IMAGE          NODE      DESIRED STATE   CURRENT STATE
ghi789jkl012   myapp_web.1   nginx:latest   worker1   Running         Running 2 minutes ago
jkl012mno345   myapp_web.2   nginx:latest   worker2   Running         Running 2 minutes ago
mno345pqr678   myapp_web.3   nginx:latest   manager1  Running         Running 2 minutes ago

Swarm は、指定された replicas 数に基づいて、各 Worker Node にタスクを自動分散します。ノードに障害が発生した場合、他の正常なノードで自動的にタスクが再起動されるのです。

ネットワークとストレージ管理

Docker Swarm では、overlay ネットワークを使用してクラスター内の通信を管理します。これにより、複数のホストにまたがる secure な通信が実現されます。

Overlay ネットワークの仕組み

mermaidflowchart TB
    subgraph host1[Host 1 - Manager]
        cont1[Container A<br/>10.0.1.2]
        cont2[Container B<br/>10.0.1.3]
    end

    subgraph host2[Host 2 - Worker]
        cont3[Container C<br/>10.0.1.4]
        cont4[Container D<br/>10.0.1.5]
    end

    subgraph overlay[Overlay Network: 10.0.1.0/24]
        direction TB
        cont1 <--> cont3
        cont2 <--> cont4
        cont1 <--> cont4
    end

    style overlay fill:#e3f2fd

ストレージの永続化

bash# Volume の作成
docker volume create --driver local myapp-data

# サービスでの Volume 利用
docker service create \
  --name database \
  --mount type=volume,source=myapp-data,target=/var/lib/mysql \
  mysql:8.0

# 複数ノード間での共有ストレージ(NFS例)
docker volume create \
  --driver local \
  --opt type=nfs \
  --opt o=addr=192.168.1.100,rw \
  --opt device=:/path/to/shared \
  shared-storage

共有ストレージを活用することで、コンテナが異なるノードで再作成されても、データの永続性を保つことができます。

具体例

シンプルな Web アプリケーションの Swarm 化

実際に動作する Web アプリケーションを例に、Docker Swarm での運用方法を詳しく見ていきましょう。

アプリケーション構成

  • フロントエンド:React アプリケーション(Nginx で配信)
  • バックエンド:Node.js API サーバー
  • データベース:PostgreSQL
  • キャッシュ:Redis

Docker Compose ファイルの作成

yaml# docker-compose.prod.yml
version: '3.8'

services:
  frontend:
    image: myapp/frontend:latest
    ports:
      - '80:80'
      - '443:443'
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
      placement:
        constraints:
          - node.role == worker
    networks:
      - frontend-network
    configs:
      - source: nginx-config
        target: /etc/nginx/nginx.conf

  backend:
    image: myapp/backend:latest
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://user:pass@database:5432/myapp
      - REDIS_URL=redis://cache:6379
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure
        delay: 10s
      resources:
        limits:
          memory: 1GB
        reservations:
          memory: 512MB
    networks:
      - frontend-network
      - backend-network
    secrets:
      - db-password
      - jwt-secret

  database:
    image: postgres:14
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD_FILE=/run/secrets/db-password
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.labels.database == true
    volumes:
      - postgres-data:/var/lib/postgresql/data
    networks:
      - backend-network

  cache:
    image: redis:7-alpine
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    networks:
      - backend-network

networks:
  frontend-network:
    driver: overlay
    attachable: true
  backend-network:
    driver: overlay
    internal: true

volumes:
  postgres-data:
    driver: local

secrets:
  db-password:
    external: true
  jwt-secret:
    external: true

configs:
  nginx-config:
    external: true

事前準備:Secrets と Configs の設定

bash# データベースパスワードをSecretとして作成
echo "my-secure-database-password" | docker secret create db-password -

# JWT秘密鍵をSecretとして作成
echo "my-jwt-secret-key-very-long-and-secure" | docker secret create jwt-secret -

# Nginx設定ファイルをConfigとして作成
docker config create nginx-config ./nginx.conf

クラスターの初期化とデプロイ

bash# Swarm クラスターの初期化
docker swarm init --advertise-addr $(hostname -I | awk '{print $1}')

# データベース専用ノードのラベル設定
docker node update --label-add database=true $(docker node ls --format "table {{.Hostname}}" -q)

# アプリケーションのデプロイ
docker stack deploy -c docker-compose.prod.yml myapp

# デプロイ状況の確認
docker stack services myapp
ID             NAME             MODE         REPLICAS   IMAGE
abc123         myapp_frontend   replicated   2/2        myapp/frontend:latest
def456         myapp_backend    replicated   3/3        myapp/backend:latest
ghi789         myapp_database   replicated   1/1        postgres:14
jkl012         myapp_cache      replicated   1/1        redis:7-alpine

このデプロイにより、以下のような分散環境が構築されます:

mermaidflowchart TB
    user[ユーザー] --> lb[Load Balancer<br/>Port 80/443]

    subgraph swarm[Docker Swarm Cluster]
        lb --> frontend1[Frontend 1<br/>React + Nginx]
        lb --> frontend2[Frontend 2<br/>React + Nginx]

        frontend1 --> backend1[Backend 1<br/>Node.js API]
        frontend1 --> backend2[Backend 2<br/>Node.js API]
        frontend2 --> backend3[Backend 3<br/>Node.js API]

        backend1 --> database[(PostgreSQL<br/>Database)]
        backend2 --> database
        backend3 --> database

        backend1 --> cache[(Redis<br/>Cache)]
        backend2 --> cache
        backend3 --> cache
    end

    style frontend1 fill:#e1f5fe
    style frontend2 fill:#e1f5fe
    style backend1 fill:#f3e5f5
    style backend2 fill:#f3e5f5
    style backend3 fill:#f3e5f5
    style database fill:#e8f5e8
    style cache fill:#fff3e0

基本的なスケーリング操作

アクセス数の増加やリソース使用量の変化に応じて、サービスを動的にスケールできます。

手動スケーリング

bash# バックエンドサービスを5インスタンスに増加
docker service scale myapp_backend=5

# スケーリング結果の確認
docker service ps myapp_backend
ID             NAME               IMAGE                  NODE      DESIRED STATE   CURRENT STATE
abc123def456   myapp_backend.1    myapp/backend:latest   worker1   Running         Running 5 minutes ago
def456ghi789   myapp_backend.2    myapp/backend:latest   worker2   Running         Running 5 minutes ago
ghi789jkl012   myapp_backend.3    myapp/backend:latest   worker1   Running         Running 5 minutes ago
jkl012mno345   myapp_backend.4    myapp/backend:latest   worker2   Running         Running 30 seconds ago
mno345pqr678   myapp_backend.5    myapp/backend:latest   manager1  Running         Running 30 seconds ago

# 負荷が下がったらスケールダウン
docker service scale myapp_backend=2

リソース使用量の監視

bash# 全サービスのリソース使用状況確認
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}"

CONTAINER                 CPU %     MEM USAGE / LIMIT     MEM %
myapp_backend.1.abc123    25.30%    245.2MiB / 1GiB      23.95%
myapp_backend.2.def456    31.45%    287.5MiB / 1GiB      28.08%
myapp_frontend.1.ghi789   5.20%     89.3MiB / 512MiB     17.44%
myapp_frontend.2.jkl012   7.80%     95.1MiB / 512MiB     18.57%

スケーリング操作により、システム全体のパフォーマンスを最適化し、コスト効率も向上させることができます。

ローリングアップデート実装

アプリケーションの新バージョンをダウンタイムなしでデプロイする方法を説明します。

更新戦略の設定

yaml# docker-compose.prod.yml(更新部分)
services:
  backend:
    image: myapp/backend:latest
    deploy:
      replicas: 3
      update_config:
        parallelism: 1 # 同時に更新するタスク数
        delay: 30s # 各更新間の待機時間
        failure_action: rollback # 失敗時の動作
        monitor: 60s # 監視期間
        max_failure_ratio: 0.3 # 許容失敗率
      rollback_config:
        parallelism: 1
        delay: 10s
        failure_action: pause
        monitor: 30s

段階的なデプロイ実行

bash# 新しいイメージでサービスを更新
docker service update --image myapp/backend:v2.1.0 myapp_backend

# 更新の進行状況を監視
docker service ps myapp_backend
ID             NAME                   IMAGE                    NODE      DESIRED STATE   CURRENT STATE
pqr678stu901   myapp_backend.1        myapp/backend:v2.1.0     worker1   Running         Running 1 minute ago
\_abc123def456 \_ myapp_backend.1    myapp/backend:latest     worker1   Shutdown        Shutdown 1 minute ago
stu901vwx234   myapp_backend.2        myapp/backend:v2.1.0     worker2   Running         Running 30 seconds ago
\_def456ghi789 \_ myapp_backend.2    myapp/backend:latest     worker2   Shutdown        Shutdown 30 seconds ago
vwx234yza567   myapp_backend.3        myapp/backend:latest     manager1  Running         Running 5 minutes ago

ロールバック実行

問題が発生した場合、即座に前のバージョンに戻すことができます。

bash# 手動ロールバック
docker service rollback myapp_backend

# ロールバック状況の確認
docker service ps myapp_backend --format "table {{.Name}}\t{{.Image}}\t{{.CurrentState}}"
NAME                 IMAGE                    CURRENT STATE
myapp_backend.1      myapp/backend:latest     Running 2 minutes ago
myapp_backend.2      myapp/backend:latest     Running 90 seconds ago
myapp_backend.3      myapp/backend:latest     Running 60 seconds ago

このローリングアップデート機能により、本番環境でのサービス継続性を保ちながら、安全にアプリケーションを更新できます。

まとめ

Docker Swarm の特徴と適用場面

Docker Swarm は、シンプルさと実用性を重視したコンテナオーケストレーションソリューションです。これまで見てきたように、多くの優れた特徴を持っています。

主要な特徴

特徴詳細メリット
学習コストの低さDocker Compose の知識がそのまま活用可能既存チームでの導入が容易
シンプルな運用複雑な設定や概念が少ない運用負荷の軽減
ネイティブ統合Docker Engine に完全統合追加ツールのインストール不要
高可用性Manager Node の冗長化による障害耐性サービス継続性の確保

適用が効果的な場面

Docker Swarm は、以下のような条件に該当するプロジェクトで特に威力を発揮します。

mermaidflowchart TD
    start[プロジェクト評価] --> size{チームサイズ}
    size -->|小〜中規模<br/>5-20人| small[Docker Swarm 適用検討]
    size -->|大規模<br/>20人以上| large[Kubernetes 検討]

    small --> complexity{システム複雑度}
    complexity -->|シンプル<br/>マイクロサービス数<10| simple[Docker Swarm 推奨]
    complexity -->|複雑<br/>マイクロサービス数≥10| complex[要件詳細確認]

    simple --> deploy[Docker Swarm<br/>デプロイ決定]
    complex --> features{必要機能}
    features -->|基本的なオーケストレーション| basic[Docker Swarm 選択]
    features -->|高度な機能<br/>(サービスメッシュ等)| advanced[Kubernetes 選択]

    style deploy fill:#c8e6c9
    style basic fill:#c8e6c9
    style advanced fill:#ffcdd2

具体的な適用シナリオ

  1. スタートアップ企業での初期システム

    • 限られたリソースで迅速なサービス立ち上げが必要
    • 運用チームが少数で、複雑な技術の習得時間が取れない
  2. 既存 Docker 環境の拡張

    • Docker Compose での運用から段階的にスケールアップ
    • 既存の知識とワークフローを活かしたい
  3. エッジコンピューティング環境

    • リソース制約のある環境での軽量なオーケストレーション
    • ネットワーク帯域が限られた分散環境

Kubernetes 移行を検討すべきタイミング

Docker Swarm での運用を続ける中で、以下のような状況に遭遇した場合は、Kubernetes への移行を真剣に検討する時期かもしれません。

技術的な制約による移行検討

制約項目Docker Swarm の限界Kubernetes での解決
Auto Scaling基本的な手動スケーリングのみHPA、VPA による自動スケーリング
ネットワーク制御シンプルな overlay ネットワークCNI プラグインによる柔軟な制御
ストレージ基本的な Volume 管理CSI による高度なストレージ管理
セキュリティ基本的な RBACPod Security Policy、Network Policy
可観測性限定的なメトリクス豊富なモニタリングエコシステム

組織的な要因による移行検討

mermaidflowchart LR
    subgraph org[組織の成長段階]
        stage1[初期段階<br/>チーム<10人<br/>サービス<5個]
        stage2[成長段階<br/>チーム10-30人<br/>サービス5-15個]
        stage3[拡大段階<br/>チーム>30人<br/>サービス>15個]
    end

    stage1 --> swarm[Docker Swarm<br/>適用継続]
    stage2 --> eval[移行タイミング<br/>評価期間]
    stage3 --> k8s[Kubernetes<br/>移行実施]

    style swarm fill:#c8e6c9
    style eval fill:#fff3e0
    style k8s fill:#e3f2fd

移行判断のチェックリスト

以下の項目で、該当するものが 3 つ以上ある場合は、Kubernetes 移行を本格的に検討することをお勧めします。

  • マイクロサービス数が 15 個を超えている
  • 複数のプログラミング言語・フレームワークを使用
  • CI/CD パイプラインの高度化が必要
  • コンプライアンス要件(セキュリティ、監査)が厳格
  • マルチクラウド環境での運用が必要
  • 開発チームが複数に分かれている
  • 24 時間 365 日の高可用性が必須
  • トラフィック変動が激しく、自動スケーリングが必要

Docker Swarm は、適切な場面で使用すれば非常に強力なツールです。しかし、システムの成長とともに、より高度な機能が必要になった際は、Kubernetes への移行を検討することで、さらなる運用効率の向上が期待できるでしょう。

どちらを選択するにしても、現在の要件と将来の拡張性を総合的に判断し、チーム全体でのコンセンサスを得ることが成功の鍵となります。

関連リンク