2018/04/29

GUI application を docker で起動する

私は Host の環境を汚したくないので、開発環境の構築は Docker でなるべくやっています。
今のところDocker 固有の凶悪な問題に遭遇していないので、軽いVM みたいな形で使ってます。
centos:7 でコマンドを試した後、 ubuntu:16.04 でもそのコマンドを試す、とか。ぽんぽん立ち上げられるのが良い。
CUI の場合はガンガンコンテナを作るのですが、GUIはさてどうするんだろう、と疑問。
それで調べたりしたログがこの記事です。

結論としては、この記事は Docker の話では無く X11 の話です。
正確には「X11 に詳しいと、プロセスが走る場所がコンテナ内でも ssh 先でも、GUI を表示できる」という話。


環境

  • macOS Sierra: 10.12.6
  • Docker: 18.03.0-ce-mac60 (23751)
  • XQuartz: 2.7.11 (xorg-server 1.18.4)


GUI Application Container

GUI を利用する Container を調べていたら実行コマンド付きの firefox がありました
XQuartz を起動して、いろいろオプションを足せばOKみたいです。


XServer の起動

X11 の Server として XQuartz を使っていたっぽい。

まずは Server(GUI への remote access を許可) を起動するために
  • Preferences > Security > Allow connections from network clients
にチェックを入れる。
これで XQuartz を起動時に 6000 番とかで listen してくれる。
  • $ netstat -at
とかして :x11 とかがあればOK。
xauth とかで access control もできるっぽいんだけれど、まずは全てのアクセスを許可。
  • $ xhost +
これで X11 Server 側は準備OK。


XServer を指定してコンテナ起動

XServer の情報をオプションで run する時に渡せば firefox が起動しそうです。
元ページのコマンドは
  • $ docker run -d -e DISPLAY=$ip:0 -v /tmp/.X11-unix:/tmp/.X11-unix jess/firefox
ですが、今回は volume の mount はいらないので
  • $ docker run -d -e DISPLAY=$ip:0 jess/firefox
にしてみる。$ip には XServer の ip が入っていると仮定します。
実行すると X11 Server 側で firefox が起動します。やったね。
ちなみに 10.0.0.10:2.0 などのフォーマットはこういうことらしいです。



コンテナの中で DISPLAY を設定してみる

さて、docker run の時の -e オプションは単に環境変数を渡すだけみたいですね。
ということは後から変更できたりするかも。
一旦 centos:7 を起動して、後から DISPLAY を設定してみる。
  • $ docker run -it centos:7
    • # yum install -y epel-release
    • # yum install --enablerepo=epel xcalc
    • # export DISPLAY=10.0.0.30:0.0
    • # xcalc
xcalc は x11 を使う計算機です。
firefox の setup などは難儀なのでこれで代替。
まー、こいつも epel を入れるとか、ちょっとだけ面倒ですが割愛。

結論としては、run した後から DISPLAY を設定しても GUI は起動します。ふむふむ。


ssh 先での GUI Application

DISPLAY が設定できていれば GUI は起動する。
その前提として docker for mac <-> XQuartz 間の疎通が必要。
何故かといえば IP でディスプレイを指定しているからです。

なら、 docker on ssh server <-> XQuartz も可能?
ということで ssh した先でも DISPLAY を設定して xcalc 。
表示される計算機。
なるほど、別に docker だろうと、 ssh 先の linux だろうと、 DISPLAY にデータが送れるのなら GUI process は起動できるっぽい。

この場合、 GUI の描画は X11 経由で mac に、Application のプロセスは ssh した Server の中の docker が起動、なんて状態に。複雑。

ということで、 DISPLAY を適切に設定できれば GUI はぽこぽこ生やせる。


結論

DISPLAY を設定すれば GUI Application も docker で動きます。
というか DISPLAY を設定すれば ssh 先のサーバだろうと何だろうと GUI Application は動きます。


おまけ: xhost 

  • $ xhost +
は全てのIPからGUI access を許可するので危なすぎる。
  • $ xhost -
で access control を再び有効にできます。
本来なら 
  • $ xhost + 10.0.0.20
とかするらしいです。

Docker 触ってると思ったら X Window を触っている。
トレンドを追ってるのか、過去を追ってるのか分からなくなってきます。


参考

0 件のコメント:

コメントを投稿