Dream Driven Development。夢を形にしよう!

LXDコンテナでGUI novncでブラウザ経由で デスクトップ

LXDコンテナでGUI
novncでブラウザ経由で
デスクトップ


コンテナでGUIを使って作業したいことってありますよね。リモートでコンテナ内のデスクトップ環境に接続する時に「ブラウザ」でアクセスできると便利だと思いませんか?
前回のLXDの記事↓↓↓では基本的にSSHでのCLI(コマンドライン)接続だったので、今回はGUIのアクセス環境を作成します。

LXDコンテナによる
開発環境セットアップ-Dream Driven Development(夢駆動開発)
LXDコンテナによる 開発環境セットアップ-Dream Driven Development(夢駆動開発)
コンテナ環境というとkubernetesやdockerばかりが取り上げられますが、開発環境という意味では向いていません。 LXD/LXCは「システムコンテナ」であり、docker等のような「アプリケーションコンテナ」とは異なります。 :LXDコンテナによる 開発環境セットアップ

今回作成する環境は下図のイメージになります。
lxd-novnc diagram
LXDコンテナ内にデスクトップ環境とvnc環境を作成して、サーバーの物理ポートへのマッピングを行い、外部PCのブラウザからアクセスします。
この時、外部PCでvncクライアントを使わなくてもよいように、novncというアプリケーションを使ってブラウザ上での表示に対応させます。

インストール前の環境

LXDインストールとコンテナ作成の基本的な部分は、前回の記事に書かれているので参照してください。

GUI用LXDコンテナの作成

前回記事で作ったAnsibleスクリプトで作成するのが早いのですが、ここでは一つ一つ手作業で作成していきましょう。

$ sudo lxc launch ubuntu:20.04 hoge
$ lxc ls #確認
+--------+---------+--------------------+-----------------------------------------------+-----------+-----------+
|  NAME  |  STATE  |        IPV4        |                     IPV6                      |   TYPE    | SNAPSHOTS |
+--------+---------+--------------------+-----------------------------------------------+-----------+-----------+
| hoge   | RUNNING | 10.246.9.10 (eth0) | fd42:6aab:85bc:47ba:216:3eff:fe12:8f46 (eth0) | CONTAINER | 0         |
+--------+---------+--------------------+-----------------------------------------------+-----------+-----------+

LXDコンテナへのSSHアクセス設定

作成したコンテナに入って作業してssh接続できるようにします。
ホスト側でまだ鍵を作っていない人は先にssh-keygenで作成してください

host$ ssh-keygen -t ecdsa -b 521
host$ pass phrase #指定しない

公開鍵をlxcコンテナに送り込みます。

host$ sudo lxc file push ~/.ssh/id_ecdsa.pub hoge/home/ubuntu/.ssh/authorized_keys

LXDコンテナへのGUI関連アプリのインストール

sshでログインしてGUI関連のインストールを行っていきます。

$ ssh ubuntu@10.246.9.10
ubuntu@hoge$ sudo apt -y update
ubuntu@hoge$ sudo apt -y install xfce4 xfce4-goodies #desktop環境
ubuntu@hoge$ sudo apt -y install tightvncserver
ubuntu@hoge$ sudo apt -y install snapd
ubuntu@hoge$ sudo snap install novnc 

Tightvnc(vncserver)の設定

vnc実行(一度コンフィグを作成するため)

ubuntu@hoge$ vncserver
You will require a password to access your desktops.
Password:
Verify:
Would you like to enter a view-only password (y/n)? n
xauth:  file /home/ubuntu/.Xauthority does not exist

New 'X' desktop is hoge:1  #画面番号:1ならvncのポート番号は 5901 

Creating default startup script /home/ubuntu/.vnc/xstartup
Starting applications specified in /home/ubuntu/.vnc/xstartup
Log file is /home/ubuntu/.vnc/hoge:1.log

ここで設定したパスワードはブラウザからアクセスするときに必要になります。
一旦vncserver止めます。

ubuntu@hoge$ vncserver -kill :1

~/.vnc/xstartupを編集して以下のようにします。(デスクトップとしてxfce4を使う場合)

#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &

リソースファイル作っておきます。

ubuntu@hoge$ cd ~
ubuntu@hoge$ touch ~/.Xresources

vncserver再起動。

$ vncserver

ここで、ディスプレイ番号からポート番号を割り出しておきます。

New 'X' desktop is hoge:1  #画面番号:1ならvncのポート番号は 5901 

このように:1という番号の場合はvncポート番号は5901となります。

snap版novncの設定

novncを使うことによりブラウザからvncserverへのアクセスができるようになります。
novncをsnap servicesとして立ち上げる場合、以下のようにします。

sudo snap set novnc services.n6080.listen=6080 services.n6080.vnc=localhost:5901
sudo snap get novnc services
sudo snap get novnc services.n6080
止める場合
sudo snap set novnc services.n6080.listen='' services.n6080.vnc=''

この例では、vncserverのポートが5901 (ディスプレイ番号が:1)、ブラウザからアクセスするポート番号を6080に設定しています。

サーバーのポートとlxdコンテナのポートの接続

novnc向けポートフォワーディング設定は以下のように行います。(ホスト側で実行)

host$ lxc config device add hoge hoge6080 proxy listen=tcp:<host ip>:6080 connect=tcp:<container ip>:6080 bind=host

ブラウザからアクセスしてみよう!

ホストにアクセス可能なPCのブラウザからアクセスしてみましょう。

http://<host ip>:6080/vnc.html?host=<host ip>&port=6080

novncアクセス画面
画面がでたら「接続」ボタンをクリックしてvncserverコンフィグレーション時に作成したパスワードを入れましょう。
LXDコンテナGUIアクセス

まとめ

LXDコンテナ内のGUI環境にアクセスできる(しかもブラウザで!)ようになったので、例えばゲームのエミュレーターとか入れるとブラウザ上でゲームができたりしますね。
夢が広がります。
enjoy!

|

お気に入りサイト