gggggraziegrazie

graizegrazieさんのやったこと、学んだことを記録する雑記帳です

Dockerコンテナで起動したGUIをlocalで表示する方法

xhostコマンドを使うことで可能になります。xhostコマンドは、Xサーバへのアクセスの許可/不許可を設定するためのコマンドです。設定をするためには、Xサーバのクライアント・サーバそれぞれで設定が必要になります。

サーバ側

xhost +hoge.co.jp

のように記述すれば、hoge.co.jpからのアクセスを許可します。

xhost +

のように、+の後に何も書かないと、全てのアクセスを許可することになります。そのため、第三者がアクセスしてきても、そのアクセスを許可してしまっている状態なので注意が必要です。xauthなどの別のコマンドを使うことで、それを回避できます。

逆に追加したアクセスを削除するには、

xhost -hoge.co.jp

のように、+の代わりに-をつければOKです。

現時点で誰にアクセス許可をしているかを調べるには、

xhost

とだけ打てば表示されます。

クライアント側

環境変数DISPLAY にXサーバーのホスト名、もしくはIPアドレスを指定する必要があります。指定時の書式は、

# DISPLAY=Xサーバー名:ディスプレイ番号.スクリーン番号

です。デフォルトでは何も指定されていないので、hoge.co.jpを追加してみます。

$ printenv DISPLAY
:0.0
$ export $DISPLAY=hoge.co.jp:0.0
$ printenv DISPLAY
hoge.co.jp:0.0

のようになるはずです。上記を.bashrcなどに追加しておけば、次回以降も自動的にXサーバへのアクセス設定が追加された状態になります。

Linux上のプロセスは、UNIXドメインソケットを使って通信を行っています。Xサーバも、

/tmp/.X11-unix/

にあるソケットファイルを使用して通信を行っている。そのため、Dockerコンテナがこのソケットファイルを使用することで、local上にGUIを表示することが可能となる。そのため、コンテナを生成する時に-vオプションを使い、上記localのソケットファイル格納場所をDockerコンテナ上の同じ場所にマウントしてあげる必要がある。

Dockerが動いてるのはlocal上であり、特に指定しない限りrootユーザでコンテナが生成されます。そのため、

xhost +local:root

とすると、Dockerコンテナを登録できます。特に表示先のディスプレイにこだわりがなければ、コンテナ生成時に環境変数を指定するオプション

-e DISPLAY=$DISPLAY

を付ければOKです。