リモート/コンテナ上のX11アプリケーションをローカルで動かす方法まとめ

# やったこと
下記3つのパターンでX11アプリケーションの起動をお試ししたので、その際の手順を備忘録として残しておきます。

- ローカルのWindowsに立ち上げたDockerコンテナ上でxeyesを実行する
- リモートのLinux上でxeyesを実行する 
- リモートのLinuxに立ち上げたDockerコンテナ上でxeyesを実行する

# Windows側の設定
Windows側のX ServerとしてVcXsrvを使用するので、[こちら](https://sourceforge.net/projects/vcxsrv/)からVcXsrvをダウンロードしてインストールしておきます。

VcXsrcのインストールが完了したら、「スタート」から「XLaunch」を選択して起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744609/1d52b978-4628-799c-4643-7f401c835c0f.png)

「Multiple windows」を選択して「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744609/8e02b53e-36b3-7d6c-79d1-d8cea0c2978b.png)

「Start no client」を選択して「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744609/25901083-eca3-15ef-836a-d6d63b3851a2.png)

デフォルトで入れられているチェックはそのままで、「Disable access control」にチェックを入れ(※1)、「Additional parameters for VcXsrv」に```-nowgl```を追加(※2)して「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744609/c721d51a-4b8d-bb9e-3ac1-f205bcc4fb7c.png)

:::note info
※1
当初「Disable access control」にはチェックを入れてませんでしたが、リモート上でX11アプリケーションを起動した際に下記のようなエラーが発生したため、今回チェックを入れることで対処しました。
```
Authorization required, but no authorization protocol specified
Error: Can't open display: XXX.XXX.XXX.XXX.:0.0
```
:::

:::note info
※2
xeyesをお試しするだけであれば不要ですが、その他のアプリケーションの起動の際に必要となる場合があったため、一応設定しています。
:::

「完了」をクリックすることで、設定した内容でX Serverが起動します。
「Save Configuration」をクリックすれば、今回設定した内容を設定ファイルとして出力することが出来ます。
次回起動したい場合は、ここで出力した設定ファイルをダブルクリックすることで、設定した内容でX Serverを起動することが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744609/94b80166-04d4-d776-c03d-164d8ededdc5.png)

X Serverの起動に成功した場合、画面右下にVcXsrvのアイコンが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744609/0df81bf9-c88f-87b3-c4f1-da96231e7bff.png)

# ローカルのWindowsに立ち上げたDockerコンテナ上でxeyesを実行する
まずはxeyesをインストールしたDockerイメージを作成します。
下記内容でDockerfileを作成し、ビルドしてDockerイメージを作成してください。
```Dockerfile:Dockerfile
FROM alpine

RUN apk --no-cache add bash xeyes

CMD ["/bin/bash"]
```

ビルドしたDockerイメージを起動します。
この時、DISPLAY環境変数にローカルのWindowsマシンのIPアドレスを設定します。

```bash:コンテナ起動
docker run --rm -it --name=xeyes --hostname=xeyes -e DISPLAY=<ローカルWindowsマシンのIPアドレス>:0.0 <イメージ名>
```

コンテナを起動し、コンテナ内で```xeyes```コマンドを実行すると、ローカルのWindowsマシン上でxeyesの画面が開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744609/bfa5669f-6357-cb7d-65a4-0befbaf91510.png)

# リモートのLinux上でxeyesを実行する
まずは下記コマンドで、リモートのLinux上でX11Forwardingが有効化されていることを確認します。
```bash
cat /etc/ssh/sshd_config | grep -i X11Forwarding
```

「X11Forwarding yes」となっていれば有効化されています。
設定が無い、もしくは「X11Forwarding no」となっている場合は、```/etc/ssh/sshd_config```に「X11Forwarding yes」の設定を追加した後、sshサービスを再起動してください。

次に、```DISPLAY```環境変数にローカルのWindowsマシンのIPアドレスで設定します。
```bash
export DISPLAY=<ローカルWindowsマシンのIPアドレス>:0.0
```

先ほどと同様に```xeyes```コマンドを実行すると、ローカルのWindowsマシン上でxeyesの画面が開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744609/68d2d766-fb12-5609-14ac-83b6d00b3fd1.png)

# リモートのLinuxに立ち上げたDockerコンテナ上でxeyesを実行する
[ローカルのWindowsに立ち上げたDockerコンテナ上でxeyesを実行する](#ローカルのwindowsに立ち上げたdockerコンテナ上でxeyesを実行する) で作成したDockerfileを流用して、リモートのLinux上で同様にDockerイメージを作成します。

Dockerイメージを作成したら、下記コマンドでDockerコンテナを起動してください。
```--net host```オプションを追加して、ホストとなるリモートLinuxと同一ネットワークを使用するように設定するのがポイントです。
```bash
docker run --rm -it --name xeyes --hostname xeyes \
  --net host \
  -e DISPLAY=<ローカルWindowsマシンのIPアドレス>:0.0 \
  <イメージ名>
```

後はいつものように```xeyes```コマンドを実行するれば、ローカルのWindowsマシン上でxeyesの画面が開きます。(※3)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744609/4917636e-7dc0-8815-e692-e18e8e639df2.png)

:::note info
※3
最初起動した際に、下記のようなエラーが発生しました。
```
Authorization required, but no authorization protocol specified
```

このエラーが発生した場合は、Linux上で下記コマンドを実行してみてください。
```
xhost + local:
```
:::

# 参考記事
- [Windows X Server: リモートLinux GUIアプリケーションのためのX11転送の設定](https://qiita.com/S_Hassan/items/0604ed5c4cb68fa3eccc)
- [【LinuxアプリをWindowsで動かそう】WSLでLinuxのGUIアプリを起動する話](https://veresk.hatenablog.com/entry/2020/02/26/190000)
- [DockerコンテナからGUIを起動する](https://zenn.dev/senken/scraps/83abe06c734784)