我在运行Docker容器时打开任何X11窗口(也包括Python OR ROS脚本中的绘图窗口)时遇到问题。简而言之,我总是从不同的应用程序中得到类似的“无法打开显示”错误。
我不想模拟桌面环境、ssh转发或VNC虚拟化。
平台
主机:Ubuntu 22.04 Docker:Docker桌面4.15图片:在ubuntu:latest或debian:latest的纯图像上尝试过firefox,xeyes等(例如 * gns 3/xeyes*,* shipway/xclock*).甚至我也用Dockerfiles从头开始构建了几个。
运行命令
docker run -it --network=host -e DISPLAY -v "/tmp/.X11-unix:/tmp/.X11-unix:rw" <image name>
我也试过:
- 运行容器之前的
xhost +local:root
、xhost +local:docker
、偶数xhost +
--privileged
--runtime=runc
DISPLAY=127.0.1.1:1
(即:〈主机显示〉)DISPLAY=unix$DISPLAY
额外信息
- 显示容器中的环境变量:
DISPLAY=:1
- 在主机上,没有
~/.Xauthority
,而是xauth
以/run/user/1000/gdm/Xauthority
为目标 - 我已经检查了solution 1、solution 2和solution 3,但仍有遗漏。
QEMU/KVM虚拟化层是否是问题的根源,因为它是Docker Desktop(不仅仅是Docker Engine)?
1条答案
按热度按时间ldioqlga1#
2023年2月27日更新:魔术IP
198.18.0.1
似乎与我的VPN应用程序创建的一个tun
设备有关,该设备可能会处理所有流量,删除此设备后,我无法用以下方法重现正确的结果。我有确切的设置(除了ubuntu20.04,不是22.04),并尝试了一整天以上的许多解决方案。
这是我在过去一天中发现的
1.默认情况下,X服务器不侦听TCP
--network=host
没有像我想象的那样工作,:1
和127.0.0.1:1
都没有解决这个问题1.当我从Docker容器中ping任何站点(例如
ping google.com
)时,它将其解释为198.18.0.1
我不清楚潜在的机制,但经过试验,我解决了这个问题
1.通过简单地将
/etc/gdm3/custom.conf
修改为,让X服务器默认侦听TCP(假设您的桌面管理器是
gdm
,这可能是Ubuntu 17的默认桌面管理器),然后重新启动gdm
nmap localhost
查看是否显示6001
(假设$DISPLAY=:1
)或X11
(或任何类似的命令,如netstat -an | grep 6001
;ps -ef | grep X
可用于查看Xorg
是否与-listen tcp
参数一起运行)1.成功运行docker容器
其中
xclock
是由这样的Dockerfile
定义的简单图像(the最后一个apt层用于以前的网络调试,可以忽略它),那么您应该看到显示器上显示的GUI时钟。
至于这个
198.18.0.1
是什么意思,目前我所知道的是1.它包含在
ifconfig
的输出中1.前缀
198.18.0
包含在从Docker容器内调用的ping
的输出中因此,我猜测它与充当主机和Docker容器之间桥梁的某个网络接口有关,但是,这种猜测似乎与我对主机模式的理解相冲突(因此我删除了
--network=host
)。此外,我最终没有MapUNIX套接字文件
/tmp/.X11-unix
,因为我发现它不影响结果。我不确定连接是否完全通过TCP传输,而不是UNIX套接字文件。记住试用后使用
xhost -
。禁用防火墙将是不必要的,所以只要通过sudo ufw enable
保持打开即可。同样,我不确定该机制或其安全问题。在我解决了这个问题后,我很快就把这个答案贴了出来,如果有新的发现或错误,我可能会修改它。希望任何Maven可以纠正我的缺陷和问题。