DockerコンテナからJava GUI X11セッションを開始できません。

DockerコンテナからJava GUI X11セッションを開始できません。

Dockerコンテナ内でJava GUIアプリケーションを実行できないため、xeyesのようにデスクトップに表示されません。
私が取っているステップは次のとおりです。

Unityセッションで実際のマシンにログインし、端末を開き、次のコマンドを実行しました。

root@prod:~# echo $DISPLAY 
:0
root@prod:~# ls /tmp/.X11-unix/
X0  X1024

次にVPNに移動し、SSH経由のホスト(名前:ホスト-A)。
内部でxeyesを実行できます。ホスト-Aその後、雪がUnityに表示され、Xの配信が機能するようにマウスに従いました。

a@host-a$ echo $DISPLAY
localhost:10.0
a@host-a$ sudo netstat -anutp | grep 60
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      21988/6         
tcp        0      0 127.0.0.1:6011          0.0.0.0:*               LISTEN      22182/14        
tcp6       0      0 ::1:6010                :::*                    LISTEN      21988/6         
tcp6       0      0 ::1:6011                :::*                    LISTEN      22182/14

以内にホスト-Aその後、dockerを使用してJavaアプリケーションを含むイメージを実行します。

a@host-a$ sudo docker run --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -ti repo/image bash`

出力は次のとおりです

root@7722f3167495:/# echo $DISPLAY
localhost:11.0

その後、Javaアプリケーションを実行しようとすると、次のようになります。

java.awt.AWTError: Can't connect to X11 window server using 'localhost:11.0' as the value of the DISPLAY variable.

私も同じDISPLAYように設定してみました。ローカルコンピュータだけがあることがわかりました。10.0
製品ソケットを含みます/tmp/.x11-unix。コンテナとホスト-A欲しくない

X セッションが確立されない理由の提案をいただきありがとうございます。

答え1

このアプローチは可能性が低いです。

X11ソケットファイルはローカル接続にのみ使用され、ワー​​クステーションからのみアクセスできます。そこからTCPです。

SSHとX11Forwardingを使用してSSHをサーバーホスト-Aとして使用したため、ワークステーションとサーバー間にTCP接続が作成されました。 TCP X11のサーバー上にある場合は、「localhost:10」が表示されます。ワークステーションのSSHクライアントはそこから.X11 unixソケットファイルにトラフィックを転送します。 localhost:11ディスプレイがどこから来たのかはわかりませんが、SSH配信にも関連しています。 SSHホップを1つだけ作成しましたか、それとも2つだけ作成しましたか?

ワークステーションで直接TCP受信を有効にすると、より多くの成功を収めることができます。

docker run .... -e DISPLAY=<workstation-ip-address>:0

ただし、「xauth」エラーが発生する可能性があります。

xauthコマンドを使用して認証トークンをサーバーのホームディレクトリにエクスポートし、それをdockerボリュームにマウントしてコンテナがトークンにアクセスできるようにします。また、次のdockerコマンドでXAUTHORITY環境変数を設定することもできます。 xauth ファイルをエクスポートしました。または、コンテナ内でxauthを使用してトークンを取得します。

gitbubでAzureusを実行する古いサンプルDockerコンテナがあります.リンクが見つかるかどうかを確認します。

コンテナにVNCサーバーを追加し、コンテナのvncセッションでJavaアプリケーションを起動してから、vncを使用してワークステーションから接続する方がはるかに簡単な場合があります。

または、Dockerホストでvncサーバーを実行し、Docker '-net Host'を使用してホストネットワークスタックを共有し、コンテナでDISPLAY = : 5900を使用し、VNCディスプレイホスト-a:0からワークステーションに接続することもできます。これにより、コンテナにVNCパッケージを追加する必要がなくなります。

関連情報