从Windows远程CentOS运行Docker容器时X窗口异常问题排查
搞定Windows远程CentOS运行Docker容器的X11转发问题
嘿,我来帮你解决这个远程Docker跑GUI容器的坑!你遇到的X窗口弹出来没反应、还有ssh调试日志显示X11通道建立但没效果的问题,本质是X11转发的权限和Docker容器的环境配置没到位,一步步来:
先把Windows本地的X服务器弄对
首先你Windows上肯定装了VcXsrv或者Xming这类X服务器对吧?启动的时候一定要勾选"Disable access control"!这个选项是让远程主机能连进来的关键,很多人就是漏了这个,导致X窗口弹出来却啥都没有。
修正CentOS上的SSH X11转发配置
你用ssh -vvv看到X11通道已经建立了,但CentOS的sshd可能还有配置没开对:
- 编辑
/etc/ssh/sshd_config,确保这几行是这样的:X11Forwarding yes X11DisplayOffset 10 X11UseLocalhost no # 这个必须设为no,不然X11服务只绑定localhost,容器访问不到 - 改完重启sshd:
sudo systemctl restart sshd
之后重新连接的时候,记得用-Y参数(比-X权限更宽松,适合测试):
ssh -Y name@你的CentOS主机IP
给Docker容器开X11访问权限
现在要让容器能访问宿主机的X服务,两步走:
在CentOS的终端里,先放开X11的本地访问权限:
xhost +local:root要是用普通用户跑容器,就改成
xhost +local:$USER就行。运行带GUI的容器时,必须挂载X11的socket文件,同时传递DISPLAY环境变量。比如你要跑一个保持空闲的X窗口(用xterm镜像测试最方便):
docker run -it --rm \ -e DISPLAY=$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix \ xterm这样xterm窗口就能正常打开,而且保持空闲状态了。
解释下你遇到的docker pull hello-world问题
其实hello-world是个纯命令行镜像,根本不需要GUI!你之前弹出X窗口是因为环境里带了DISPLAY变量,但这个镜像本身没GUI程序,所以弹出来啥反应都没有。只有跑带GUI的容器时,才需要上面的X11配置。
额外小提示
- 用VcXsrv的时候,启动选"One large window"或者"Multiple windows",别选全屏,调试起来方便。
- 每次重启CentOS或者X服务器后,可能要重新执行
xhost +local:root,嫌麻烦的话可以把这个命令加到你的.bashrc里,每次登录自动执行。
内容的提问来源于stack exchange,提问作者Thomas PEDOT
相关产品推荐
相关产品推荐

