DockerでXWindowを使う

はじめに

UbuntuでDockerで建てたコンテナからXWindowを飛ばしてみたくなったのでメモ.
SSHは使わずにTCPでXWindowを飛ばします.

環境

今回は同一のマシン上で行います.

1$ cat /etc/lsb-release
2DISTRIB_ID=Ubuntu
3DISTRIB_RELEASE=16.04
4DISTRIB_CODENAME=xenial
5DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"
6$ docker -v
7Docker version 17.03.1-ce, build c6d412e
8$ docker-compose -v
9docker-compose version 1.14.0-rc1, build c18a7ad

ホスト側

設定の変更

Ubuntuはlightdmが上がってる想定で書いてますが違う場合はそれぞれの環境に合わせて下さい.
デフォルトではTCPでListenするようになってないので設定を加えます.
ファイルがない場合は作成し,ある場合は追記します.

1$ sudo vi /etc/lightdm/lightdm.conf
2[SeatDefaults]
3xserver-allow-tcp=true

システムを再起動して変更を適用します.
正しく設定出来ている場合は6000番のポートが開放されているはずです.

1$ netstat -anp | grep 6000
2tcp        0      0 0.0.0.0:6000            0.0.0.0:*               LISTEN      -               
3tcp6       0      0 :::6000                 :::*                    LISTEN      -

最後にこのXWindowサーバーにアクセス可能なクライアントの許可を出します.
とりあえず動作確認に無制限にしますが適宜制限を設けた方が良いです.

1$ xhost +

クライアント側

ディレクトリ構成

適当に配置します.

1$ tree xwindow-sample
2xwindow-sample/
3├── Dockerfile
4└── docker-compose.yml

イメージを作る

XWindowを飛ばすイメージを作ります.
環境変数設定するだけなのでシンプルです.
今回はxeyesを動かしてみます.

1$ vi Dockerfile
2FROM ubuntu:16.04
3
4RUN apt-get update -y \
5  && apt-get install -y x11-apps
6
7CMD ["xeyes"]

起動する

さっきのDockerfileを元にコンテナを起動したらウィンドウが飛んでくるはずです.
DISPLAYにホストIPを指定しておきます.

 1$ vi docker-compose.yml
 2version: "3"
 3
 4services:
 5  xeyes:
 6    build: .
 7    container_name: xeyes
 8    environment:
 9      DISPLAY: 192.168.1.xxx:0.0
10$ docker-compose up -d --build