Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新

Dec 16, 2025 - 日記

uncloud: Swarm 難民のためDocker軽量マルチホストデプロイ

uncloud: Swarm 難民のためDocker軽量マルチホストデプロイ

Docker Swarm の開発停滞により、シンプルなマルチホストオーケストレーションを求める開発者たちは新たな選択肢を探しています。「Kubernetesは大げさすぎるけど、Docker Composeだけでは物足りない」――そんなSwarm難民の声に応えるツールが登場しました。

uncloud は、複数のDockerホスト間でコンテナ化アプリケーションをデプロイ・管理する軽量ツールです。Kubernetesのような中央制御プレーン(control plane)を持たず、各マシンがピアツーピア(P2P)でクラスター状態を同期する分散型アーキテクチャを採用しています。

この記事では、uncloudのアーキテクチャの特徴、実際の使用方法、そしてSwarmやKubernetesなど他のツールとの違いについて解説します。

uncloudが解決する問題

現在のコンテナオーケストレーション環境には大きなギャップがあります。

一方には、HerokuやRender のような素晴らしい開発者体験を提供するクラウドプラットフォームがありますが、価格はプレミアムです。もう一方には、Kubernetes のような強力で柔軟なオーケストレーターがありますが、大きな運用コストが必要です。

uncloudは、この2つの間にある「ちょうどいい」ポジションを狙っています:

  • 自前インフラの所有: クラウドVMでも自宅サーバーでも自由に組み合わせて使える
  • シンプルな拡張性: 1台のマシンから始めて、必要に応じて追加可能
  • 実績のあるプリミティブ: サービスディスカバリ、ロードバランシング、自動HTTPSが標準装備
  • 運用コスト最小化: 分散システムの専門家でなくても運用できる

uncloudの特徴的なアーキテクチャ

中央制御プレーンのない分散型設計

uncloudとKubernetesのアーキテクチャ比較

uncloudの最大の特徴は、中央制御プレーンがないことです。Kubernetesのようなマスターノードやetcdクラスターは存在しません。

各マシンはCorrosionFly.io が開発した分散SQLiteデータベース)を使用してクラスター状態を同期します。CRDT(Conflict-free Replicated Data Type:競合のない複製データ型)ベースの実装により、各マシンがクラスター状態の完全なコピーを維持します。

これにより、以下のメリットが得られます:

  • 単一障害点がない: どのマシンがオフラインになってもクラスター操作が継続可能
  • クォーラム管理不要: 過半数のノードが生きている必要がない
  • 運用コストの削減: 高可用性制御プレーンの維持が不要

ゼロ設定のWireGuardメッシュネットワーク

uncloudは、マシン間の通信にWireGuard を使用した自動メッシュネットワークを構築します。

各マシンには専用のサブネット(10.210.X.0/24)が割り当てられ、コンテナはそのサブネット内で一意のIPアドレスを取得します。マシン間でWireGuardトンネルが確立されると、異なるマシン上のコンテナが直接通信できるようになります。

この設計により、複雑なSDN(Software Defined Network)やオーバーレイネットワークの設定なしに、マルチホスト環境でのコンテナ間通信が実現されています。

Docker Compose互換の定義フォーマット

uncloudはDocker Compose仕様 をそのまま使用できます。既存のDocker Composeファイルをほぼそのまま流用できるため、学習コストが最小限です。

1
2
3
4
5
6
7
8
services:
  web:
    image: myapp:latest
    deploy:
      replicas: 3
      mode: replicated
    ports:
      - "app.example.com:8000/https"

この例では、3つのレプリカをデプロイし、app.example.comでHTTPSアクセスを自動的に設定します。

実際の使い方

クラスター初期化

最初のマシンを初期化します:

1
uc machine init root@your-server-ip

このコマンドは以下の処理を実行します:

  1. Dockerのインストール(未インストールの場合)
  2. unclouddマシンデーモンのインストールと起動
  3. Corrosionサービスの設定と起動
  4. WireGuardの鍵ペア生成と設定
  5. Dockerブリッジネットワークの作成

マシンの追加

2台目のマシンを追加します:

1
uc machine add root@second-server-ip

新しいマシンは自動的にクラスターに参加し、既存マシンとWireGuardトンネルを確立します。3台目以降も同様に追加でき、各マシンは他の全マシンとメッシュ接続を形成します。

サービスのデプロイ

Docker Composeファイルからデプロイ:

1
uc compose up -f compose.yaml

または、単一コンテナの実行:

1
uc run -p app.example.com:8000/https myapp:latest

自動HTTPS設定

uncloudはCaddy リバースプロキシを内蔵しており、Let’s Encryptを使用した自動TLS証明書の発行と更新を行います。

-p app.example.com:8000/httpsのようにポート公開を指定すると、以下が自動実行されます:

  1. 全マシンでCaddyが起動(globalモードでデプロイ)
  2. DNS Aレコードの確認(app.example.comがマシンのIPを指している必要あり)
  3. Let’s Encrypt証明書の自動取得
  4. HTTPSリクエストをコンテナポート8000にプロキシ

DNS設定は自分で行う必要がありますが、証明書管理は完全に自動化されています。

他のツールとの比較

vs Kubernetes

項目 uncloud Kubernetes
制御プレーン なし(P2P) あり(etcd, API Server等)
学習曲線 緩やか 急峻
運用コスト 低い 高い
スケール 小〜中規模 大規模
適用場面 自己ホスト、小規模クラスター エンタープライズ、大規模サービス

Kubernetesは強力ですが、etcdクラスターの管理、複雑なYAML設定、クォーラムの維持など、運用コストが高くなります。uncloudは、Googleスケールを必要としない多くのユースケースに適したシンプルな代替案を提供します。

vs Docker Swarm

Docker Swarm は2016年にDockerに統合されたオーケストレーターですが、現在では開発が停滞しています。

uncloudはSwarmと似たシンプルさを持ちますが、以下の点で優れています:

  • アクティブな開発: 2024年に開発開始され、活発にメンテナンスされている
  • モダンな技術スタック: WireGuard、Corrosion、Caddyなど最新技術を活用
  • 分散型設計: マネージャーノードのような中央集権的な概念がない

vs Kamal

Kamal37signals が開発したデプロイツールで、シンプルさを重視する点でuncloudと似ています。

主な違いは:

  • Kamal: 宣言的ではなく命令的なデプロイ。SSHとDockerコマンドの薄いラッパー
  • uncloud: サービスディスカバリ、メッシュネットワーク、分散状態管理を内蔵

Kamalは「複数マシンでDockerコマンドを実行するツール」であるのに対し、uncloudは「軽量オーケストレーター」と言えます。

実際のユースケース

自宅ラボ + クラウドVMのハイブリッド

uncloudの面白いユースケースの1つは、異なる場所・プロバイダーのマシンを統合できることです。

1
2
3
4
5
6
7
8
# 自宅サーバー(Mac mini)
uc machine add [email protected]

# Oracle Cloud(無料枠)
uc machine add ubuntu@oracle-vm-ip

# Hetzner VPS
uc machine add root@hetzner-ip

WireGuardメッシュがNATを超えて自動的に接続を確立するため、これら異なる環境のマシンがシームレスに連携します。

マルチリージョンデプロイ

複数のクラウドプロバイダーやリージョンにまたがってアプリをデプロイすることも簡単です:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
services:
  web:
    image: myapp:latest
    deploy:
      replicas: 6
      placement:
        constraints:
          - node.labels.region==us-east
          - node.labels.region==eu-west
          - node.labels.region==ap-south

各リージョンのCaddyインスタンスが地理的に近いクライアントにサービスを提供します。

制約と注意点

プロダクション利用について

uncloudの公式READMEには、現在プロダクション利用は推奨されていませんと明記されています。プロジェクトはアクティブに開発中で、破壊的な変更が発生する可能性があります。

2024年11月時点でバージョンv0.14.0がリリースされており、まだ1.0には達していません。

対象規模

uncloudは小〜中規模のクラスター(数台〜数十台)を想定しています。数百台以上のマシンや数千のコンテナを管理するような大規模環境では、Kubernetesのような成熟したソリューションが適しています。

ステートフルサービスの制約

Dockerボリュームを使用した永続ストレージは可能ですが、分散ストレージシステム(Ceph、GlusterFS等)の統合はありません。データベースのような重要なステートフルサービスを運用する場合は、別途バックアップ戦略が必要です。

まとめ

uncloudは、「Kubernetesは大げさ、Docker Composeは物足りない」という課題に対する実用的な解決策です。

中央制御プレーンのない分散アーキテクチャ、ゼロ設定のWireGuardメッシュ、Docker Compose互換の設定フォーマットにより、最小限の運用コストで複数マシンにまたがるコンテナオーケストレーションを実現しています。

プロダクション利用にはまだ早いですが、自宅ラボや小規模プロジェクト、Kubernetesの複雑さに悩む開発者にとって、試してみる価値のあるツールです。

自前のインフラで柔軟にアプリケーションを運用したい方は、ぜひuncloudを試してみてください。

参考リンク