UbuntuでのLXDコンテナのインストールと管理: 軽量仮想化の実現

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

はじめに: LXD – Ubuntuにおける軽量仮想化ソリューション

皆さん、こんにちは。Ubuntuサーバーでリソース最適化に苦労しながらも、多くの独立した環境を構築したいと考えたことがあるなら、重い仮想マシン(KVMなど)と、超軽量だがアプリケーションに特化したコンテナ(Dockerなど)のどちらを選ぶかという「ジレンマ」を理解できるでしょう。個人的には、さまざまな環境で長期間作業した後、LXDという「最適なバランス」を見つけました。

LXDは全く新しいテクノロジーではありませんが、システムコンテナを作成するための非常に強力なツールです。簡単に言えば、KVMのようにハードウェア全体を仮想化するのではなく、LXDはOSレベルで仮想化を行います。

各LXDコンテナは、systemd、SSH、その他期待されるすべての機能を備えた完全なUbuntu(または他のLinuxディストリビューション)仮想マシンのようですが、非常に軽量で起動が高速です。ホストとLinuxカーネルを共有するため、パフォーマンスはほぼネイティブで、KVMよりもはるかに少ないRAMを消費します。CentOSからUbuntuに切り替えたばかりの頃、パッケージ管理システムに慣れるのに約1週間かかりましたが、LXDを使って数秒で新しいUbuntuインスタンスを「立ち上げて」試せるのは非常に便利だと感じました。

この記事では、LXDを仕事に最大限活用できるよう、UbuntuでのLXDのインストールと管理方法を、基本的な手順から高度なヒントまで、AからZまで皆さんをガイドします。

クイックスタート: 5分でLXDをインストールして実行

さて、前置きはこれくらいにして、早速始めましょう。このセクションの目標は、数分でLXDコンテナを実行できるようにすることです。Ubuntuマシン(サーバーでもデスクトップでも構いません)を準備してください。

1. LXDのインストール

LXDはUbuntu上でSnapパッケージとして配布されているため、インストールは非常に簡単です。


sudo snap install lxd

Snapを初めて使用する場合、必要なコンポーネントのダウンロードに少し時間がかかることがあります。インストール後、LXDを操作する際にsudoを使用する必要がないように、ご自身のユーザーをlxdグループに追加します。


sudo usermod -a -G lxd $USER
newgrp lxd

newgrp lxdコマンドは、ログアウト/ログインなしで変更を即座に適用するのに役立ちます。

2. LXDの初期化

次に、LXDデーモンを初期化する必要があります。lxd initコマンドは、いくつかの基本的な設定質問に答えるよう促します。ほとんどのデフォルトオプションは初心者には問題ありません。


lxd init

私は通常、次のように選択します(デフォルトオプションはEnterを押すだけで構いません)。

  • クラスターでLXDを使用しますか? (yes/no) [default=no]: no
  • 新しいストレージプールを作成しますか? (yes/no) [default=yes]: yes
  • 新しいストレージプールの名前 [default=default]: default
  • 既存のブロックデバイスを使用しますか? (yes/no) [default=no]: no
  • 新しいループデバイスのサイズ(GB単位、最小1GB) [default=30GB]: (デフォルトのままにするか、必要なサイズを入力してください。例えば、空き容量が限られている場合は10GBなど)
  • ブリッジインターフェースに接続しますか? (yes/no) [default=yes]: yes
  • 新しいブリッジの名前は何にしますか? [default=lxdbr0]: lxdbr0
  • どのIPv4アドレスを使用しますか? (CIDRサブネット表記、“auto” または “none”) [default=auto]: auto
  • どのIPv6アドレスを使用しますか? (CIDRサブネット表記、“auto” または “none”) [default=auto]: auto
  • ネットワーク経由でLXDを利用可能にしますか? (yes/no) [default=no]: no (このオプションは、LXDをリモートから管理する必要がある場合にのみ有効にしてください。ローカルでのセットアップには不要です)
  • 古いキャッシュイメージを自動的に更新しますか? (yes/no) [default=yes]: yes
  • 設定のYAMLサマリーを表示しますか? (yes/no) [default=yes]: yes

3. 最初のコンテナの起動

これで、Ubuntu 22.04コンテナを作成し、my-first-containerという名前を付けます。


lxc launch ubuntu:22.04 my-first-container

このコマンドは、公開イメージリポジトリからUbuntu 22.04イメージを自動的に検索してダウンロードし、その後コンテナを作成して起動します。このプロセスは、ネットワーク速度に応じて通常数秒から1分程度しかかかりません。

4. コンテナの確認とアクセス

コンテナが実行されているかどうかを確認するには:


lxc list

my-first-containerRUNNING状態とIPアドレスとともに表示されます。

コンテナ内のシェルにアクセスするには:


lxc exec my-first-container bash

これでコンテナ内に入りました!apt updateifconfig、またはsystemctl statusを試して、それが独立したオペレーティングシステムとして機能していることを確認してください。

コンテナから出るには、exitと入力します。

5. コンテナの停止と削除

不要になったら、コンテナを停止できます。


lxc stop my-first-container

そして削除します。


lxc delete my-first-container

これでクイックスタートは完了です!LXDコンテナのインストール、設定、作成、アクセス、削除を行いました。かなり手軽ですよね?

LXDの詳細解説

LXDの本質とその有用性をより深く理解するために、もう少し掘り下げてみましょう。

LXDとは何か、そしてなぜ使うべきか?

LXDは次世代のシステムコンテナマネージャーです。LXC(Linux Containers)に基づいて構築されていますが、よりユーザーフレンドリーなインターフェース、強力なREST API、そしてスナップショット、ライブマイグレーション、ストレージ/ネットワーク管理などの多くの高度な管理機能を提供します。

LXDの主な利点:

  • 軽量かつ高速: ホストとLinuxカーネルを共有するため、コンテナは数秒で起動し、従来の仮想マシンに比べて非常に少ないリソース(RAM、CPU)しか消費しません。これにより、同じサーバー上でより多くのインスタンスを実行できます。
  • 完全なOS環境: 単一のアプリケーションに焦点を当てるDockerとは異なり、LXDは完全なオペレーティングシステム環境を提供します。SSH、systemd、複数のサービスを同じコンテナにインストールでき、物理サーバーや通常の仮想マシンとまったく同じように機能します。
  • セキュリティ: LXDは、cgroupsやnamespacesなどのLinuxカーネルのセキュリティ機能を使用してコンテナを分離します。KVMほど完全に分離されているわけではありませんが、高いレベルのセキュリティを提供します。
  • 管理が容易: lxcコマンドは非常に直感的で学習しやすいです。
  • 柔軟性: 多くのストレージバックエンド(ZFS、Btrfs、LVM、Directory)とネットワーク構成をサポートします。

LXDはいつ使うべきか?

  • 内部サービス、開発/ステージング環境の実行。
  • 異なるOSバージョンでのソフトウェアテスト。
  • 特定のタスク(DNS、VPN、監視)用の小型で軽量なサーバーの作成。
  • 仮想マシンに似た環境が必要だが、リソースが限られている場合。

私は以前、KVMをセットアップする代わりに、GitLab Runner、Jenkinsエージェント、さらにはNginxのリバースプロキシなどのサービスを実行するためにLXDを使用していました。LXDの方がはるかに高速で軽量だからです。

LXDアーキテクチャ

LXDはクライアント・サーバーモデルに基づいて動作します。LXDデーモンはホスト上でバックグラウンドで実行され、すべてのコンテナを管理します。ユーザーはlxcコマンドラインツールまたはAPIを通じてデーモンと対話します。

  • LXDデーモン: LXDの心臓部であり、システムサービスとして実行されます。コンテナの作成、管理、監視、クライアントからの要求の処理を担当します。
  • LXDクライアント (`lxc`): デーモンと対話するためのコマンドラインツールです。
  • イメージ: 事前にパッケージ化されたオペレーティングシステムのテンプレート(例: Ubuntu、Debian、Alpine)です。LXDには非常に豊富な公開イメージリポジトリがあります。
  • インスタンス: 実行中のコンテナまたはVMです(LXDもKVM仮想化をサポートしますが、ここではコンテナに焦点を当てます)。
  • ストレージプール: コンテナのデータが保存される場所です。
  • ネットワーク: コンテナのネットワーク構成で、通常は仮想ブリッジを介して行われます。
  • プロファイル: 複数のコンテナに適用できる構成セット(リソース、ネットワーク、デバイス)です。

基本的なインストールと設定(詳細)

クイックスタートでコンテナを実行できるようになりましたが、構成オプションを理解することで、LXDをより効果的に管理できるようになります。

システム要件

LXDは、ほとんどのモダンなUbuntu ServerまたはDesktopバージョン(18.04以降)でうまく動作します。最小要件は、数GBのRAMと数GBのディスク容量です。

LXDの初期化 (`lxd init`) をさらに詳しく

lxd initを実行すると、LXDの主要なコンポーネントを設定しています。

  • ストレージプール: ここにすべてのコンテナのファイルシステムが保存されます。
    • ZFS: スナップショット、クローニング、優れたパフォーマンスなどの多くの高度な機能を提供するため、推奨される選択肢です。十分なRAM(ホストには4GB以上を推奨)があり、プロフェッショナルなストレージ管理を行いたい場合は、ZFSを選択してください。
    • Btrfs: ZFSと同様に、スナップショットとクローニングをサポートします。
    • Directory: 最もシンプルで、ホストの現在のファイルシステム上の単なるディレクトリです。テスト環境や、ZFS/Btrfsの高度な機能が不要な場合に適しています。ただし、ZFS/Btrfsのような効率的なスナップショット機能は提供しません。
  • ネットワークブリッジ (`lxdbr0`): LXDは、コンテナが相互に、また外部と通信できるように仮想ブリッジネットワークを作成します。また、コンテナにIPアドレスを自動的に割り当てるためのDHCPサーバーも統合されています。以前、ホストに別のブリッジが既に存在し、lxd initが自動的に検出せず、正しいサブネットに合わせてブリッジを手動で再構成しなければならないケースに遭遇したことがあります。そのため、複雑なネットワーク設定がある場合は注意してください。
  • リモートアクセス: LXDデーモンが他のコンピューターからの接続を受け入れるためのオプションです。必要な場合にのみ有効にし、セキュリティを確保してください。

後で設定を変更したい場合は、再度lxd initを実行するか、lxc configコマンドを通じて直接編集できます。

高度なコンテナ管理

基本を理解したら、次に日常的なコンテナ管理コマンドについて詳しく見ていきましょう。

コンテナの作成と管理

1. イメージからコンテナを作成する:


lxc launch ubuntu:22.04 web-server-01
lxc launch images:alpine/3.16 database-01

利用可能なイメージはimages.linuxcontainers.orgで閲覧できます。

2. コンテナを一覧表示する:


lxc list
# または詳細情報付きで
lxc list --columns=ns4,s,t,p

3. コンテナにアクセスする:


lxc exec web-server-01 bash
# またはシェルに入らずに特定のコマンドを実行する
lxc exec web-server-01 -- apt update

4. コンテナの停止、起動、再起動:


lxc stop web-server-01
lxc start web-server-01
lxc restart web-server-01

5. コンテナを削除する:


lxc delete web-server-01
# 実行中のコンテナを削除するには、--forceフラグを追加します
lxc delete web-server-01 --force

スナップショット – コンテナの状態を保存する

スナップショットは非常に便利な機能で、特定の時点でのコンテナの状態を保存できます。テストや迅速なバックアップに最適です。

1. スナップショットを作成する:


lxc snapshot web-server-01 initial-setup

2. スナップショットを一覧表示する:


lxc info web-server-01

3. スナップショットから復元する:


lxc restore web-server-01 initial-setup

4. スナップショットを削除する:


lxc delete web-server-01/initial-setup

プロファイル – リソースとデバイスの設定

プロファイルは、1つまたは複数のコンテナに適用できる構成セットです。これにより、構成を標準化し、時間を節約できます。

1. プロファイルを一覧表示する:


lxc profile list

2. プロファイルの内容を表示する:


lxc profile show default

3. 新しいプロファイルを作成する(例: 2GB RAMのWebサーバー用プロファイル):


lxc profile create web-profile
lxc profile edit web-profile

エディタで、config:devices:セクションに次の構成行を追加します。例:

Share: