我已经使用Running Gui Apps with Docker的这些指令来创建允许我启动基于GUI的应用程序的图像。
在同一台机器上运行Docker时,它完美无缺,但在远程主机上运行时它会停止工作。
在当地,我可以跑
docker --rm --ti -e DISPLAY -e <X tmp> <image_name> xclock
我可以在我的主机上运行xclock
。
当使用XForwarding
远程连接到主机时,我能够运行出现在我本地X服务器上的X应用程序,正如任何人所期望的那样。
但是,如果在远程主机中我尝试运行上面的docker命令,它无法连接到DISPLAY
(通常是localhost:10.0
)
我认为问题是XForwarding
是在远程主机的localhost接口上设置的。因此,docker主机无法连接到DISPLAY=localhost:10.0
,因为localhost意味着远程主机,无法从docker本身访问。
有谁能建议一个优雅的方法来解决这个问题?
关心亚历山德罗
EDIT1:我猜的一种可能的方法是使用socat
将远程/tmp/.X11-unix
转发到本地机器。这样我就不需要使用端口转发了。看起来openssh
6.7本身也支持unix套接字转发。
通过SSH(ssh -X)运行X应用程序时,您没有使用/tmp/.X11-unix套接字与X服务器通信。您宁愿通过“localhost:10.0”通过SSH访问隧道。
为了使其工作,您需要通过设置确保SSH服务器支持与外部地址的X连接
X11UseLocalhost no
在/ etc / ssh / sshd_config中。
然后容器内的$ DISPLAY应设置为docker接口上Docker主机的IP地址 - 通常为172.17.0.1。所以$ DISPLAY将是172.17.0.1:10
您需要使用“xauth add”在docker容器中添加X身份验证令牌(请参阅here)
如果Docker主机上有任何防火墙,则必须打开与此隧道相关的TCP端口。通常你必须运行类似的东西
ufw allow from 172.17.0.0/16 to any port $TCPPORT proto tcp
如果你使用ufw。
然后它应该工作。我希望它有所帮助。有关更多详细信息,请参阅我在https://stackoverflow.com/a/48235281/5744809的其他答案。