x11docker:讓你的Docker跑圖形程序

時下隨著虛擬化技術(shù)的不斷完善進(jìn)步,docker使得我們的生活變得越來越方便。但是docker一般情況下只提供了傻傻地黑白終端界面,嚇跑了很多初學(xué)者。還有很多人除了跑服務(wù)外還想跑一些圖形程序,跑個小游戲啥的。還有很多人聽說圖形界面不安全希望通過docker提供一個隔離的環(huán)境,以保障自己VPS的安全。那么有沒有什么方法可以解決這些問題呢?在偶遇x11docer之前,我都是告訴他們不要運行圖形界面,命令行終端就夠了。今天蟲蟲就給大家來介紹一個優(yōu)雅的docker GUI解決方案,那就是本文的主角x11docker。

x11docker:讓你的Docker跑圖形程序

概述

x11docker是什么?x11docker是一款允許在Docker容器中運行圖形應(yīng)APP的軟件。和虛擬機(jī)一樣Docker允許在隔離的容器環(huán)境中運行應(yīng)用程序,但是Docker更輕便,需要資源更少,可以隨用隨建,隨不用隨刪。但是Docker默認(rèn)是不提供對GUI的支持的。x11docker則解決了這個問題,它通過在主機(jī)系統(tǒng)上運行X顯示服務(wù)器,給Docker提供了了GUI的支持。

此外,x11docker對Docker和X window提供安全增強(qiáng),實現(xiàn)以容器隔離并預(yù)防X widows安全漏洞,通沙盒環(huán)境運行圖形程序,以保護(hù)主機(jī)系統(tǒng)的安全。

軟件可以安裝在可部署的Docker鏡像中,可以運行或部署由于依賴性問題而難以在多個系統(tǒng)上安裝的軟件,要處理的文件可以在主機(jī)和容器之間共享。

x11docker主要在Linux上運行,支持基于Windows WSL子系統(tǒng)在Windows上運行(部分功能受限)。注意x11docker還不支持macOS。

主要特點

著重關(guān)注安全性:

通過運行一個附加的X服務(wù)器來避免X安全漏洞。

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

容器用戶與主機(jī)用戶相同,以避免容器的root用戶。

低依賴性:

系統(tǒng)只依賴于一個X服務(wù)器和Docker,沒有其他依賴項目。

除了一些可選功能外,Docker鏡像中沒有依賴項。

使用SSH,VNC或HTML5進(jìn)行遠(yuǎn)程管理。

使用方便快捷,比如:

x11docker jess/cathode

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

x11docker:讓你的Docker跑圖形程序

可選功能:

除以上特點之外,還提供大的大量的可選功能擴(kuò)展:

持久化的共享主機(jī)文件夾和容中持久化的HOME目錄。

基于Pulseaudio和ALSA聲音功能。

基于OpenGL的硬件加速。

剪貼板共享。

通過CUPS的打印機(jī)支持。

網(wǎng)絡(luò)攝像頭支持。

本地化語言設(shè)置。

Wayland支持。

支持在容器中的啟動系統(tǒng)DBus和init,包括tini,runit,OpenRC,SysVinit和systemd。也支持elogind。

安裝使用

的安裝很簡單,只需運行一個x11docker shell腳本就會啟動安裝。

安裝選項

以root身份,可以在系統(tǒng)上安裝,更新和刪除x11docker:

x11docker --install : 在當(dāng)前目錄安裝x11docker和x11docker-gui。

x11docker --update : 從github下載并安裝最新版本。

x11docker --update-master : 從github下載并安裝最新的主版本。

x11docker --remove : 刪除x11docker安裝的所有文件。

將x11docker和x11docker-gui復(fù)制到/usr/bin。在/usr/share/icons中創(chuàng)建一個圖標(biāo)。在/usr/share/application中創(chuàng)建x11docker.desktop。將README.md,CHANGELOG.md和LICENSE.txt復(fù)制到/usr/share/doc/x11docker。

一鍵安裝

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

x11docker:讓你的Docker跑圖形程序

最小化安裝

一般情況下建議使用bash x11docker和bash x11docker-gui一起運行。但是也支持最小的安裝,對于最小化安裝,先使用chmod + x x11docker給它賦予執(zhí)行權(quán)限。再將其mv到/usr/bin即可,x11docker腳本本身之外其他文件都不是必須的。

x11docker圖形界面

x11docker-gui是x11docker的可選圖形前端。它也是從控制臺運行。x11docker-gui依賴kaptain包。可以通過各發(fā)行版的包管理工具進(jìn)行安裝。如果系統(tǒng)上未安裝kaptain,x11docker-gui使用x11docker/kaptain鏡像。

x11docker:讓你的Docker跑圖形程序

終端命令行使用

x11docker也支持在終端命令行下使用,使用方法為:x11docker IMAGENAME [COMMAND]即可。使用方法和選項通過—help可以列出。

對于圖形桌面環(huán)境,添加選項-d,--desk

在沒有X的情況下運行使用選項-t, --tty

使用選項-i, --interactive啟動交互式TTY。

運行語法

要使用新的X服務(wù)器運行Docker鏡像:

x11docker [OPTIONS] IMAGE [COMMAND]

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

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

要在新的X服務(wù)器上運行主機(jī)應(yīng)用程序:

x11docker [OPTIONS] --exe COMMAND

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

要僅運行新的空X服務(wù)器:

<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的檢查。

選項設(shè)置

X服務(wù)器選項

如果沒有專門指定X服務(wù)器選項,x11docker會根據(jù)已安裝的依賴項以及執(zhí)行的選項在—desktop,--gpu和—wayland中自動選擇一個。

在X中使用選項--xorg的提示。

使用選項-t,--tty可以無X的情況下運行。

桌面或無縫模式

x11docker默認(rèn)以無縫模式運行單個應(yīng)用程序,即常規(guī)桌面上的單個窗口。如果要在映像中運行桌面環(huán)境,請?zhí)砑舆x項--desktop。

選項--xpra和--nxagent支持無縫模式。也支持不臺安全選項--hostdisplay。

如果沒有安裝xpra和nxagent, x11docker找到了諸如Xephyr這樣的桌面X服務(wù)器,它會盡量避免使用不安全的選項--hostdisplay并使用主機(jī)窗口管理器運行Xephyr。

可以使用選項--wm = WINDOWMANAGER指定主機(jī)窗口管理器,例如--wm = openbox。

除了--hostdisplay之外的所有X服務(wù)器選項都支持帶--desktop的桌面模式。

容器中的共享文件夾和HOME

在Docker刪除后,其運行系統(tǒng)中的更改都將會丟失。對于持久數(shù)據(jù)存儲,需要和主機(jī)共享目錄:

選項-m, --home:在~/.local/share/x11docker/IMAGENAMEE中創(chuàng)建一個主機(jī)目錄,該目錄與容器共享并作為其HOME目錄掛載。容器主目錄中的文件和配置更改將保持不變。 x11docker創(chuàng)建一個從/.local/share/x11docker到/ x11docker的軟鏈接。

選項--sharedir DIR在容器中的同一位置掛載主機(jī)目錄。 --sharedir DIR:ro限制為只讀訪問權(quán)限。

選項--homedir DIR與--home類似,但允許指定用于數(shù)據(jù)存儲的主機(jī)目錄。

$HOME的特殊情況:

請注意,如果HOME為空,x11docker將容器中的/etc /skel文件復(fù)制到HOME。這允許提供定制的用戶設(shè)置。

硬件加速

使用選項-g,--gpu可以實現(xiàn)OpenGL的硬件加速。

在大多數(shù)情況下,在主機(jī)上使用開源驅(qū)動程序時,該功能開箱可用。

封閉源NVIDIA驅(qū)動程序需要一些設(shè)置并支持更少的x11docker X服務(wù)器選項。

剪貼板

使用選項-c,--clipboard可以實現(xiàn)剪貼板共享。

可以使用--xpra和--hostdisplay進(jìn)行圖像剪輯。

某些X服務(wù)器選項需要依賴主機(jī)上的xclip包。

聲音

選項-p,--pulaudio和--alsa可以共享聲音。

對于--pulseaudio聲音,需要在主機(jī)和圖像中使用pulseaudio。

對于--alsa的ALSA聲音,可能需要指定聲卡,例如:--alsa=Generic??梢酝ㄟ^-l獲得可用聲卡列表。為了支持dmix這樣的虛擬ALSA設(shè)備,鏡像需要依賴ALSA庫,例如debian圖像中的libasound2。

攝像頭

主機(jī)上的網(wǎng)絡(luò)攝像頭可以通過選項--webcam共享。

如果圖像中的網(wǎng)絡(luò)攝像頭應(yīng)用程序失敗,需要在鏡像中安裝mesa-utils(debian)或mesa-demos(arch)。

guvcview需要--pulseaudio或--alsa。

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

打印機(jī)

打印機(jī)通過選項—printer對主機(jī)打印機(jī)共享。

需要主機(jī)上的CUPS,大多數(shù)Linux默認(rèn)支持CUPS打印機(jī)服務(wù)器。

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

本地化語言

x11docker本地化語言設(shè)置,提供專門選項--lang。

不帶參數(shù)的--lang將容器中的LANG設(shè)置為與主機(jī)上的LANG相同。與--lang = $LANG相同

如果鏡像中已存在所需的區(qū)域語言的設(shè)置并啟用它,x11docker將檢查容器并啟動。

如果x11docker找不到相應(yīng)區(qū)域語言的設(shè)置,則會在容器啟動時創(chuàng)建它。比如:

--lang = de代表德語, --lang = zh_CN代表中文, --lang = ru代表俄語, --lang = $LANG代表和你宿主服務(wù)語言環(huán)境一致。

為了支持中文,日文和韓文等東亞字符,需要在鏡像中中安裝類似字體,比如fonts-arphic-uming。

Wayland

要運行Wayland而不是X服務(wù)器x11docker提供選項--wayland, -- weston, --kwin和--hostwayland。

選項--wayland自動設(shè)置Wayland環(huán)境以及一些相關(guān)的環(huán)境變量。

選項--kwin和--weston運行Wayland合成器kwin_wayland或weston。

如果未指定該選項,--wayland添加選項--dbus和--env QT_QPA_PLATFORM = wayland。

選項--hostwayland可以在主機(jī)Wayland桌面上運行單個應(yīng)用程序,如Gnome 3,KDE 5和Sway。比如:在Wayland上的xfce4-terminal:

x11docker --wayland x11docker/xfce xfce4-termina

啟動系統(tǒng)

x11docker支持多個啟動系統(tǒng)作為容器中的PID 1,并提供選項--init。容器中的啟動解決了Docker僵尸進(jìn)程回收的問題。默認(rèn)情況下,它在/usr/bin/docker-init中使用tini。還支持tini,systemd,SysVinit,runit,OpenRC和elogind。

DBus

某些桌面環(huán)境和應(yīng)用程序需要運行DBus守護(hù)程序和DBus用戶會話。使用--dbus運行DBus用戶會話守護(hù)程序。使用--dbus-system運行DBus系統(tǒng)守護(hù)程序。

如果啟動失敗或大約需要90秒,請安裝init系統(tǒng)并使用該系統(tǒng)運行DBus。例如。在image中安裝systemd并使用--init = systemd運行。

使用--hostdbus連接到主機(jī)DBus用戶會話。

使用--sharedir/run/dbus/system_bus_socket共享主機(jī)DBus系統(tǒng)套接字。

DBus使用init systems systemd,openrc,runit和sysvinit(選項--init)自動啟動。

依賴

x11docker可以使用標(biāo)準(zhǔn)系統(tǒng)實用程序運行,而無需對主機(jī)或映像進(jìn)行額外依賴。作為核心程序只需要一個X服務(wù)器,還有在X上運行Docker容器。x11docker在啟動時檢查所選選項的依賴關(guān)系,并顯示終端消息。

在主機(jī)上安裝xpra Xephyr weston Xwayland xdotool xauth xclip xrandr xdpyinfo,或保持不變。

X服務(wù)器依賴

對x服務(wù)器依賴包情況詳見下表:

x11docker:讓你的Docker跑圖形程序

注意,只有選項--hostdisplay和--xorg才能使用專有的NVIDIA驅(qū)動程序支持-gpu。

功能選項依賴

各個附加功能的依賴詳見下表:

x11docker:讓你的Docker跑圖形程序

安全

x11docker的范圍是運行容器化GUI應(yīng)用程序,同時保留和改進(jìn)容器隔離。主要的安全改進(jìn)包括:

單獨的X服務(wù)器

x11docker通過運行單獨的X服務(wù)器以避免X安全漏洞。

一般解決方案是通過享顯示器的主機(jī)X套接字:0,但是這樣一來會破壞容器的隔離性,允許鍵盤記錄和遠(yuǎn)程主機(jī)控制。 (為了兼容x11docker也提供了不太安全的對這種方案的支持,該選項為 --hostdisplay)。

使用MIT-MAGIC-COOKIE進(jìn)行身份驗證,與文件~/.Xauthority分開存儲。

容器用戶系統(tǒng)

x11docker通創(chuàng)建與主機(jī)用戶類似的容器用戶,以避免容器中的root用戶。

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

禁用可能的root密碼并刪除/etc/sudoers中的條目。

如果想在容器中使用root權(quán)限,請使用選項--sudouser,它在x11docker中使用su和sudo使用密碼。還可以使用--user = root運行。

o如果要使用圖像中指定的USER,請設(shè)置選項--user = RETAIN。在這種情況下,x11docker不會更改etc / passwd或/ etc / sudoers。選項 - 家庭將無法使用。

將容器權(quán)限降至最低

設(shè)置docker運行選項--cap-drop = ALL --security-opt = no-new-privileges。

可以使用x11docker選項--cap-default禁用此限制,或使用--sudouser減少此限制。

容器隔離降低選項

如果選擇的選項降低了容器隔離,x11docker會在終端中顯示警告消息。請注意,x11docker不會檢查自定義DOCKER_RUN_OPTIONS。

最重要的:

--hostdisplay共享顯示的主機(jī)X套接字:0而不是運行第二個X服務(wù)器。

提供所謂的不受信任的cookie會減少濫用的危險,但不要依賴于此。

如果另外使用--gpu或--clipboard,則會啟用選項--hostipc和受信任的cookie,并且不會保留針對X安全漏洞的保護(hù)。

如果你不關(guān)心容器隔離,x11docker –hostdisplay。

--gpu允許訪問GPU硬件。這可能會被濫用來從主機(jī)(palinopsia bug)獲取窗口內(nèi)容并使GPU rootkit成為可能。

--pulseaudio和--alsa允許從主機(jī)捕獲音頻輸出和麥克風(fēng)輸入。

還有相當(dāng)特殊的選項可降低安全性,但不需要經(jīng)常使用:

--sudouser允許在x11dockerfor容器中通過su和sudo。如果應(yīng)用程序以某種方式突破容器,則可能會損害到主機(jī)系統(tǒng)。

--cap-default禁用x11docker的容器安全性加固,并回退到默認(rèn)的Docker容器功能。

  • dbus-system,--init = systemd | sysvinit | openrc | runit允許x11docker丟棄的某些容器功能。

--init = systemd也共享對/sys/fs/cgroup的訪問權(quán)限。某些進(jìn)程將在容器中以root身份運行。

--hostipc設(shè)置docker run選項--ipc = host。 (允許MIT-SHM /共享內(nèi)存。禁用IPC命名空間。)

--hostnet設(shè)置docker run選項--net = host。 (共享主機(jī)網(wǎng)絡(luò)堆棧。禁用網(wǎng)絡(luò)命名空間。容器可以監(jiān)視網(wǎng)絡(luò)流量。)

可能風(fēng)險點:

對于x11docker容器,可能的SELinux限制因使用docker run選項--security-opt label = type:container_runtime_t而降級,以允許訪問新的X unix套接字。

禁用用戶名稱空間重新映射以允許選項--home和--homedir,而不會出現(xiàn)文件所有權(quán)問題。例外:未對--user = RETAIN禁用用戶名稱空間重新映射。

x11docker提供了幾種不同的X服務(wù)器選項。涉及的每個X服務(wù)器可能都有其各自的漏洞。 x11docker僅涵蓋X11協(xié)議產(chǎn)生的眾所周知的X安全漏洞。

沙盒系統(tǒng)

x11docker通過對docker增強(qiáng)容器隔離,并允許使用容器作為沙箱,可以很好地保護(hù)主機(jī)系統(tǒng)免受惡意軟件攻擊或軟件故障導(dǎo)致的問題。沙盒一方面可以用于安全隔離環(huán)境運行軟件,也可以作為:

兼容性環(huán)境,用于運行由于依賴性問題而難以在主機(jī)上安裝的軟件。

開發(fā)環(huán)境,用于收集庫,編譯器等以保持主機(jī)潔凈。

開發(fā)環(huán)境,以減輕意外/錯誤行為造成的損害。

軟件安全層,在最壞的情況下,運行一些可能是惡意的軟件。比如,啟用了Javascript的Internet瀏覽器或帶有Windows應(yīng)用程序的wine。

x11docker已經(jīng)限制了進(jìn)程功能。還可以通過選項--limit限制對CPU和RAM的訪問。默認(rèn)情況下--limit限制為可用CPU的50%和當(dāng)前空閑RAM的50%??梢允褂?-limit = FACTOR指定另一個量,其中FACTOR大于零且小于或等于1。

注意:默認(rèn)情況下允許Internet訪問。可以使用--no-internet禁用聯(lián)網(wǎng)。

MS Windows下運行

x11docker在通過MSYS2,Cygwin和WSL在MS Windows上運行。雖然它可以支持大部分的功能,但由于系統(tǒng)限制,Linux上可用的一些功能,并且不能保證在windows下可靠:

在Windows上將X服務(wù)器VcXsrv安裝到C/Program Files/VcXsrv(選項--vcxsrv)。

替代方案:Cygwin提供X服務(wù)器Xwin(選項--xwin)。在Cygwin中安裝xinit包。只能在Cygwin中使用。

對于聲音選項--pulseaudio在C:/cygwin64中安裝帶有pulseaudio包的Cygwin。它也適用于MSYS2和WSL。

諸如如"./x11docker: line 2: $' ': command not found" 的錯誤消息表示不同換行系統(tǒng)導(dǎo)致的錯誤,需要運行dos2unix x11docker

并非所有x11docker選項都在MS Windows上實現(xiàn)。例如。 --webcam和--printer不起作用。

windows中的防火墻設(shè)置可能會導(dǎo)致訪問X服務(wù)器的容器應(yīng)用程序出現(xiàn)問題。

故障排除

要進(jìn)行故障排除,請在終端中運行x11docker或x11docker-gui。

如果某些內(nèi)容不安全,丟失或出錯,x11docker會顯示警告。

使用選項-v,--verbose查看完整的日志文件輸出。

?選項-D,--debug提供較少詳細(xì)的輸出。

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

某些應(yīng)用程序失敗并帶有后備選項--hostdisplay。添加--clipboard以禁用某些安全限制。如果這不能解決問題,請安裝其他X服務(wù)器。

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

鏡像可能具有USER規(guī)范,并且是為該用戶設(shè)計的。 x11docker設(shè)置容器用戶,該用戶可能與用戶設(shè)置的不匹配。

使用docker inspect -format'{{.Config.User}}'IMAGENAME檢查鏡像中的USER規(guī)范。

如果是,請嘗試使用--user = RETAIN以在鏡像中指定USER運行。

某些應(yīng)用程序需要比x11docker默認(rèn)提供的更多權(quán)限或功能。

減少容器隔離,例如:

?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可以解決問題,則應(yīng)用程序可能需要/dev中的設(shè)備。找出具體的設(shè)備并與之分享,方法為:--device /dev/snd。還可以嘗試--sharedir /dev/udev/data:ro。

不要使用--privileged作為解決方案。它允許過多訪問主機(jī)會嚴(yán)重破壞容器隔離。調(diào)查容器確實需要的權(quán)限。

可以使用--user = root以root身份運行容器應(yīng)用程序。

一些應(yīng)用程序需要DBus。在鏡像中安裝dbus并嘗試選項--dbus。如果還不行,可以嘗試選項--dbus-system。

一些應(yīng)用程序需要systemd。在鏡像中安裝systemd并嘗試選項--init = systemd。

實例展示

x11docker的一些實例見下表,列出了通過x11docker運行的一些界面程序,所有的實例鏡像都可以在docker hub上找到。

應(yīng)用程序

x11docker:讓你的Docker跑圖形程序

桌面環(huán)境

x11docker:讓你的Docker跑圖形程序

按需定制鏡像

對于系統(tǒng)鏡像會持續(xù)更新,調(diào)整你的Dockerfile并重建??梢宰远x添加一些應(yīng)用程序到x11docker示例鏡像中,并它們創(chuàng)建新的Dockerfile。比如:

xfce desktop with VLC media player

FROM x11docker/xfce

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

系統(tǒng)截圖

最后我們展示一些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跑圖形程序
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容