在容器中运行 GUI 程序的几种方法

首先,我们常用的容器有这么几种:

其中,LXD 与其他几个容器不太一样,是可以当成一个虚拟机来用的系统容器,里面安装和使用 systemd,SSH,GUI 程序,都没有啥大问题。这里就不再单独说了。

Singularity 容器默认就可以支持使用 GUI 程序,只需要在容器内安装好运行 GUI 程序所需的依赖即可,一般从命令行启动的时候会提示你缺少哪些库之类的,按图索骥,找到缺少的对应的包,全部装上去就能用了。不过好像用来运行一个完整的桌面不是很合适。

Podman 和 Docker 理论上是兼容的,不多说。

本文主要针对的是 Docker 容器。

本文也不对具体的方案做详细的介绍,只是指出大约有哪些方法可以考虑。

使用 x11docker

x11docker 可以帮助你运行 Docker 容器中的 GUI 程序,甚至是完整的桌面。x11docker 本身只是一个近万行的 bash 脚本,所以它的安装是非常简单的,只需要把 x11docker 文件下载,存放到 ~/bin 目录下,并将 ~/bin 加入你的 PATH 即可使用。

不过 x11docker 还是需要一些其他的依赖包,最小的依赖是你至少得在宿主机上安装 X server。不过官方建议你最好还要装上 xpra Xephyr xinit xauth xclip xhost xrandr xdpyinfo 这几个包。

更多详细的介绍请看官方文档。

使用 VNC

实际上,我们完全可以在 Docker 容器内安装完整的桌面环境,然后在里面启动 VNC 服务,最后我们通过 VNC 客户端访问到容器内的桌面环境。这种用法就比较类似于虚拟机的使用了,就好像我们有了一个完整的带桌面环境的 Linux 系统。

这种方案一般还会考虑使用 noVNC 来提供网页访问,这样用户就连 VNC 客户端都不用了,直接通过浏览器访问即可。

在桌面环境的选择上,一般首推 Xfce4,其次是 LXDE,LXQt 等桌面,GNOME 和 KDE 一般不建议使用,因为不一定能用,而且即使能用也会很麻烦。

这里给出一个完整的 Docker 例子,详见此项目

使用 xrdp

xrdp 也是一种可选的远程桌面解决方案。与 Linux 上我们常用的 VNC 不同,xrdp 使用的是开源的 RDP 协议实现。RDP 协议实际上就是 Windows 的远程桌面所使用的协议。采用此方案的优点是对 Windows 用户更加友好,这回连客户端都不需要安装了,直接使用 Windows 远程桌面去连接即可。

但是个人体验发现实际的反应速度不如 VNC 流畅,不过要是在局域网内,这就不是问题了。

使用 xpra

xpra 可以看作是 GUI 版本的 screen,自然而然的也可以用在这个场景下。xpra 还有个优点,他支持多种类型的协议,甚至可以直接用 VNC 连接。同时还有一个不错的 HTML5 客户端,可以直接让用户通过网页来访问。

总结

目前来说,

综上,个人建议宿主机有图形界面就用 x11docker,无图形界面就用 (no)VNC.