当前位置: 首页 > 面试题库 >

X11转发在docker中运行的GUI应用

都沈浪
2023-03-14
问题内容

首先,我已经阅读了关于SO的类似问题的答案,但是没有一个起作用。

情况:

  • 带有GUI的应用程序在Arch Linux下的docker容器(CentOS 7.1)中运行。(机器A)
  • 机器A连接了一个监视器。
  • 我想通过Arch Linux客户端计算机上的X11转发访问此GUI。(机器B)

什么有效:

  • GUI在机器A上本地工作(/tmp/.X11-unix安装在Docker容器中)。
  • X11转发任何在docker外部运行的应用程序(X11转发已设置并正确运行以用于非docker使用)。
  • 我什至可以在远程登录时切换用户,将.Xauthority文件复制到其他用户,并且X11转发也可以。

一些设置信息:

  • Docker网络是“桥接”的。
  • 容器可以到达主机(防火墙已打开)。
  • DISPLAY 变量在容器中设置(由于sshd正在侦听的TCP端口6010,因此设置为host-ip-addr:10.0)。
  • 到达X转发端口(6010)的数据包正从容器(tcpdump选中)到达主机。

什么不起作用:

  • Docker应用程序的X11转发
  • 错误:

X11 connection rejected because of wrong authentication.

xterm: Xt error: Can't open display: host-ip-addr:10.0

我尝试过的事情:

  • ssh -Y在计算机B上使用选项启动客户端ssh
  • "X11ForwardTrusted yes"ssh_config放在机器B上
  • xhost + (因此允许任何客户端连接)在计算机B上
  • Host *ssh_config放在机器B上
  • X11UseLocalhost no在计算机A上放入sshd_config(以允许非本地客户端)
  • xauth add使用机器A上的登录用户从容器中添加X auth令牌
  • 只需将.Xauthority文件从工作用户复制到容器中
  • 使shure .Xauthority文件具有正确的权限和所有者

我如何才能禁用所有X安全功能并使其正常工作?

甚至更好:我如何使其与安全性一起使用?

至少有一种方法可以进行广泛的调试,以查看问题出在哪里?


问题答案:

好的,这是东西:

1)登录到远程机器

2)检查设置了哪个显示 echo $DISPLAY

3)运行 xauth list

4)复制对应于您的行 DISPLAY

5)输入您的Docker容器

6)xauth add <the line you copied>*

7)将DISPLAY设置为 export DISPLAY=<ip-to-host>:<no-of-display>

*到目前为止还好吧?

这并不是什么新鲜事……不过,这里有一个转折:xauth list登录用户打印的行看起来像这样(在我的情况下):

<hostname-of-machine>/unix:<no-of-display> MIT-MAGIC-COOKIE-1 <some number here>

因为我使用桥接docker设置,所以X转发端口不在本地侦听,因为sshd在容器中未运行。将上面的行更改为:

<ip-of-host>:<no-of-display> MIT-MAGIC-COOKIE-1 <some number here>

本质上:移除/unix零件。

<ip-of-host> 是sshd运行所在的IP地址。

如上设置DISPLAY变量。

因此错误是DISPLAY环境变量中的名称与xauth list/
.Xauthority文件中的条目不是“相同”的,因此客户端可能无法正确进行身份验证。

我切换回不受信任的X11转发设置。

X11UseLocalhost no但是,sshd_config文件中的设置很重要,因为传入的连接将来自“不同”的计算机(docker容器)。



 类似资料:
  • 我正在尝试构建一个多克文件,其中包含通过多克运行的 Rscript。我在构建它时遇到了与tcl / tk包加载相关的错误,我想在构建docker文件时使用X-11转发和显示变量。我目前正在关注这篇文章。我面临的问题是我找不到tmp /。我的机器中的X11-unix目录,如帖子中所述。对于构建 docker 文件和克服 tcl/tk 包中的错误,是否有任何替代方案?

  • 我过去经常用这样的命令运行程序: 然后我可以用我的Ubuntu系统的显示器运行wireshark。就像这个页面的例子:用docker运行GUI应用程序 现在它不工作了。当我运行wireshark时,我得到这个错误:

  • 我正在尝试使用Windows中的docker工具箱运行自定义java swing GUI。我现在想要容器化这个应用程序,但是得到以下错误: 我正在运行一个DockerFile。设置为: 3)复制到包含JAR的文件夹上 4)运行docker容器,该容器将启动GUI(不是linux前端,最好不使用vnc)。 我将Xlaunch用于windows上的终端,并且能够使用它在docker上启动一个firef

  • Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。 Hello world 现在让我们来试试 $ sudo docker run ubuntu:14.04 /bin/echo 'Hello world' Hello world 刚才你启动了你的第一个容器! 那么刚才发生了什么? 我们逐步来分析 docker run 命令做了哪些事情。 首先,

  • 问题内容: 我正在运行Docker容器,主要是作为该语言的隔离开发环境。(这里的用法与文章的其余部分是正交的,即,您可以假定可以在-session中运行的任何通用程序。)很多时候,这涉及到诸如绘图,制作图形等工作;我需要看看这些。因此,我希望可以选择显示在容器中创建的图形。到目前为止,这是我的操作方式。首先,我创建一个。忽略最简单的步骤是: 我构建图像,然后使用以下命令启动容器: 然后可以SSH到