x11docker:让你的Docker跑图形程序

时下随着虚拟化技术的不断完善进步,docker使得我们的生活变得越来越方便。但是docker一般情况下只提供了傻傻地黑白终端界面,吓跑了很多初学者。还有很多人除了跑服务外还想跑一些图形程序,跑个小游戏啥的。还有很多人听说图形界面不安全希望通过docker提供一个隔离的环境,以保障自己VPS的安全。那么有没有什么方法可以解决这些问题呢?在偶遇x11docer之前,我都是告诉他们不要运行图形界面,命令行终端就够了。今天虫虫就给大家来介绍一个优雅的docker GUI解决方案,那就是本文的主角x11docker。

x11docker:让你的Docker跑图形程序

概述

x11docker是什么?x11docker是一款允许在Docker容器中运行图形应APP的软件。和虚拟机一样Docker允许在隔离的容器环境中运行应用程序,但是Docker更轻便,需要资源更少,可以随用随建,随不用随删。但是Docker默认是不提供对GUI的支持的。x11docker则解决了这个问题,它通过在主机系统上运行X显示服务器,给Docker提供了了GUI的支持。

此外,x11docker对Docker和X window提供安全增强,实现以容器隔离并预防X widows安全漏洞,通沙盒环境运行图形程序,以保护主机系统的安全。

软件可以安装在可部署的Docker镜像中,可以运行或部署由于依赖性问题而难以在多个系统上安装的软件,要处理的文件可以在主机和容器之间共享。

x11docker主要在Linux上运行,支持基于Windows WSL子系统在Windows上运行(部分功能受限)。注意x11docker还不支持macOS。

主要特点

着重关注安全性:

通过运行一个附加的X服务器来避免X安全漏洞。

将容器功能被限制到最小化。

容器用户与主机用户相同,以避免容器的root用户。

低依赖性:

系统只依赖于一个X服务器和Docker,没有其他依赖项目。

除了一些可选功能外,Docker镜像中没有依赖项。

使用SSH,VNC或HTML5进行远程管理。

使用方便快捷,比如:

x11docker jess/cathode

x11docker --desktop --size 320x240 x11docker/lxde(需要嵌套的X服务器Xephyr)

x11docker:让你的Docker跑图形程序

可选功能:

除以上特点之外,还提供大的大量的可选功能扩展:

持久化的共享主机文件夹和容中持久化的HOME目录。

基于Pulseaudio和ALSA声音功能。

基于OpenGL的硬件加速。

剪贴板共享。

通过CUPS的打印机支持。

网络摄像头支持。

本地化语言设置。

Wayland支持。

支持在容器中的启动系统DBus和init,包括tini,runit,OpenRC,SysVinit和systemd。也支持elogind。

安装使用

的安装很简单,只需运行一个x11docker shell脚本就会启动安装。

安装选项

以root身份,可以在系统上安装,更新和删除x11docker:

x11docker --install : 在当前目录安装x11docker和x11docker-gui。

x11docker --update : 从github下载并安装最新版本。

x11docker --update-master : 从github下载并安装最新的主版本。

x11docker --remove : 删除x11docker安装的所有文件。

将x11docker和x11docker-gui复制到/usr/bin。在/usr/share/icons中创建一个图标。在/usr/share/application中创建x11docker.desktop。将README.md,CHANGELOG.md和LICENSE.txt复制到/usr/share/doc/x11docker。

一键安装

运行以下命令即可,如果没有用到sudo,去掉sudo部分即可。

x11docker:让你的Docker跑图形程序

最小化安装

一般情况下建议使用bash x11docker和bash x11docker-gui一起运行。但是也支持最小的安装,对于最小化安装,先使用chmod + x x11docker给它赋予执行权限。再将其mv到/usr/bin即可,x11docker脚本本身之外其他文件都不是必须的。

x11docker图形界面

x11docker-gui是x11docker的可选图形前端。它也是从控制台运行。x11docker-gui依赖kaptain包。可以通过各发行版的包管理工具进行安装。如果系统上未安装kaptain,x11docker-gui使用x11docker/kaptain镜像。

x11docker:让你的Docker跑图形程序

终端命令行使用

x11docker也支持在终端命令行下使用,使用方法为:x11docker IMAGENAME [COMMAND]即可。使用方法和选项通过—help可以列出。

对于图形桌面环境,添加选项-d,--desk

在没有X的情况下运行使用选项-t, --tty

使用选项-i, --interactive启动交互式TTY。

运行语法

要使用新的X服务器运行Docker镜像:

x11docker [OPTIONS] IMAGE [COMMAND]

x11docker [OPTIONS] -- IMAGE [COMMAND [ARG1 ARG2 ...]]

x11docker [OPTIONS] -- DOCKER_RUN_OPTIONS -- IMAGE [COMMAND [ARG1 ARG2 ...]]

要在新的X服务器上运行主机应用程序:

x11docker [OPTIONS] --exe COMMAND

x11docker [OPTIONS] --exe -- COMMAND [ARG1 ARG2 ...]

要仅运行新的空X服务器:

 x11docker [OPTIONS] --xonly

注意:DOCKER_RUN_OPTIONS只是添加到docker run命令而没有x11docker的检查。

选项设置

X服务器选项

如果没有专门指定X服务器选项,x11docker会根据已安装的依赖项以及执行的选项在—desktop,--gpu和—wayland中自动选择一个。

在X中使用选项--xorg的提示。

使用选项-t,--tty可以无X的情况下运行。

桌面或无缝模式

x11docker默认以无缝模式运行单个应用程序,即常规桌面上的单个窗口。如果要在映像中运行桌面环境,请添加选项--desktop。

选项--xpra和--nxagent支持无缝模式。也支持不台安全选项--hostdisplay。

如果没有安装xpra和nxagent, x11docker找到了诸如Xephyr这样的桌面X服务器,它会尽量避免使用不安全的选项--hostdisplay并使用主机窗口管理器运行Xephyr。

可以使用选项--wm = WINDOWMANAGER指定主机窗口管理器,例如--wm = openbox。

除了--hostdisplay之外的所有X服务器选项都支持带--desktop的桌面模式。

容器中的共享文件夹和HOME

在Docker删除后,其运行系统中的更改都将会丢失。对于持久数据存储,需要和主机共享目录:

选项-m, --home:在~/.local/share/x11docker/IMAGENAMEE中创建一个主机目录,该目录与容器共享并作为其HOME目录挂载。容器主目录中的文件和配置更改将保持不变。 x11docker创建一个从/.local/share/x11docker到/ x11docker的软链接。

选项--sharedir DIR在容器中的同一位置挂载主机目录。 --sharedir DIR:ro限制为只读访问权限。

选项--homedir DIR与--home类似,但允许指定用于数据存储的主机目录。

$HOME的特殊情况:

请注意,如果HOME为空,x11docker将容器中的/etc /skel文件复制到HOME。这允许提供定制的用户设置。

硬件加速

使用选项-g,--gpu可以实现OpenGL的硬件加速。

在大多数情况下,在主机上使用开源驱动程序时,该功能开箱可用。

封闭源NVIDIA驱动程序需要一些设置并支持更少的x11docker X服务器选项。

剪贴板

使用选项-c,--clipboard可以实现剪贴板共享。

可以使用--xpra和--hostdisplay进行图像剪辑。

某些X服务器选项需要依赖主机上的xclip包。

声音

选项-p,--pulaudio和--alsa可以共享声音。

对于--pulseaudio声音,需要在主机和图像中使用pulseaudio。

对于--alsa的ALSA声音,可能需要指定声卡,例如:--alsa=Generic。可以通过-l获得可用声卡列表。为了支持dmix这样的虚拟ALSA设备,镜像需要依赖ALSA库,例如debian图像中的libasound2。

摄像头

主机上的网络摄像头可以通过选项--webcam共享。

如果图像中的网络摄像头应用程序失败,需要在镜像中安装mesa-utils(debian)或mesa-demos(arch)。

guvcview需要--pulseaudio或--alsa。

chees和gnome-ring需要依赖--init = systemd或--dbus-system。

打印机

打印机通过选项—printer对主机打印机共享。

需要主机上的CUPS,大多数Linux默认支持CUPS打印机服务器。

容器需要依赖libcups2(debian)或libcups(arch)包。

本地化语言

x11docker本地化语言设置,提供专门选项--lang。

不带参数的--lang将容器中的LANG设置为与主机上的LANG相同。与--lang = $LANG相同

如果镜像中已存在所需的区域语言的设置并启用它,x11docker将检查容器并启动。

如果x11docker找不到相应区域语言的设置,则会在容器启动时创建它。比如:

--lang = de代表德语, --lang = zh_CN代表中文, --lang = ru代表俄语, --lang = $LANG代表和你宿主服务语言环境一致。

为了支持中文,日文和韩文等东亚字符,需要在镜像中中安装类似字体,比如fonts-arphic-uming。

Wayland

要运行Wayland而不是X服务器x11docker提供选项--wayland, -- weston, --kwin和--hostwayland。

选项--wayland自动设置Wayland环境以及一些相关的环境变量。

选项--kwin和--weston运行Wayland合成器kwin_wayland或weston。

如果未指定该选项,--wayland添加选项--dbus和--env QT_QPA_PLATFORM = wayland。

选项--hostwayland可以在主机Wayland桌面上运行单个应用程序,如Gnome 3,KDE 5和Sway。比如:在Wayland上的xfce4-terminal:

x11docker --wayland x11docker/xfce xfce4-termina

启动系统

x11docker支持多个启动系统作为容器中的PID 1,并提供选项--init。容器中的启动解决了Docker僵尸进程回收的问题。默认情况下,它在/usr/bin/docker-init中使用tini。还支持tini,systemd,SysVinit,runit,OpenRC和elogind。

DBus

某些桌面环境和应用程序需要运行DBus守护程序和DBus用户会话。使用--dbus运行DBus用户会话守护程序。使用--dbus-system运行DBus系统守护程序。

如果启动失败或大约需要90秒,请安装init系统并使用该系统运行DBus。例如。在image中安装systemd并使用--init = systemd运行。

使用--hostdbus连接到主机DBus用户会话。

使用--sharedir/run/dbus/system_bus_socket共享主机DBus系统套接字。

DBus使用init systems systemd,openrc,runit和sysvinit(选项--init)自动启动。

依赖

x11docker可以使用标准系统实用程序运行,而无需对主机或映像进行额外依赖。作为核心程序只需要一个X服务器,还有在X上运行Docker容器。x11docker在启动时检查所选选项的依赖关系,并显示终端消息。

在主机上安装xpra Xephyr weston Xwayland xdotool xauth xclip xrandr xdpyinfo,或保持不变。

X服务器依赖

对x服务器依赖包情况详见下表:

x11docker:让你的Docker跑图形程序

注意,只有选项--hostdisplay和--xorg才能使用专有的NVIDIA驱动程序支持-gpu。

功能选项依赖

各个附加功能的依赖详见下表:

x11docker:让你的Docker跑图形程序

安全

x11docker的范围是运行容器化GUI应用程序,同时保留和改进容器隔离。主要的安全改进包括:

单独的X服务器

x11docker通过运行单独的X服务器以避免X安全漏洞。

一般解决方案是通过享显示器的主机X套接字:0,但是这样一来会破坏容器的隔离性,允许键盘记录和远程主机控制。 (为了兼容x11docker也提供了不太安全的对这种方案的支持,该选项为 --hostdisplay)。

使用MIT-MAGIC-COOKIE进行身份验证,与文件~/.Xauthority分开存储。

容器用户系统

x11docker通创建与主机用户类似的容器用户,以避免容器中的root用户。

可以使用--user = USERID指定另一个用户或使用--user = UID:GID指定不存在的用户。

禁用可能的root密码并删除/etc/sudoers中的条目。

如果想在容器中使用root权限,请使用选项--sudouser,它在x11docker中使用su和sudo使用密码。还可以使用--user = root运行。

o如果要使用图像中指定的USER,请设置选项--user = RETAIN。在这种情况下,x11docker不会更改etc / passwd或/ etc / sudoers。选项 - 家庭将无法使用。

将容器权限降至最低

设置docker运行选项--cap-drop = ALL --security-opt = no-new-privileges。

可以使用x11docker选项--cap-default禁用此限制,或使用--sudouser减少此限制。

容器隔离降低选项

如果选择的选项降低了容器隔离,x11docker会在终端中显示警告消息。请注意,x11docker不会检查自定义DOCKER_RUN_OPTIONS。

最重要的:

--hostdisplay共享显示的主机X套接字:0而不是运行第二个X服务器。

提供所谓的不受信任的cookie会减少滥用的危险,但不要依赖于此。

如果另外使用--gpu或--clipboard,则会启用选项--hostipc和受信任的cookie,并且不会保留针对X安全漏洞的保护。

如果你不关心容器隔离,x11docker –hostdisplay。

--gpu允许访问GPU硬件。这可能会被滥用来从主机(palinopsia bug)获取窗口内容并使GPU rootkit成为可能。

--pulseaudio和--alsa允许从主机捕获音频输出和麦克风输入。

还有相当特殊的选项可降低安全性,但不需要经常使用:

--sudouser允许在x11dockerfor容器中通过su和sudo。如果应用程序以某种方式突破容器,则可能会损害到主机系统。

--cap-default禁用x11docker的容器安全性加固,并回退到默认的Docker容器功能。

  • dbus-system,--init = systemd | sysvinit | openrc | runit允许x11docker丢弃的某些容器功能。

--init = systemd也共享对/sys/fs/cgroup的访问权限。某些进程将在容器中以root身份运行。

--hostipc设置docker run选项--ipc = host。 (允许MIT-SHM /共享内存。禁用IPC命名空间。)

--hostnet设置docker run选项--net = host。 (共享主机网络堆栈。禁用网络命名空间。容器可以监视网络流量。)

可能风险点:

对于x11docker容器,可能的SELinux限制因使用docker run选项--security-opt label = type:container_runtime_t而降级,以允许访问新的X unix套接字。

禁用用户名称空间重新映射以允许选项--home和--homedir,而不会出现文件所有权问题。例外:未对--user = RETAIN禁用用户名称空间重新映射。

x11docker提供了几种不同的X服务器选项。涉及的每个X服务器可能都有其各自的漏洞。 x11docker仅涵盖X11协议产生的众所周知的X安全漏洞。

沙盒系统

x11docker通过对docker增强容器隔离,并允许使用容器作为沙箱,可以很好地保护主机系统免受恶意软件攻击或软件故障导致的问题。沙盒一方面可以用于安全隔离环境运行软件,也可以作为:

兼容性环境,用于运行由于依赖性问题而难以在主机上安装的软件。

开发环境,用于收集库,编译器等以保持主机洁净。

开发环境,以减轻意外/错误行为造成的损害。

软件安全层,在最坏的情况下,运行一些可能是恶意的软件。比如,启用了Javascript的Internet浏览器或带有Windows应用程序的wine。

x11docker已经限制了进程功能。还可以通过选项--limit限制对CPU和RAM的访问。默认情况下--limit限制为可用CPU的50%和当前空闲RAM的50%。可以使用--limit = FACTOR指定另一个量,其中FACTOR大于零且小于或等于1。

注意:默认情况下允许Internet访问。可以使用--no-internet禁用联网。

MS Windows下运行

x11docker在通过MSYS2,Cygwin和WSL在MS Windows上运行。虽然它可以支持大部分的功能,但由于系统限制,Linux上可用的一些功能,并且不能保证在windows下可靠:

在Windows上将X服务器VcXsrv安装到C/Program Files/VcXsrv(选项--vcxsrv)。

替代方案:Cygwin提供X服务器Xwin(选项--xwin)。在Cygwin中安装xinit包。只能在Cygwin中使用。

对于声音选项--pulseaudio在C:/cygwin64中安装带有pulseaudio包的Cygwin。它也适用于MSYS2和WSL。

诸如如"./x11docker: line 2: $' ': command not found" 的错误消息表示不同换行系统导致的错误,需要运行dos2unix x11docker

并非所有x11docker选项都在MS Windows上实现。例如。 --webcam和--printer不起作用。

windows中的防火墙设置可能会导致访问X服务器的容器应用程序出现问题。

故障排除

要进行故障排除,请在终端中运行x11docker或x11docker-gui。

如果某些内容不安全,丢失或出错,x11docker会显示警告。

使用选项-v,--verbose查看完整的日志文件输出。

选项-D,--debug提供较少详细的输出。

可以在~/.cache/x11docker/x11docker.log中找到最新的日志文件。

某些应用程序失败并带有后备选项--hostdisplay。添加--clipboard以禁用某些安全限制。如果这不能解决问题,请安装其他X服务器。

确保x11docker版本与x11docker --update(最新版本)或x11docker --update-master(最新版本)保持同步。

镜像可能具有USER规范,并且是为该用户设计的。 x11docker设置容器用户,该用户可能与用户设置的不匹配。

使用docker inspect -format'{{.Config.User}}'IMAGENAME检查镜像中的USER规范。

如果是,请尝试使用--user = RETAIN以在镜像中指定USER运行。

某些应用程序需要比x11docker默认提供的更多权限或功能。

减少容器隔离,例如:

x11docker选项:--cap-default --hostipc --hostnet --sys-admin。

docker运行选项:--cap-add ALL --security-opt seccomp = unconfined --privileged

例如:x11docker --cap-default --hostipc --hostnet --sys-admin - --cap-add ALL --security-opt seccomp = unconfined --privileged - IMAGENAME

尝试减少容器隔离。如果有效,请逐个删除选项,直到剩下所需的选项。

如果--cap-add ALL可以解决,再查找真正需要的功能并仅添加该功能。

如果—privileged可以解决问题,则应用程序可能需要/dev中的设备。找出具体的设备并与之分享,方法为:--device /dev/snd。还可以尝试--sharedir /dev/udev/data:ro。

不要使用--privileged作为解决方案。它允许过多访问主机会严重破坏容器隔离。调查容器确实需要的权限。

可以使用--user = root以root身份运行容器应用程序。

一些应用程序需要DBus。在镜像中安装dbus并尝试选项--dbus。如果还不行,可以尝试选项--dbus-system。

一些应用程序需要systemd。在镜像中安装systemd并尝试选项--init = systemd。

实例展示

x11docker的一些实例见下表,列出了通过x11docker运行的一些界面程序,所有的实例镜像都可以在docker hub上找到。

应用程序

x11docker:让你的Docker跑图形程序

桌面环境

x11docker:让你的Docker跑图形程序

按需定制镜像

对于系统镜像会持续更新,调整你的Dockerfile并重建。可以自定义添加一些应用程序到x11docker示例镜像中,并它们创建新的Dockerfile。比如:

xfce desktop with VLC media player

FROM x11docker/xfce

RUN apt-get update && apt-get install -y vlc

系统截图

最后我们展示一些x11docker运行的截图,以馈读者:

x11docker --desktop x11docker/lxqt

x11docker:让你的Docker跑图形程序

深度桌面

x11docker --desktop --gpu --systemd --pulseaudio x11docker/deepin

x11docker:让你的Docker跑图形程序

3D plasma

x11docker --desktop --gpu x11docker/plasma

x11docker:让你的Docker跑图形程序

你可能感兴趣的:(x11docker:让你的Docker跑图形程序)