我无法在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包添加到容器中