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です。