我编写了一些 Java 桌面应用程序,并认为我可以使用 Docker 运行它们来了解容器。
我将 Java 应用程序放入带有 ubuntu 映像的 Docker 容器中。就在那时,我意识到我需要让 Docker 能够访问我的 DISPLAY 变量,以便 GUI 能够工作/访问我的计算机的 I/O。连接后,我可以运行 docker 容器并在计算机屏幕上看到 GUI 弹出。
这就是我开始感到困惑的地方。如果我在 VirtualBox 中运行桌面 GUI,我可以在虚拟机中看到 GUI;它在虚拟计算机上。然后有一些智能设备可以将虚拟机 I/O 连接到本地计算机的 I/O。这对我来说很有意义。
但是 Docker 如何将 GUI 返回到我的实际计算机上呢?当我运行容器时,我可以在我的实际计算机上看到 GUI(而不是在像 virtualbox 这样的虚拟机中)。但是 GUI 本身如何在主机上呈现呢?当我与主机共享 I/O 时,Docker 是否有权将 GUI 文件发送回主机以显示 GUI?或者当我使用 ubuntu 映像创建容器时,我基本上创建了一个虚拟机吗?
答案1
如果您使用的是 Linux,请在 docker 中挂载 /tmp/.X11-unix(启动命令中的选项:-v /tmp/.X11-unix:/tmp/.X11-unix),您将能够显示任何GUI 类型,没有任何其他选项。与 docker 共享此文件允许任何类型的 GUI。
如果您不想这样做,您可以以 Linux 普通用户身份键入 xhost+ 命令,然后从 Docker 使用 export DISPLAY=IP:0.0 (或任何需要的内容,但即使在本地,IP 也不能是 127.0.0.1)。
xhost+允许任何主机、导出DISPLAY共享“远程”机器上的显示。
如果您在 Windows localhost 上运行 docker,则所有端口基本上都会打开,但您需要特定的 Xserver 才能在 Windows 桌面上显示 Ubuntu(VcXsrv 是您的朋友,因为它是使用 Visual C++ 2012 编译的特定 X Server)和命令导出应在启动 GUI 之前发出 DISPLAY=IP:0.0。