リモートサーバー上にあるDockerのGUIアプリを動かしてみた。いろいろと苦労したが、最終的に成功した方法を示す。というかログメッセージが少なすぎる。。Can't open displayってもう少し詳しく書いてくれ。。
構成
ホストPCからリモートサーバーにSSHでアクセスして操作する。
操作手順
ホスト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.
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