如何在Docker容器中运行GUI应用程序?
是否有任何图像设置vncserver或某些东西,以便你可以 - 例如 - 在Firefox周围添加一个额外的speedbump沙箱?
我通过Xvfb在显示号码:99上运行selenium,如下所示:
/ usr/bin/Xvfb:99 -ac -screen 0 1024x768x8&export DISPLAY =":99"&& java -jar /usr/lib/selenium/selenium-server-standalone-2.24.1.jar -port 4444
但是,默认情况下,显示的数字不是:0.如何让它真实地看到selenium在浏览器中做了什么?
我有以下场景:
我注意到的是:如果 Firefox 在我在容器中启动它时已经在我的主机上运行,它本质上是“转义”容器,因为它只是打开了一个 Firefox 主机实例的新窗口。因此,它可以访问主机上的所有内容,而容器变得无用。
反之亦然:如果 Firefox 未在主机上运行,而我在容器中启动了一个实例,则它确实在容器内运行。如果我随后在主机上启动 Firefox,新实例也会在容器内运行。
但是,我无法使用 gvim 而不是 Firefox 重现此行为。
我很清楚 X11 套接字共享固有的安全问题,但我无法解释我上面描述的场景。为什么容器可以在其受限环境之外启动“进程”——或者更确切地说是一个窗口?我的主机系统怎么可能仅仅因为相同的程序已经在容器内运行而在容器内启动一个进程?
(请注意,我不知道如何调用除“进程”以外的程序的这种图形实例,尽管在这种情况下它可能不是真正的进程......)
系统:Ubuntu GNOME 14.10、Docker 1.5、ubuntu:最新的Docker镜像。
更新:如果我使用该-new-instance标志启动 Firefox,则不会发生这种情况,因此它似乎更像是 Firefox 问题而不是 X11 套接字问题。
更新 2:似乎这也发生在其他场景中,例如使用 ssh 和 X 转发:
https : //unix.stackexchange.com/questions/104476/why-starting-firefox-from-command-line-in- vm-starts-the-firefox-in-the-host-ma
和
https://superuser.com/questions/462055/launching-firefox-on-remote-server-causes-local-firefox-to-open-the-页代替
现在的问题是,Firefox 到底是怎么做到的?他们使用什么样的 X11 法术来确定 Firefox 是否已经在运行?
我创建了带有 X 服务器的 docker 容器。我将它用于一些屏幕外的 OpenGL 渲染。这个容器应该可以在任何系统上工作(有或没有 X 服务器运行),并且它应该使用硬件 GPU(如果它存在)(所以我不能使用 xvfb)。
当我在没有 GUI 的类似服务器的系统上使用这个容器时,一切正常。但是当我在 Ubuntu 14.04 桌面上运行容器时,每次在容器中启动 X 服务器时屏幕都会关闭。
我使用 --priviliged 启动容器,因此 /dev 文件夹与容器共享。我相信它涉及某种冲突。
有没有办法在容器内启动 X,例如主机 X 服务器仍在工作?
更新:
我在 Xorg.0.log 中看到以下内容:
AIGLX: Suspending AIGLX clients for VT switch
(II) NOUVEAU(0): NVLeaveVT is called.
Run Code Online (Sandbox Code Playgroud)
更新:
我可以使用 xvfb 代替真正的 Xorg 服务器吗?它是否支持实际的硬件 GPU 渲染?
我想在 docker 容器中运行 Firefox(或任何图形应用程序)。
我的要求:当我启动容器时,我应该创建一个虚拟显示,启动 VNC 服务器,然后启动 GUI 应用程序。这意味着在容器成功启动后,我可以通过 VNC 客户端连接到容器内运行的 GUI 应用程序。当我关闭应用程序时,容器应该自动停止。
尝试 1: 我从这里的示例开始https://hub.docker.com/r/devopsil/vnc-firefox/~/dockerfile/ 在此示例中,开发人员通过 CMD 启动 vnc 服务器并使其永远运行。他将 firefox 作为 .rc 文件的一部分,以便在容器启动时启动。如果您通过 VNC 客户端连接,您可以看到 firefox,并且按预期关闭 Firefox 或断开 VNC 会话不会停止容器。
尝试 2: 我按如下方式调整了 Dockerfile。只更改了最后一行(用 ENTRYPOINT 替换了 CMD 并删除了“永远”标志)
ENTRYPOINT ["/usr/bin/x11vnc", "-usepw", "-create"]
Run Code Online (Sandbox Code Playgroud)
重建和运行容器“docker run --rm -p 5900”现在有不同的行为:容器启动,通过VNC客户端的连接工作,几秒钟后打开firefox(等待消息“显示中缺少扩展RANDR:20” ) 并且容器在关闭 vnc 连接后自动停止。
尝试 3: 然后我创建了一个 bash 脚本来启动 vncserver 和 firefox,并更改 Dockerfile 以将这个脚本文件复制到镜像中,并将该脚本作为入口点。但是我收到了类似于“未设置显示变量”的错误
#!/bin/bash
/usr/bin/x11vnc -forever -usepw -create &
firefox
Run Code Online (Sandbox Code Playgroud)
尝试 4: 所以我通过 docker run 命令传递了 DISPLAY 变量,但是错误是无法打开显示。 …
问题最明确,即
如何在Docker 远程容器中启动完整的桌面环境(KDE,XFCE,Gnome无关紧要)。
我是挖在互联网上,还有 有 许多关于相关主题的问题,但不一样的,他们所有关于如何运行GUI 应用程序不完整的桌面。
我发现:
但实际上我一直在这里,总是遇到任何错误:
... (EE) Invalid screen configuration 1024x768 for -screen 0
... Cannot open /dev/tty0 (No such file or directory)
Run Code Online (Sandbox Code Playgroud)
您能否给出一些Dockerfile行以达到目标?