通过Docker进行X11套接时出错“无法打开显示器”[Ubuntu 22.04上的Docker桌面,无ssh/vnc]

fcg9iug3  于 2023-03-07  发布在  Docker
关注(0)|答案(1)|浏览(494)

我在运行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:rootxhost +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 1solution 2solution 3,但仍有遗漏。

QEMU/KVM虚拟化层是否是问题的根源,因为它是Docker Desktop(不仅仅是Docker Engine)?

ldioqlga

ldioqlga1#

2023年2月27日更新:魔术IP 198.18.0.1似乎与我的VPN应用程序创建的一个tun设备有关,该设备可能会处理所有流量,删除此设备后,我无法用以下方法重现正确的结果。
我有确切的设置(除了ubuntu20.04,不是22.04),并尝试了一整天以上的许多解决方案。
这是我在过去一天中发现的
1.默认情况下,X服务器不侦听TCP

  1. --network=host没有像我想象的那样工作,:1127.0.0.1:1都没有解决这个问题
    1.当我从Docker容器中ping任何站点(例如ping google.com)时,它将其解释为198.18.0.1
    我不清楚潜在的机制,但经过试验,我解决了这个问题
    1.通过简单地将/etc/gdm3/custom.conf修改为,让X服务器默认侦听TCP
[security]
DisallowTCP=false

[xdmcp]
ServerArguments=-listen TCP

(假设您的桌面管理器是gdm,这可能是Ubuntu 17的默认桌面管理器),然后重新启动gdm

  • 要检查这一点,请使用命令nmap localhost查看是否显示6001(假设$DISPLAY=:1)或X11(或任何类似的命令,如netstat -an | grep 6001;ps -ef | grep X可用于查看Xorg是否与-listen tcp参数一起运行)

1.成功运行docker容器

xhost +
docker run \
    -it \
    --rm \
    -e DISPLAY=198.18.0.1$DISPLAY \
    xclock

其中xclock是由这样的Dockerfile定义的简单图像

FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y x11-apps
RUN apt-get install -y iproute2 \
    curl \
    iputils-ping \
    net-tools
CMD xclock

(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可以纠正我的缺陷和问题。

相关问题