dockerでGUIのアプリを使用する(chromium)

なにができるか

dockerでGUIのアプリがホストOSのディスプレイ上で動く

環境構築

前準備

  • dockerでGUIアプリのイメージを作成しておく。
  • xhostを導入し、xhost +でXの画面転送を受け付けられるようにしておく。

普通に立ち上げてみる

1
$ docker run --rm chromium_image /usr/bin/chromium
Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Operation not permitted

蛇足ですが、–rmオプションは使い終わった時にこのコンテナを消すというオプションです。

エラー文をみてみましょう。dockerのコンテナに権限が割り当てられていないために、こういったエラーが生じます。

今回はコンテナ上のchromiumを動かすので、chromiumに –no-sandboxを付与することで、このエラーを回避することが出来ます。また、docker run時に –privilegedオプションを付与することでも回避することができます。chromiumの–no-sandboxはプロセスを隔離して実行しないというオプションで安全性が下がります。また、dockerの–privilegedオプションは、dockerのコンテナに全権を付与します。こちらも安全性が下がります。今回は後者で行います。

1
$ docker run --rm --privileged chromium_image /usr/bin/chromium
[1:1:1130/061322:ERROR:browser_main_loop.cc(209)] Gtk: cannot open display: :0

引き続きエラーが出てきますが、このエラーはディスプレイが見つからないときに生じます。dockerのコンテナにディスプレイを認識させてあげれば良いわけです。
なので、実機のX11のソケットを-vオプションでコンテナにマウントします。

1
$ docker run --rm --privileged -v /tmp/.X11-unix:/tmp/.X11-unix chromium_image /usr/bin/chromium

これでchromiumが起動しました。

設定ファイルなどの永続化

コンテナは使い終わったら削除されますので、設定やダウンロードデータや履歴などが次回立ち上げ時に消えてしまいます。
そのため、ホストOS側の任意のディレクトリをdockerで起動するユーザー名のディレクトリにマウントして使うのが実用的かと思われます。その際の例がこちら。

1
$ docker run --rm --privileged -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/host/volume/:/home/container/ chromium_image /usr/bin/chromium

-vオプションはコロンを挟んだ前後で実機のディレクトリとコンテナ側のマウントされる場所を指定できます。

共有メモリ不足による強制終了の回避

また、dockerは共有メモリが64MBしか無い(2014/11現在 仕様変更される可能性あり)ため、chromiumでは共有メモリ不足を起因として頻繁に落ちてしまいます。そのため、対策として、これまた-vオプションで、実機からリソースを割り当てます。

1
$ docker run --rm --privileged -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/host/volume/:/home/container/ -v /tmp/shm/:/dev/shm/ chromium_image /usr/bin/chromium

私の場合、/etc/fstab/にてtmpfsでメモリを/tmp/shmにマウントし、それをコンテナの共有メモリに割り当ててます。しかし、実機の/dev/shmを直接割り当てても特に問題はありませんでした。

音が出ない

音は 環境変数PULSE_SERVERが必要。
実機のIPアドレスを取得し、-eオプションで PULSE_SERVER=192.168.0.100(例)のように与えれば音が出るはずです。

1
$ docker run --rm --privileged -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/host/volume/:/home/container/ -v /tmp/shm/:/dev/shm/ -e PULSE_SERVER=192.168.0.100 chromium_image /usr/bin/chromium

実機のIPアドレスをDHCPで取得している場合は毎度変更が必要です。

その他の方法

ここでは掲載できませんが、dockerでGUIアプリを起動する方法はほかにもあります。

VNCビューワーを経由

dockerのオフィシャルでも紹介されています。

X11 portforwardingをつかう

コンテナ側がsshdを立ち上げて待ち受け状態から、任意のマシンからsshで接続して画面を取得する方式です。

参考にしたところ

Tips for starting any X11 apps (e.g. eclipse) in a docker container from a linux hos for starting any X11 apps (e.g. eclipse) in a docker container from a linux host
http://olivier.barais.fr/blog/posts/2014.08.26/Eclipse_in_docker_container.html

コメント