Docker 用于基于 GUI 的环境?

标签 docker qt vagrant configuration-management

问题

我有一组客户端计算机,它们是企业 Web 应用程序的一部分。每台机器都运行相同的软件,这是一个连接到服务器的基于 PyQT 的 Web 客户端。这个客户端软件会定期更新,我希望有一些配置/配置工具,允许在每台机器上拥有相同的环境,因此可以轻松地将软件部署和配置到每台客户端的机器上。

问题是我尝试过使用 Chef,但要真正维护 Chef 的知识和技能需要付出很多努力(我们没有专门的 Ops 人员),而且如果某些第三方存储库,Chef 配方可能会失败is no longer available (这是一个主要的塞子)。

我想尝试 Docker 来解决这个问题,但是我 still do not know如果可以设置允许某些基于 GUI 的软件运行的图像/容器。

问题

是否可以使用 Docker 为基于 GUI 的应用程序 (PyQt/QT) 提供开发/生产环境?如果是,解决该问题的第一步是什么?

最佳答案

目前这个问题没有答案,但它在谷歌上的排名很高。其他答案大多是正确的,但有一些警告是我通过艰难的方式学到的,我想为其他人省去麻烦。

Nasser Alshammari 给出的答案是在 Docker 容器中运行 GTK 应用程序的最简单(也是最快)的方法 - 只需将 X 服务器的套接字挂载为 Docker 卷,然后告诉 Docker 使用它。

docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY TheImage

(我还建议传递 -u <username-within-container> 标志,因为以 root 身份运行 X11 应用程序并不总是有效,通常不推荐,尤其是在共享 session 时

这适用于 xterm 等应用程序,以及基于 GTK 的应用程序。例如,如果您在 Firefox(基于 GTK)上尝试此操作,它将起作用(请注意,如果您已经在主机上运行 Firefox,它将在主机中打开一个新窗口,而不是打开一个新的 Firefox 实例从容器内)。

但是,您的回答专门询问了 PyQT。 It turns out that Qt does not support sharing of X sessions in this way (或者至少不能很好地支持它)。

如果您尝试以这种方式运行基于 QT 的应用程序,您可能会收到如下错误:

X Error: BadAccess (attempt to access private resource denied) 10
  Extension:    140 (MIT-SHM)
  Minor opcode: 1 (X_ShmAttach)
  Resource id:  0x12d
X Error: BadShmSeg (invalid shared segment parameter) 148
  Extension:    140 (MIT-SHM)
  Minor opcode: 5 (X_ShmCreatePixmap)
  Resource id:  0xb1
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 62 (X_CopyArea)
  Resource id:  0x2c0000d
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 62 (X_CopyArea)
  Resource id:  0x2c0000d

我说“可能”是因为我没有用足够多的 Qt 应用程序测试这种方法来确定,或者深入研究了 Qt 源代码以找出不支持的原因。 YMMV,您可能会很幸运,但如果您希望在 Docker 容器中运行基于 Qt 的应用程序,您可能必须采用“老式”方法和任一

  1. 在容器内运行sshd,开启X11转发,然后使用ssh -X连接容器(更安全)或 ssh -Y (不太安全,仅在您完全信任容器化应用程序的情况下使用)。

  2. 在容器中运行 VNC,并使用 VNC 客户端从主机连接到它。

在这两个选项之间,我会推荐第一个,但看看哪个最适合您的情况。

关于Docker 用于基于 GUI 的环境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24095968/

相关文章:

ubuntu - 如何禁用 Docker 内的所有网络连接?

Docker-compose 默认排除服务

c++ - QVariant 到 QDBusArgument

networking - Vagrant "domain forwarding"

windows - 无法启动 Git Bash

django - Vagrant + Chef : Error in provision "Shared folders that Chef requires are missing on the virtual machine."

docker - 构建 docker 环境从 Virtualbox 迁移,网络配置复杂

docker - 使用 docker 运行 Java 9 应用程序不起作用 - UnsupportedClassVersionError

c++ - Qt 禁用 Windows 10 游戏栏

c++ - Qwt 简单图示例