X11 をコンテナー内からリモートホストで GUI を表示する手順

このページには X11 の GUI アプリケーションを Docker コンテナーで起動し、SSH で接続するリモートホストに表示する方法について書いてあります。

X Windows System #

Linux の GUI 環境は X Windows System ver.11 (X11) のプロトコルで動いており、サーバー・クライアントシステムとして動いています。 X クライアントが X サーバーに通信して、X サーバーはグラフィカルな出力をしたり、ユーザーの入力をクライアントに送信したりします。 通信はネットワーク越しに行うことができますのでリモートホストの X サーバーに出力したりすることもできます。

今回の場合は、Docker コンテナーが X クライアントであり、リモートクライアント側で起動している X サーバーに出力するということになります(ややこしいですが)。

例えばこんなイメージです。

設定方法 #

設定は至って簡単です。

とりあえず、X アプリケーションを動かすコンテナーの Dockerfile を作ります。

FROM ubuntu:16.04

RUN apt-get update \
 && apt-get install -yq x11-apps

CMD ["xeyes"]

docker-compose を使いますが、設定することはただ一つで、環境変数として DISPLAY にリモートクライアントの IP アドレスとディスプレイ番号を示す :0 を入力するだけです。

version: '2'
services:
  xapp:
    build: .
    environment:
      - DISPLAY=192.168.0.2:0

念のためですが、下記のコマンドでコンテナーが起動します。

docker-compose up

ただし、基本的にはリモートクライアント側の X サーバーが外部からの通信を許可する設定が必要になります。Linux の場合は xhost コマンドで設定します。Windows の場合には Windows Firewall で設定します。

参考記事 #

もう少し詳しく知りたいという方は下記の記事が参考になると思います。