kcell:Docker アプリを小さな VM に 1 つずつ
できること
- 無改変の Docker:公式の静的バイナリ(Docker 29.8、Compose 5.5)。Compose ファイルはそのまま使えます。
- 18 個のアプリテンプレート(Jellyfin、Nextcloud、Immich など)または独自の Compose ファイル。kcell は keelOS が自動で作り、ネットワーク、CPU、メモリ、ディスクは既定値です。
- 自分の PC から
docker context createに ssh アドレスを指定し、docker compose up -dと実行します。普通の Linux マシンと同じです。 - ボリュームはホスト上の ZFS データセットなので、ファイルはホストからそのまま見えます。ポートは kcell 自身のアドレスに公開され、既定ではホストのアドレスにも転送されます。
- kcell を停止するとチェックポイントが保存され、次回はそのままの状態で戻ります。
しくみ
Docker に必要なのは Linux カーネルで、FreeBSD の jail や Linux 互換レイヤーでは提供できません。そこで kcell は bhyve の VM で、独自に構成した Linux 7.2 カーネル、小さな init、読み取り専用のシステム(圧縮後 86 MB)で動き、同じホストの kcell はこのシステムを共有します。
ボリュームとシステムはホストのデータセットを virtio-fs で渡し、Docker のイメージレイヤーだけがスパースな zvol(既定 40 GB)に置かれます。start から Docker が使えるまで 3.9 秒、チェックポイントからの再開は 1 秒です。
計測結果
- ホスト上のボリューム(virtio-fs):シーケンシャルライト 742–777 MB/s、4K ランダムライト 22–23k IOPS。データベースと npm はローカルディスクと同じ速さです。
- 内蔵 GPU:SR-IOV の VF(第 12 世代以降の Intel)で、kcell が 1080p を 720p HEVC に 73 fps でトランスコードします。
制限事項
- メモリは kcell 全体で設定し、変更には数秒のコールド再起動が必要です。
- 小さなファイルが大量にある処理(展開、コンパイル)はホストのボリュームで 5〜6 倍遅くなります。そうした処理には Docker のボリュームを使います。
- x86 のみ。Swarm の暗号化 overlay ネットワークはなく、内部に SELinux や AppArmor もありません。kcell ではネスト仮想化を有効にできません。
- GPU の共有には第 12 世代以降の Intel 内蔵 GPU が必要です。AMD と NVIDIA は未対応です。
- keelNAS の共有をメディアライブラリにする項目はフォームにありますが、実機で最初から通しては試していません。