コンテナでGUIを使って作業したいことってありますよね。リモートでコンテナ内のデスクトップ環境に接続する時に「ブラウザ」でアクセスできると便利だと思いませんか?
前回のLXDの記事↓↓↓では基本的にSSHでのCLI(コマンドライン)接続だったので、今回はGUIのアクセス環境を作成します。
コンテナ環境というとkubernetesやdockerばかりが取り上げられますが、開発環境という意味では向いていません。 LXD/LXCは「システムコンテナ」であり、docker等のような「アプリケーションコンテナ」とは異なります。 :LXDコンテナによる 開発環境セットアップ
今回作成する環境は下図のイメージになります。
LXDコンテナ内にデスクトップ環境とvnc環境を作成して、サーバーの物理ポートへのマッピングを行い、外部PCのブラウザからアクセスします。
この時、外部PCでvncクライアントを使わなくてもよいように、novncというアプリケーションを使ってブラウザ上での表示に対応させます。
- インストール前の環境
- GUI用LXDコンテナの作成
- LXDコンテナへのSSHアクセス設定
- LXDコンテナへのGUI関連アプリのインストール
- Tightvnc(vncserver)の設定
- snap版novncの設定
- サーバーのポートとlxdコンテナのポートの接続
- ブラウザからアクセスしてみよう!
- まとめ
インストール前の環境
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
画面がでたら「接続」ボタンをクリックしてvncserverコンフィグレーション時に作成したパスワードを入れましょう。
まとめ
LXDコンテナ内のGUI環境にアクセスできる(しかもブラウザで!)ようになったので、例えばゲームのエミュレーターとか入れるとブラウザ上でゲームができたりしますね。
夢が広がります。
enjoy!