Xvfbを使って、LinuxのGUI環境(デスクトップ)をコンテナ内に作成し、Webブラウザでアクセス

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
起動直後は真っ黒です。マウスを右クリックをすると以下のキャプチャ画像のようにopenboxのコンテキストメニューが表示されます。
Terminal emulatorを選択すると、次のようにxtermが起動します。

プログラミング言語の実行速度比較(2023/4)

お知らせ

この記事へのフィードバックを受けて、以下に更新版「プログラミング言語の実行速度比較(2023/5)」を公開しています。コメントをお寄せくださった皆様ありがとうございます。

はじめに

2019年に「言語間の速度比較」という記事を投稿した。 それから4年近く経過したので、それぞれの言語の最新版で再度検証する。また、サポートが終了したPython2の代わりに近年人気が高いRustを追加する。さらにC言語で算出した素数の格納をrealloc()で確保した領域にする評価も追加した。評価には、シングルスレッドで順次既知の素数で割ることで1億までの素数を求めるプログラムを使用(ソースはここ
言語 時間 (sec) 最大使用物理メモリ(MiB) 算出素数格納コンテナ 補足情報 感想
C 12.6 25.1 固定長配列 gcc 12.2.0
最適化-O3
-
C 12.6 23.9 realloc() gcc 12.2.0
最適化-O3
固定長配列よりメモリ使用量が少ないが、処理時間は同じ。ある程度、数が大きくなると新しい素数の追加が少なくなるからか。
C++ 66.5 36.5 std::vector gcc 12.2.0
最適化なし(-O0でビルド)
-
C++ 12.7 35.6 std::vector gcc 12.2.0
最適化(-O3でビルド)
最適化するとやはりかなり速くなる。メモリ使用量もC言語とRust以外の言語と比べて圧倒的に少ない
Rust 14.2 23.9 Vec 1.63.0 C++に匹敵する速さ。メモリ消費はむしろ少ない。それでいて安全性が高いとくれば次世代の主役の可能性あり
JAVA 19.5 228.9 ArrayList OpenJDK 17.0.6 C/C++の約1.5倍の実行時間。これまでの経験ともだいたい整合する
Kotlin 19.6 256.2 List Kotlin 1.8.20 Javaと同等。コードの書きやすさを考えると悪くない選択肢
Scala 24.9 1078.4 mutable.ArrayBuffer Scala 3.2.2 速度面ではJavaと比較してやや劣る程度だが、メモリ使用量がJavaの約4倍、C++の30倍近い。
Golang 48.9 168.1 slice go1.19.6 予想より速くない。メモリ使用量もJavaの半分程度で、この結果だけだと使いみちが中途半端となるかも。
Node.js 17.3 196.1 Array v18.13.0 JavaやScalaを凌駕。メモリ使用量もそれらよりやや少ない。
PHP 109.5 149.4 array PHP 8.2.2 特に良いところもないような。無理に使うような言語ではないと思う。
Python3 289.4 231.5 list 3.11.2 圧倒的に遅い。メモリ使用量は他のスクリプトと同程度。直接アルゴリズムを組んでごりごりやる言語ではない。今回の評価観点は一番不向きな用途だろう。

評価環境

  • Intel Core i7 8559U (2.7GHz)
  • DDR4 2400MHz 32GiB
  • Debian 12 (sid)