在Docker容器中运行GUI图形应用的开源项目


如果我们想在 Docker 容器中运行桌面 GUI 应用程序以将它们用作更大系统中的组件怎么办?例如,如果我们在 Docker 中运行 Firefox,我们可以在容器之间明确分离浏览器状态。
假设我们在 macOS 或其他 Unix/Linux 系统上安装了 Docker。我们如何在 Docker 容器中运行 Firefox?作为第一次尝试,让我们考虑以下 Dockerfile:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y firefox x11vnc xvfb
RUN echo "exec firefox" > ~/.xinitrc && chmod +x ~/.xinitrc
CMD ["x11vnc", "-create", "-noxrecord", "-noxfixes", "-noxdamage", "-forever", "-passwd", "trustno1"]

我们使用ubuntu基础镜像并安装 Firefox 有两个额外的东西:

  • x11vnc - 用于远程访问基于 X11 的桌面环境的 VNC 服务器。将其视为穷人 TeamViewer。
  • xvfb - X11 服务器的一个版本,它不需要任何实际的显示硬件,而是将视频渲染到 RAM 中。

我们将 X11 配置为在启动时运行 Firefox,并使用允许在客户端与 macOS 互操作的确切参数启动 x11vnc。
构建和运行这个容器相当简单:
$ docker build -t firefox-test-1 . $ docker run -p 5900:5900 --rm firefox-test-1

让我们也来看看一些致力于在Docker容器内运行GUI应用的开源项目:

x11docker
x11docker是一个在Linux主机系统中运行GUI应用程序的解决方案,它在某些方面更先进(GPU访问、外围设备支持、安全改进),但受限于现有的Linux桌面环境,不能正确支持Linux以外的操作系统。

要通过x11docker启动GUI应用程序,就必须为该应用程序构建或拉动Docker容器,并以与x11docker兼容的方式编写(Github和Docker Hub上有一些例子),然后通过x11docker CLI工具启动它。

Kasm Workspaces
Kasm Workspaces是一个开源平台,它将这一想法进一步推进,甚至提供了一个SaaS版本,由他们为你托管。

像x11docker一样,它为Firefox(和其他浏览器)、Slack、Discord、VS Code等常见应用提供了一堆预先开发的Docker镜像。整个Linux桌面环境可以通过管理界面上的一键安装来实现。与前面的例子一样,远程桌面也是通过网络浏览器来实现的。然而,Kasm Workspaces使用的是KasmVNC--一个由同一家公司开发的VNC解决方案。

docker-android
到目前为止,我们谈到了在容器内运行Linux GUI应用程序。但是,运行Android应用程序呢?事实证明,可以在Docker容器内运行整个安卓模拟器,并通过novnc接口,使用名为docker-android的解决方案,将其暴露出来。尽管它警告说不完全支持嵌套式虚拟化,但我还是能够通过以下命令运行它。

$ docker run --privileged -d -p 6080:6080 -p 5554:5554 -p 5555:5555 -e DEVICE="Samsung Galaxy S6" --name android-container budtmo/docker-android-x86-8.1