如何在 Windows 11 上从 docker 桌面容器显示 GUI 应用程序

Tia*_*ian 4 x11 docker wayland windows-subsystem-for-linux windows-11

从这篇文章中,它指出 Windows 11 原生支持在 wsl 上运行 X11 和 Wayland 应用程序。

我尝试通过 docker 容器执行相同的操作,设置环境变量DISPLAY="host.docker.internal:0.0"并运行 GUI 应用程序(如gedit)。但我却得到了这个错误:

Unable to init server: Could not connect: Connection refused

Gtk-WARNING **: 17:05:50.416: cannot open display: host.docker.internal:0.0
Run Code Online (Sandbox Code Playgroud)

chr*_*lof 7

我在尝试与您相同的事情时偶然发现了您的问题,并且在 Microsoft 上的这篇博客文章的帮助下实际上让它发挥了作用。我使用基于 Ubuntu 的最小 Dockerfile 并安装gedit

FROM ubuntu:22.04
RUN apt update -y && apt install -y gedit
CMD ["gedit"]
Run Code Online (Sandbox Code Playgroud)

以通常的方式创建图像,例如docker build . -t guitest:1.0

在 WSL 命令行上,像这样启动它:

docker run -it -v /tmp/.X11-unix:/tmp/.X11-unix \
            -v /mnt/wslg:/mnt/wslg \
            -e DISPLAY \
            -e WAYLAND_DISPLAY \
            -e XDG_RUNTIME_DIR \
            -e PULSE_SERVER \
            guitest:1.0
Run Code Online (Sandbox Code Playgroud)

我希望这对您也有好处。


小智 7

这个答案很大程度上是基于Chrillof 所说的。感谢您的出色开始!

对于使用 WSL2 的 Windows 上的 Docker Desktop 用户来说,关键的事情是:

  1. 容器主机(即 docker-desktop-data WSL2 发行版)本身没有/tmp/.X11-unix/mnt/host/wslg/.X11-unix该文件夹实际上可以在docker-desktop 发行版上的文件夹中找到,该文件夹转换为/run/desktop/mnt/host/wslg/.X11-unix运行容器时的文件夹。
  2. 没有内置环境变量可以帮助您,因此您需要在考虑到这些文件夹的情况下显式指定环境变量。

我发现了这个GitHub 问题,其中有人必须手动设置环境变量,这使我能够将其他人直接在 WSL2 上体验到的点与 Chrillof 的解决方案联系起来

因此,使用主机上的 PowerShell 修改 Chrillof 的解决方案,它看起来更像是:

docker run -it -v /run/desktop/mnt/host/wslg/.X11-unix:/tmp/.X11-unix `
               -v /run/desktop/mnt/host/wslg:/mnt/wslg `
               -e DISPLAY=:0 `
               -e WAYLAND_DISPLAY=wayland-0 `
               -e XDG_RUNTIME_DIR=/mnt/wslg/runtime-dir `
               -e PULSE_SERVER=/mnt/wslg/PulseServer `
               guitest:1.0
Run Code Online (Sandbox Code Playgroud)

在我的电脑上,它看起来像这样(WSLg X11 的演示)

需要明确的是,我没有检查音频是否正常工作,但是如果您已经安装了 WSL2,这确实可以让您避免安装另一个 X11 服务器。