サーバー版のUbuntuには最初からインストールされているコンテナ管理システム「LXD 」はCLIで操作するツールです。今回はこれをウェブブラウザーからも操作できるようにしましょう。
サードパーティが作るWeb UIツール
LXDは特にUbuntuで利用されているシステムコンテナ・仮想マシンの管理ツールです。この「システムコンテナ」では、Dockerとは異なり、PID=1のinitを含むシステム全体をコンテナの中に閉じ込めて操作する仕組みになっています。つまり仮想マシンをまるまるコンテナの中に閉じ込めた仕組みであり、ユーザーがコンテナに「ログイン」したあとは、「 普通のLinuxシステム」のように使えるのが特徴です。
LXDについては第521回の「入門システムコンテナマネージャーLXD 3.0 」からリンクされている記事で基本的な使い方を紹介しています[1] 。また第609回の「LXDからコンテナではなく仮想マシンを起動する 」でも紹介しているように、LXD 3.19からコンテナだけでなく仮想マシンもサポートするようになりました。
[1] 本連載のLXD記事をベースにいくつか修正・追記を行った『ふわっと知りたいLXD』も電子書籍版をBOOTH や技術書典マーケット で販売しています。インターネットを活用できない環境でLXDを利用したい方はぜひご購入ください。ちなみに内容はLXD 3.0ベースと、現在のLXD 4.xよりも古いものの、書籍の中で言及している基本的な利用方法に大きな違いはありません。
LXDそのものはCLI経由で操作するインターフェースとして作られています。ただしlxcコマンドとlxdデーモンの間の通信はREST APIとして外部にも公開されていますし、Pythonを含む各種言語向けのバインディングも用意されています。よってその気になれば「LXDをサポートするツール」を作ることは簡単です。
最近だとコマンド操作よりはウェブブラウザーで管理できるほうが嬉しいことも多いでしょう。実際、直接の競合であるVMWare ESXiにはvSphere Web Clientが存在しますし、OpenStackやKubernetesにもウェブベースのダッシュボードが用意されています。virt-managerやVirtualBoxには公式のWeb UIはありませんが、それなりに強力なGUI管理ツールが存在します。これらに比べるとLXDはGUIで管理できないことがネックでした。
LXDの公式的にはOpenStackやOpenNebulaにLXDサポートプラグインを導入し、それをもって管理することを推奨している節があります[2] 。第484回の「UbuntuとOpenNebulaでKVMとLXDのインスタンスを起ち上げてみよう 」などはまさにLXDの管理ツールとしてOpenNebulaを使った例ですね。しかしながらLXDを操作したいだけなのに、別の管理システムを入れるのには若干の抵抗がありました。
そんな意見が多いからか、実はサードパーティのLXD管理システムがいくつか存在します。
LXDUI
AdaptiveScale が開発しているPythonベースのWeb UIです。2018年ぐらいに1.0が登場してから品質・更新頻度も高く、LXD向けWeb UIの本命的位置づけではあったのですが、ここ数ヶ月開発が止まっているようにも見えます。
LXDManager
VueとJavaScriptで作られたシンプルなWeb UIです。ユーザー・グループ管理が充実しているのが特徴となります。ただ、こちらについてもここ数ヶ月開発が止まっているようです。デモサイトの証明書の期限が切れているのもご愛嬌。
LXD Mosaic
PHPベースのWeb UIです。おそらく今もっとも開発が活発なツールでしょう。LXDとは管理用API経由で通信する仕組みになっているので、LXDが動いているホストとネットワーク的に透過であれば、外部にインストールすることも可能です。仮想マシンにも対応しています。
今回は今注目の「LXD Mosaic」を紹介します。LXD Mosaicはなんといっても、ソフトウェアそのものをLXDコンテナの中に閉じ込めることを公式にサポートしていることから、導入がとても楽なのです。
LXD Mosaicのインストール
LXD Mosaicのインストール自体はとても簡単です。LXD Mosaic用のインスタンスを立ち上げて、インストールするクリプトを実行する、これだけです[3] 。
あらかじめ、LXDのREST APIを外部から実行できるように設定しておきます。
$ lxc config set core.https_address [::]
$ lxc config set core.trust_password (パスワード)
上記では「[::]
」のように未指定アドレスを設定しているため、すべてのネットワークインターフェースに対してbind()
することになります。たとえばLXDコンテナの中からのみREST APIを呼び出せるよう限定したい場合は、lxc network info lxdbr0
で表示されるアドレスを指定すると良いでしょう。
あとは適当な名前のコンテナを作って、その中からインストールスクリプトを実行するだけです。
$ lxc launch ubuntu:20.04 lxdMosaic
$ lxc exec lxdMosaic bash
$ curl https://raw.githubusercontent.com/turtle0x1/LxdMosaic/master/examples/install_with_clone.sh >> installLxdMosaic.sh
$ chmod +x installLxdMosaic.sh
$ ./installLxdMosaic.sh
インストールスクリプト の中ではコンテナの中の管理者権限でさまざまなパッケージをインストールしたり、システムの設定を変更しているため、実行の前に一度中身は確認しておきましょう。基本的にはApache、PHP、MySQL、NodeJSあたりをインストールし、npmでNodeJS関連のパッケージを、ComposerでPHP関連のパッケージをインストールしているようです。
インストールに成功すると次のようなログが表示されます。
Installation successfull
You now need to point your browser at https://10.93.9.71 and
accept the self signed certificate
ServerName for LxdManager can be changed in /etc/apache2/sites-available/lxd_manager.conf,
followed by an apache restart (systemctl restart apache2)
上記の「https://10.93.9.71
」はコンテナのIPアドレスです。ウェブブラウザーがLXDと同じホストで動いているのであれば、このままアクセス可能ですが、外部のサーバーにLXDがインストールされている場合は、何らかの方法でlxdMosaicコンテナのアドレスにアクセスできるようにしなくてはなりません。
一番手っ取り早いのはプロキシデバイスを設定 してしまうことです。たとえばホストの443ポートを、lxdMosaicの10443ポートに転送してしまいましょう。
$ lxc config device add lxdMosaic port443 proxy \
listen=tcp:0.0.0.0:10443 connect=tcp:127.0.0.1:443
これで「https://(LXDが動いているホストのIPアドレス):10443
」でLXD Mosaicにアクセスできるようになるはずです[4] 。
[4] プロキシデバイスはLXDのデーモン自体がforkproxy
を起動し、指定したアドレスでlistenし、指定したコンテナにデータを転送します。それに対してLXD 3.3 からサポートされるようになった、「 nat=true
」オプションを付けると、NATの設定を行いforkproxy
を経由せずに転送するようになるので、より効率的にアクセスできます。ただしNATオプションを有効化するためには、そのコンテナのIPアドレスを固定化しておく必要があります。
LXD Mosaicにアクセスしてみる
まずは指定されたアドレス、もしくはプロキシデバイス設定後のアドレスにアクセスしてください。証明書エラーが表示されますが、後ほど対応することにして、現時点では無視します。
図1 「 admin」「 test123」でログイン
設定されたアカウント名は「admin」 、パスワードは「test123」です。これも後ほど変更します。
図2 LXDのREST APIエントリーポイントの設定
LXDのREST APIのエントリーポイントを設定します。IPアドレスはLXDサービスが動いているマシンのアドレスを設定してください。今回のようにLXDコンテナの中でLXD Mosaicを動かしている場合は、ホストのlxdbr0のアドレスを指定しておけば良いでしょう。このアドレスは、たとえばlxdMosaicインスタンス上でip route list default
コマンドを実行すると確認できます。
パスワードは最初に「lxc config set core.trust_password
」で設定したパスワードです。エイリアスにはサーバー名を付けます。指定しなければアドレスが表示されます。エイリアスはあとから変更可能です。
図3 Web UIのメイン画面
メイン画面にはホストの情報が表示されます。LXDサーバーは複数登録可能で、左のサイドバーにリストアップされています。LXDサーバー名をクリックして、サーバーの情報を表示してみましょう。
図4 LXDサーバーの情報
LXDサーバーの情報には起動中のLXDインスタンスやリソースの利用状況が表示されます。またコンテナの起動・停止などの操作が可能です。
図5 矢印アイコン(「 Cloud config」 )が表示されている部分をクリックすると、cloud-configを表示・編集できる
図6 画像アイコン(「 Images」 )が表示されている部分をクリックすると、利用可能なベースイメージのリストが表示される
図7 プロフィールアイコン(「 Profiles」 )が表示されている部分をクリックすると、プロフィールのリストを表示・編集できる
実際にインスタンスを作成してみましょう。画面右上の「+Container」アイコンをクリックします。仮想マシンの場合なら「+VM」です。
図8 コンテナの作成画面
入力する内容は普通にコンテナを作るときと同じです。フィールドは補完も可能なので、適当に入力してタブを押すと良いでしょう。インスタンスタイプ はいろいろな書式方法がありますが、コメントの中にリソースが表示されているので悩むことはないでしょう。指定しなくてもかまいません。
図9 コンテナ作成後の状態
コンテナは停止状態で作成されます。つまり「lxc init
」だけ行った状態です。起動するには、インスタンス一覧の画面からコンテナを選択し、右上のプルダウンメニューから「Start」を選択してください。
これで最低限の使い方は把握できました。
パスワードを変更する
LXD Mosaicの初期パスワードは「test123」ととても弱い値になっています。よって本格的に使い始める前に、まずはこのパスワードを変更しておきましょう。
画面上にあるスパナのアイコン(「 Settings」 )をクリックすると「Users」でユーザーの管理を行えます。
図10 ユーザー管理の画面
「Reset Password」をクリックするとパスワードを再設定できますし、右上の「+」で新たな管理アカウントを作成可能です。
ちなみに既存のパスワードを表示する仕組みはありません。パスワードを忘れた場合は、再設定のみが可能です。
なお全員がパスワードを忘れた結果、誰もログインできなくなった場合は、公式のドキュメントにあるデータベースを直接変更する方法 が参考になることでしょう。
証明書の設定
LXD Mosaicではインストール直後の状態だと、自己署名証明書が設定されています。これはapache2パッケージをインストールした際に一緒にインストールされたssl-certパッケージが作成した証明書です。
この証明書は次の2種類のプロセスから使われています。
apache2:LXD MosaicのUI部分を担うはApacheとPHPで作られています。
node:UIのフロントエンドは、WebSocket経由でバックエンドで動くNodeJSにLXDの状態を問い合わせています。
ApacheだけでなくNodeJSも証明書の設定が必要なことに注意してください。
まずはApacheの設定から。/etc/apache2/sites-enabled/lxd_manager.conf
で次のように参照されています。
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
正しい証明書をコンテナからアクセスできる場所に保存したら、上記の値を変更し、「 systemctl restart apahce2
」を実行してください。
$ lxc exec lxdMosaic systemctl restart apahce2
次にNodeJSのほうです。これは/var/www/LxdMosaic/.env
の中で次のように設定しています。
CERT_PATH=/etc/ssl/certs/ssl-cert-snakeoil.pem
CERT_PRIVATE_KEY=/etc/ssl/private/ssl-cert-snakeoil.key
こちらも単にファイルを変更し、NodeJSのプロセスを再起動します。
$ lxc exec lxdMosaic pm2 restart all
あとは正しい証明書を用意するだけです。方法はいくつかありますが、おそらく次のいずれかになるでしょう。
Let’s Encryptなどを利用してlxdMosaicインスタンスから証明書を自動生成する
Let’s Encryptなどを利用してホストから証明書を自動生成した上で、lxdMosaicからそのファイルを参照する
Let’s Encryptなどを利用してホストから証明書を自動生成し、ホスト上で動いているリバースプロキシ経由でlxdMosaicにアクセスする
手作業で証明書を作成し更新する
おそらく今回の例だと1か2が一番簡単です。1はlxdMosaicインスタンスの中にcertbotをインストールすれば良いのですが、HTTP-01チャレンジ を使うなら外部から作成する証明書のドメイン名経由でlxdMosaicに80番ポートでアクセスできる必要があります。これは前述のプロキシデバイスの追加で実現可能ではありますが、ホスト上で別のサービスに80番ポートを使っていると使用できません。
また、lxd_manager.conf
は80番ポートへのアクセスをすべてHTTPにリダイレクトしてしまっているので、1のケースでは「RewriteCond %{REQUEST_URI} !(^/.well-known/)
」のような「/.well-known/
」はHTTPSにリダイレクトしない設定を追加する必要があります。
それを考えると2のほうがまだ簡単かもしれません。ホストが80番ポートを使っているなら、おそらくすでに証明書を取得している可能性が高いでしょう。そうすると、その証明書をコンテナの中からも使えると手間が少なくなります。ホストのファイルをそのままコンテナの中に見せるには、証明書のあるディレクトリをbind mountする方法が一番簡単です。詳細は第479回の「LXDコンテナとホストの間でファイルを共有する方法 」にある「ホストのディレクトリーツリーをbind mountする」を参照してください。
ひとつ注意しなければならないのは、Let’s Encryptのようなサービスを利用して証明書を自動更新する場合、Apacheなどのウェブサーバーも更新時に再起動する必要があります。2の方法だと「更新された」タイミングが通知されるわけではないので、systemdのタイマーユニット などを使って30日ごとに再起動するようなタイマーを動かしておくと良いでしょう。
3はホスト上にリバースプロキシとなるサーバーをインストールしておいて、ホストとコンテナ間はHTTP通信にしてしまうという方法です。大抵のサービスはこの方法が一番簡単かつ確実です。ただしLXD Mosaicの場合、lxd_manager.conf
の中身がWebSocketも含めてHTTPS通信することを期待しているため、「 きちんと動く」ようにするためにはlxd_manager.conf
の中身をそれなりに変更する必要があります。将来的なアップグレードも考えると、少し手間が増えてしまうかもしれません。具体的な設定例はたとえば第610回の「Nextcloud Talkでリモートミーティング 」などを参照してください。
4については、たとえば組織内の認証局を利用したり、自動化できないサービスの証明書を作成・利用する場合の選択肢となります。とは言え完全に手動でやるのはあまりおすすめしません。Ansibleなどの構成管理ツールとセットで設定することになるでしょう。ちなみに証明書の作り方などは、第387回のUbuntuでSSLを利用したサービスを構築する の手順が参考になります。
いずれにせよ、証明書の作成ポリシーに合わせて設定は多岐に渡ります。ここで説明していないもっと良い方法もあるかもしれません。そのあたりは各自の環境に合わせてベストな方法を模索してください。