1
50
我想出来了。使用SSH和X11转发连接到计算机时, /tmp/。X11 unix 不用于X通信,不需要与$XSOCK相关的部分。 任何X应用程序都使用$DISPLAY中的主机名,通常是“localhost”,并使用TCP进行连接。然后通过隧道将其传回SSH客户端。当为Docker使用“-net host”时,Docker容器的“localhost”与Docker主机的“localhost”相同,因此它可以正常工作。 如果未指定“-net host”,Docker将使用默认网桥网络模式。 这意味着“localhost”在容器中的含义与主机不同 ,容器中的X应用程序将无法通过引用“localhost”来查看X服务器。因此,为了解决这个问题,必须用主机的实际IP地址替换“localhost”。通常为“172.17.0.1”或类似值。检查“docker0”接口的“ip地址”。 这可以通过sed替换完成:
此外,SSH服务器通常未配置为接受到此X11隧道的远程连接。然后必须通过编辑进行更改 /etc/ssh/sshd\u配置 (至少在Debian中)和设置:
然后重新启动SSH服务器,并使用“SSH-X”重新登录到服务器。 差不多了,但还有一个并发症。如果Docker主机上正在运行任何防火墙,则必须打开与X11隧道关联的TCP端口。端口号是两个端口之间的数字 : 以及 . 在$显示中添加到6000。 要获取TCP端口号,可以运行:
然后(如果使用 ufw公司 作为防火墙),为172.17.0.0子网中的Docker容器打开此端口:
所有命令都可以放在一个脚本中:
假设您不是root,因此需要使用sudo。
而不是
如果服务器上的其他用户知道您创建了/tmp/的内容,则他们也无法访问X服务器。docker。的身份验证文件。 我希望这能使它在大多数情况下正常工作。 |
2
2
在我的情况下,我坐在“remote”并连接到“docker\u host”上的“docker\u容器”:
为了使VScode更容易调试脚本,我将SSHD安装到“docker\u容器”中,报告端口22,映射到“docker\u主机”上的另一个端口(比如1234)。 因此,我可以通过ssh(从“remote”)直接连接正在运行的容器:
(其中
这将通过ssh直接创建从“remote”到“docker\u container”的连接。
在“docker\u容器”中,我安装了
要允许X11转发工作,请编辑
然后在容器中重新启动ssh。您应该从“docker\u主机”将shell执行到容器中,而不是通过ssh连接到“docker\u容器”时:(
重新启动sshd:
当您通过ssh连接到“docker\u容器”时,请检查
通过ssh(如cv2.imshow())从“docker\u container”中执行您最喜欢的X11图形程序进行测试 |
3
2
如果您设置
这里有一个替代改变的方法
使用默认值
我们希望实现以下目标:
我们可以让X11应用程序直接与
现在,我们添加了一个iptables规则,以在根网络ns中从172.17.0.1路由到127.0.0.1:
也许您可以通过仅从此容器(veth end)路由流量来改进这一点。还有,我不太清楚为什么
使用上面给出的命令,我们最终得到:
但是,现在我们尝试访问X11服务器
哪里
您可能还必须允许流量进入
您还可以从docker容器网络命名空间内的主机启动应用程序:
没有
上面显示的X11转发机制适用于整个网络名称空间(实际上,适用于连接到
|
4
0
我使用一种完全可以在docker容器中执行的自动化方法。
只需将显示变量传递给容器,然后安装
创建文件,
创建以下Dockerfile以进行测试:
构建和运行:
在容器内,运行:
要以非交互方式运行,必须确保
|