LXD と LXC の違い:システムコンテナを整理する
よるほろぐ編集部
LXD と LXC。名前がよく似ていて、どちらが何をするものなのか混乱したことがある人は少なくないと思います。私自身も最初は「LXC のラッパーが LXD なんだな」くらいの理解で、実際に触ってみるまで細かい立ち位置を把握できていませんでした。
この記事では LXC、LXD、そして最近登場した Incus の関係を整理しながら、システムコンテナという考え方と実際の操作例を紹介します。
システムコンテナとは何か
Docker に代表されるアプリケーションコンテナは、1つのプロセスだけを動かすことを前提に設計されています。コンテナの中にはアプリ本体と必要最小限のライブラリだけが入っており、sshd や syslog といったデーモンは基本的に動きません。
一方、LXC や LXD が扱うのはシステムコンテナと呼ばれる種類のコンテナです。システムコンテナの中では init プロセス(systemd など)が起動し、複数のデーモンが同時に動作します。あたかも1台の独立した Linux マシンであるかのように振る舞うため、SSH でログインしてパッケージをインストールし、サービスを管理するといった操作が可能です。
仮想マシン(VM)と比較すると、システムコンテナはホストのカーネルを共有するためオーバーヘッドが小さく、起動も数秒で完了します。ただし、ホストと異なるカーネルは使えないため、たとえば Windows を動かしたい場合や、独自のカスタムカーネルが必要なケースでは VM を選ぶことになります。
LXC ― 低レベルコンテナランタイム
LXC(Linux Containers)は、Linux カーネルの名前空間(namespace)と cgroups を直接操作する低レベルなコンテナランタイムです。プロジェクトは linuxcontainers.org が管理しており、C 言語で書かれたライブラリ(liblxc)と、それを操作する lxc-start、lxc-attach、lxc-stop といった伝統的な CLI ツール群を提供しています。
Docker も内部では libcontainer や runc といった低レベルランタイムを使っていますが、LXC は C 言語ベースのライブラリ(liblxc)としてコンテナランタイムの歴史が長く、名前空間や cgroups の扱いを直接提供しています。実際、初期の Docker は LXC を実行ドライバとして利用していました。
現在の LXC は主に LXD の下位コンポーネントとして使われることが多く、単体で lxc-* コマンドを叩く機会は減っています。しかし、コンテナの基礎技術を学ぶには良い題材です。
LXD ― コンテナと VM を統合管理するプラットフォーム
LXD は LXC をベースにしたコンテナ管理デーモンで、REST API と lxc という統一 CLI を提供します。LXC が低レベルのランタイムであるのに対し、LXD は「コンテナを簡単に扱うためのプラットフォーム」という位置づけです。
主な特徴を挙げます。
- イメージベースの運用:
lxc launch ubuntu:24.04 my-containerのように、イメージからコンテナを即座に作成できます。イメージはリモートリポジトリ(ubuntu:、images:など)から取得します。 - 仮想マシンも扱える: LXD は KVM/QEMU を使った仮想マシンの管理も同じ
lxcコマンドで行えます。コンテナと VM を統合的に扱える点が強みです。 - クラスタ構成: 小規模〜中規模のサーバー群で LXD クラスタを組めます。クラスタ全体でコンテナをスケジュールし、高可用性を実現できます。Canonical LXD のドキュメントでは、クラスタの投票者(voter)のデフォルト値は 3 ノード、待機(standby)のデフォルト値は 2 ノードとされており(それぞれ
cluster.max_voters/cluster.max_standbyで変更可能)、これをベースに規模を設計するのが現実的です。 - スナップショットと移行: コンテナのスナップショットを取ったり、稼働中のコンテナを別のホストにライブマイグレーションしたりできます。
LXD はもともと linuxcontainers.org のプロジェクトとして開発が始まりましたが、その後 Canonical(Ubuntu の開発元)が開発を引き継ぎました。現在の公式サイトは canonical.com/lxd です。linuxcontainers.org 側で公開されていた LXD の最終版はアーカイブされており、現在 linuxcontainers.org で開発が継続されているのは LXD の後継プロジェクトである Incus です。
Incus ― コミュニティ主導のフォーク
2023年8月7日、linuxcontainers.org は Incus という新しいプロジェクトを発表しました。Incus は LXD のコミュニティ主導フォークで、Canonical 版 LXD に対する「完全にコミュニティ主導の代替」を目指しています。
フォークを作成したのは Aleksa Sarai で、メンテナには Christian Brauner、Serge Hallyn、Stéphane Graber、Tycho Andersen といった、もともと LXD の開発に携わっていた面々が名を連ねています。つまり、LXD のオリジナル開発チームが Incus に移った形です。
現在の状況を整理すると:
- Canonical LXD(canonical.com/lxd): Canonical が開発・メンテナンスする現行版。Ubuntu との親和性が高い。
- Incus(linuxcontainers.org/incus): linuxcontainers.org 配下のコミュニティ版。元 LXD チームがメンテナンス。
どちらを選ぶかは、Ubuntu エコシステムとの統合を重視するか、ベンダーに依存しないコミュニティ版を好むかの判断になります。
手を動かす:LXD の基本コマンド
ここからは、実際に LXD(Canonical 版)をインストールした環境を想定して、基本的な lxc コマンドを紹介します。
インストールと初期化
# snap でインストール(Ubuntu の場合)
sudo snap install lxd
# 初期設定を行う
sudo lxd init
lxd init ではストレージプールやネットワークの設定を対話的に行います。デフォルトのまま進めても問題なく使えます。
コンテナの起動と一覧表示
# Ubuntu 24.04 のコンテナを起動する
lxc launch ubuntu:24.04 my-container
# 起動中のコンテナ一覧を表示する
lxc list
lxc list の出力にはコンテナ名・状態・IP アドレス・スナップショット数などが表示されます。
コンテナ内でコマンドを実行する
# シェルを起動して中に入る
lxc exec my-container -- bash
# 特定のコマンドだけ実行する
lxc exec my-container -- cat /etc/os-release
-- のあとに実行したいコマンドを書きます。bash を指定すれば、SSH なしでコンテナの中に入って操作できます。
コンテナの停止と削除
# コンテナを停止する
lxc stop my-container
# コンテナを削除する(停止状態である必要がある)
lxc delete my-container
イメージの管理
# 利用可能なイメージを検索する
lxc image list ubuntu: --format table
# ローカルにキャッシュされたイメージを確認する
lxc image list
LXD は一度使ったイメージをローカルにキャッシュするため、同じイメージから2回目以降のコンテナ作成は非常に高速です。
注意点
LXD の lxc コマンドは root 権限なしでも実行できますが、これは lxd デーモンがユーザーからのリクエストを socket 経由で受け付ける仕組みだからです。lxd init の段階でどのユーザーに権限を与えるか設定できます。
まとめ
LXC、LXD、Incus の関係を図にすると次のようになります。
LXC(低レベルランタイム)
└─ LXD(管理デーモン + REST API + CLI)
├─ Canonical LXD(現行、Canonical 開発)
└─ Incus(コミュニティフォーク、linuxcontainers.org)
システムコンテナをこれから始める場合、まずは Canonical LXD を試すのが敷居が低いでしょう。Ubuntu であれば snap install lxd 一発で環境が整います。一方、ベンダーロックインを避けたい場合や、Debian など Ubuntu 以外のディストリビューションで運用するなら Incus を検討する価値があります。
どちらを選んでも、システムコンテナの基本操作はほぼ同じです。まずは lxc launch ubuntu:24.04 my-container を叩いて、コンテナの中に完全な Ubuntu が一瞬で現れる体験をしてみてください。
基本操作を試したら、次はプロファイル・ストレージ・スナップショットを使う日常運用に進み、設定とデータを扱う手順を身につけましょう。