やったこと
下記3つのパターンでX11アプリケーションの起動をお試ししたので、その際の手順を備忘録として残しておきます。
- ローカルのWindowsに立ち上げたDockerコンテナ上でxeyesを実行する
- リモートのLinux上でxeyesを実行する
- リモートのLinuxに立ち上げたDockerコンテナ上でxeyesを実行する
Windows側の設定
Windows側のX ServerとしてVcXsrvを使用するので、こちらからVcXsrvをダウンロードしてインストールしておきます。
VcXsrcのインストールが完了したら、「スタート」から「XLaunch」を選択して起動します。
「Multiple windows」を選択して「次へ」をクリックします。
「Start no client」を選択して「次へ」をクリックします。
デフォルトで入れられているチェックはそのままで、「Disable access control」にチェックを入れ(※1)、「Additional parameters for VcXsrv」に-nowgl
を追加(※2)して「次へ」をクリックします。
※1
当初「Disable access control」にはチェックを入れてませんでしたが、リモート上でX11アプリケーションを起動した際に下記のようなエラーが発生したため、今回チェックを入れることで対処しました。
Authorization required, but no authorization protocol specified
Error: Can't open display: XXX.XXX.XXX.XXX.:0.0
※2
xeyesをお試しするだけであれば不要ですが、その他のアプリケーションの起動の際に必要となる場合があったため、一応設定しています。
「完了」をクリックすることで、設定した内容でX Serverが起動します。
「Save Configuration」をクリックすれば、今回設定した内容を設定ファイルとして出力することが出来ます。
次回起動したい場合は、ここで出力した設定ファイルをダブルクリックすることで、設定した内容でX Serverを起動することが出来ます。
X Serverの起動に成功した場合、画面右下にVcXsrvのアイコンが表示されます。
ローカルのWindowsに立ち上げたDockerコンテナ上でxeyesを実行する
まずはxeyesをインストールしたDockerイメージを作成します。
下記内容でDockerfileを作成し、ビルドしてDockerイメージを作成してください。
FROM alpine
RUN apk --no-cache add bash xeyes
CMD ["/bin/bash"]
ビルドしたDockerイメージを起動します。
この時、DISPLAY環境変数にローカルのWindowsマシンのIPアドレスを設定します。
docker run --rm -it --name=xeyes --hostname=xeyes -e DISPLAY=<ローカルWindowsマシンのIPアドレス>:0.0 <イメージ名>
コンテナを起動し、コンテナ内でxeyes
コマンドを実行すると、ローカルのWindowsマシン上でxeyesの画面が開きます。
リモートのLinux上でxeyesを実行する
まずは下記コマンドで、リモートのLinux上でX11Forwardingが有効化されていることを確認します。
cat /etc/ssh/sshd_config | grep -i X11Forwarding
「X11Forwarding yes」となっていれば有効化されています。
設定が無い、もしくは「X11Forwarding no」となっている場合は、/etc/ssh/sshd_config
に「X11Forwarding yes」の設定を追加した後、sshサービスを再起動してください。
次に、DISPLAY
環境変数にローカルのWindowsマシンのIPアドレスで設定します。
export DISPLAY=<ローカルWindowsマシンのIPアドレス>:0.0
先ほどと同様にxeyes
コマンドを実行すると、ローカルのWindowsマシン上でxeyesの画面が開きます。
リモートのLinuxに立ち上げたDockerコンテナ上でxeyesを実行する
ローカルのWindowsに立ち上げたDockerコンテナ上でxeyesを実行する で作成したDockerfileを流用して、リモートのLinux上で同様にDockerイメージを作成します。
Dockerイメージを作成したら、下記コマンドでDockerコンテナを起動してください。
--net host
オプションを追加して、ホストとなるリモートLinuxと同一ネットワークを使用するように設定するのがポイントです。
docker run --rm -it --name xeyes --hostname xeyes \
--net host \
-e DISPLAY=<ローカルWindowsマシンのIPアドレス>:0.0 \
<イメージ名>
後はいつものようにxeyes
コマンドを実行するれば、ローカルのWindowsマシン上でxeyesの画面が開きます。(※3)
※3
最初起動した際に、下記のようなエラーが発生しました。
Authorization required, but no authorization protocol specified
このエラーが発生した場合は、Linux上で下記コマンドを実行してみてください。
xhost + local: