Webブラウザで試験をしたり、GUIによるインタラクティブな処理をするなど、Linuxデスクトップを使いたい場合があります。一般的にLinuxデスクトップ(やベースシステムであるX11)はそのPCに装着されているビデオカードを使用します。そのため、コンテナのようにホストOSのビデオカードにアクセスできない環境ではGUIが基本的に使えません
この記事では、Linuxマシンのコンテナ内にXvfbという仮想的なグラフィックカードドライバを使ってLinuxデスクトップを作成する方法を紹介します。以下では、コンテナ内での設定・実行方法を前提に説明しますが、もちろんホストOS上でも「ソフトウェアのインストール・設定」項目以降の操作を行うことで同様に実行することが可能です。
全体構成
下図のような構成を構築します。Xvfbは、仮想ビデオドライバを使用するX11サーバです。x11vncは、Xvfbの画面をVNCプロトコルに変換して、外部からVNCでアクセスできるようにするVNCサーバです。外部にVNCクライアントがあれば、この2つのソフトウェアでアクセスできます。
下図ではさらに、WebSockifyというソフトウェアを使用しています。これは、VNCをHTTPに変換するサーバです。つまり、VNCクライアントの変わりにWebブラウザでVNCサーバにアクセスできるようになります。
コンテナの作成
ここではコンテナイメージとして、Debian 11 (bullseye)を使用します。 また、LXCと使う場合と、Dockerを使う場合を紹介します。 LXCは、一度作成した環境を引き続き利用する場合に便利です。 Dockerはその環境を使い捨てで使用する場合に便利です。 コンテナの作成は、両者で若干異なりますが、ソフトのインストール方法や設定は同じです。
以下のコマンドをリモートマシンのホスト上で実行します。
LXCコンテナの場合
sudo lxc-create -n mycontainer -t debian -- -r bullseye
作成したLXCコンテナのシェル取得方法
sudo lxc-attach -n mycontainer bash
Dockerコンテナの場合
docker run --net host -it debian:11 bash上記では、ポートフォワードなどの設定を省略するために`--net host`を指定し、ホストOSのネットワークをそのままコンテナで使用します。セキュリティなどの理由で、ブリッジなどを使いたい場合、適宜変更ください。
ソフトウェアのインストール・設定
続いて、コンテナ内で以下のコマンドを実行します。コンテナ内にユーザを作成
ユーザを作成するのが面倒な場合、rootで続行してもかまいません。中長期的に使用する場合、ユーザを作成するほうが安全で便利です。パッケージのインストール
apt update && apt install xvfb openbox x11vnc websockify novnc
Xvfbと関連サーバの実行
以下のコマンドをコンテナ内で実行します。青字の部分は他と重複しないように適宜変更ください。以下のコマンドはフォアグランドで実行されるので、続くコマンドは別の端末で実行します。Xvfb
xvfb-run -f ~/.Xauthority -n 10 -s "-screen 0 800x600x24" openbox上記の例では、openboxというWindow Managerを起動しています。他に使用したいWindows Managerやデスクトップ環境のプログラムがある場合、それを指定します。上記の紫色のパラメータがルートウィンドウの解像度と色深度です。これも必要に応じて変更ください。
直接Xvfbを実行する場合
Xvfb :10 -screen 0 800x600x24
x11vnc
x11vnc -display :10 -rfbport 5910 -forever -localhost上記の`-localhost`オプションは、localhostのみからVNC接続を許可するオプションです。WebSockifyを使わず、VNCクライアントでx11vncに直接アクセスする場合は、このオプションを削除ください。
パスワード
パスワードをつける場合、vncpasswdコマンドでパスワードを作成します。それを-rfbauth ~/.vnc/passwdのように上記のコマンドに追加します。WebSockify
websockify --web=/usr/share/novnc 8010 localhost:5910
Webブラウザから接続
以下のURLにWebブラウザでアクセスするとXの画面が表示されます。- http://[コンテナのIP]:8010/vnc.html
0 件のコメント:
コメントを投稿