linux – 无法从docker容器启动Java GUI X11会话

我无法在docker容器中运行Java GUI应用程序,因此它会出现在我的桌面上,就像xeyes一样.
以下是我要采取的步骤:

我在Unity会话中登录到我的物理机器并打开终端,运行命令:

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

然后我进入VPN并通过SSH连接到主机(名为host-a).
我可以在主机-a中运行xeyes,并且眼睛出现在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

在host-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但也一样.
我注意到只有本地机器prod包含/tmp/.x11-unix中的套接字.容器和主机-a没有.

有关X会话未建立的任何建议将不胜感激.

解决方法:

这种方式不太可能

X11套接字文件仅用于本地连接,只能在工作站*问.
从那里它的TCP.

由于您已使用SSH与X11Forwarding SSH连接到服务器主机 – 它已在您的工作站和服务器之间创建了一个tcp连接.当您在服务器上时,这是TCP X11显示“localhost:10”.工作站上的SSH客户端会将流量从那里转发到.X11 unix套接字文件.
我不确定localhost:11显示器的来源,但它也与SSH转发有关.你只做了一个或两个SSH跳?

如果直接在工作站X服务器上启用TCP侦听,则可能会取得更大成功(删除’-nisten 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包添加到容器中

上一篇:debian – 在Android系统上显示X应用程序


下一篇:剑指offer 54、二叉搜索树的第k大节点