リモートサーバーのDockerでGUIアプリを動かす

リモートサーバー上にあるDockerのGUIアプリを動かしてみた。いろいろと苦労したが、最終的に成功した方法を示す。というかログメッセージが少なすぎる。。Can't open displayってもう少し詳しく書いてくれ。。

構成

ホストPCからリモートサーバーにSSHでアクセスして操作する。

  • ホストPC(自分が操作するPC)
  • リモートサーバー(Docker(GUI)のあるPC)

操作手順

ホストPCからXフォワーディングオプションをつけてアクセスする。ラージXなので注意。

$ ssh -X ubuntu@192.168.11.100

下記のようにオプションをつけてDockerを起動。今回は手元にあったPythonイメージを使用。

$ docker run -it -e DISPLAY=$DISPLAY --net host -v $HOME/.Xauthority:/root/.Xauthority:rw --name x11_test python:3.8-slim-buster bash
  • -it
    • コンテナ入出力を現在のターミナル標準入出力にマウントする。
  • -e DISPLAY=$DISPLAY
    • DISPLAY変数を引き継ぐ。
  • -v $HOME/.Xauthority:/root/.Xauthority:rw
    • .Xauthorityをマウントする。これはXServerの認証の際に使用される。
  • --net host
    • ホスト側のネットワークIFを使用する。
  • --name x11_test
    • コンテナの名前。なんでもいい。

重要なのは--net host。リモートサーバーでDockerを動かすにはこれが必要。

xorgをインストール。 当然、Dockerコンテナ内にXサーバーがないと表示ができないのでインストール。自分はここでハマった。

$ apt update
$ apt install xorg

テスト。 目が表示されればOK。

$ xeyes

防備録

下記のエラーが出たら、Xauthorityが正しく設定されているか、RW権限があるかを確認。

X11 connection rejected because of wrong authentication.

X11フォワーディングが有効になっているか確認する。

vim /etc/ssh/sshd_config
X11Forwarding yes

Docker 起動時に下記のオプションをつければソケットがバインドできるが、別途認証などが必要なのでやめたほうがいい。

-v /tmp/.X11-unix/:/tmp/.X11-unix

下記コマンドをホスト側で実行すると、認証なしで画面が表示できる。何故か映らない場合に試すといい。

$ xhost +
access control disabled, clients can connect from any host