无法从 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.

我也尝试过设置DISPLAY10.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 跃点还是两次?

如果直接在工作站 X 服务器上启用 TCP 侦听(删除“-nolisten tcp”标志,并且您可能需要添加“-listen tcp”),然后告诉 docker 容器直接使用工作站显示,您可能会取得更大的成功

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

但是,您也可能会出现“xauth”错误

您可以使用 xauth 命令将身份验证令牌导出到服务器上的主目录,然后将其安装为 docker 卷以使容器能够访问该令牌,并且还可以在 docker 命令中设置 XAUTHORITY 环境变量导出的 xauth 文件,或者使用容器内的 xauth 来导入令牌。

我在 gitbub 上有一个旧的示例 docker 容器,用于运行 Azureus 我将看看是否可以找到该链接

有时,将 VNC 服务器添加到容器中、在容器中的 vnc 会话中启动 Java 应用程序并使用 vnc 从工作站连接到它要容易得多。

或者在 docker 主机上,您可以运行 vnc 服务器并使用 docker '-net host' 共享主机网络堆栈,并在容器中使用 DISPLAY=:5900,并从您的 VNC 显示主机-a:0 连接到工作站。这样就无需将 VNC 包添加到容器中

相关内容