栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在通过SSH连接的服务器上可靠地在Docker容器中运行X应用程序,而无需使用“ --net host”

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在通过SSH连接的服务器上可靠地在Docker容器中运行X应用程序,而无需使用“ --net host”

我想到了。当您使用SSH连接到计算机并使用X11转发时,/ tmp / .X11-unix 不用于X通信,并且不需要与$ XSOCK相关的部分。

任何X应用程序都使用$ DISPLAY中的主机名(通常为“ localhost”)并使用TCP进行连接。然后将其通过隧道传输回SSH客户端。在将“
–net host”用于Docker时,Docker容器的“ localhost”与Docker主机相同,因此可以正常工作。

如果不指定“ –net host”,则Docker使用默认的网桥网络模式。 这意味着“ localhost”在容器内部的含义不同于主机
,而容器内部的X应用程序将无法通过引用“ localhost”看到X服务器。因此,为了解决此问题,必须用主机的实际IP地址替换“
localhost”。通常为“ 172.17.0.1”或类似的值。检查“ ip addr”的“ docker0”接口。

可以使用sed替换来完成:

DISPLAY=`echo $DISPLAY | sed 's/^[^:]*(.*)/172.17.0.11/'`

此外,SSH服务器通常未配置为接受与此X11隧道的远程连接。然后必须通过编辑 / etc / ssh / sshd_config
(至少在Debian中)并设置来更改此设置:

X11UseLocalhost no

然后重新启动SSH服务器,然后使用“ ssh -X”重新登录到该服务器。

差不多了,但是还有一个复杂之处。如果Docker主机上正在运行任何防火墙,则必须打开与X11隧道关联的TCP端口。端口号是 和之间的数字
在$ DISPLAY中添加到6000。

要获取TCP端口号,可以运行:

X11PORT=`echo $DISPLAY | sed 's/^[^:]*:([^.]+).*/1/'`TCPPORT=`expr 6000 + $X11PORT`

然后(如果使用 ufw 作为防火墙),在172.17.0.0子网中为Docker容器打开此端口:

ufw allow from 172.17.0.0/16 to any port $TCPPORT proto tcp

所有命令可以一起放入脚本中:

XSOCK=/tmp/.X11-unixXAUTH=/tmp/.docker.xauthxauth nlist $DISPLAY | sed -e 's/^..../ffff/' | sudo xauth -f $XAUTH nmerge -sudo chmod 777 $XAUTHX11PORT=`echo $DISPLAY | sed 's/^[^:]*:([^.]+).*/1/'`TCPPORT=`expr 6000 + $X11PORT`sudo ufw allow from 172.17.0.0/16 to any port $TCPPORT proto tcp DISPLAY=`echo $DISPLAY | sed 's/^[^:]*(.*)/172.17.0.11/'`sudo docker run -ti --rm -e DISPLAY=$DISPLAY -v $XAUTH:$XAUTH    -e XAUTHORITY=$XAUTH name_of_docker_image

假设您不是root用户,因此需要使用sudo。

代替

sudo chmod 777 $XAUTH
,您可以运行:

sudo chown my_docker_container_user $XAUTHsudo chmod 600 $XAUTH

如果他们知道您创建了/tmp/.docker.auth文件的内容,则可以防止服务器上的其他用户也能够访问X服务器。

我希望这会使它在大多数情况下都能正常工作。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/412790.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号