时下随着虚拟化技术的不断完善进步,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服务器:
<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232);"> x11docker [OPTIONS] --xonly
</pre>
注意: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跑图形程序
网友评论