時下隨著虛擬化技術(shù)的不斷完善進(jìn)步,docker使得我們的生活變得越來越方便。但是docker一般情況下只提供了傻傻地黑白終端界面,嚇跑了很多初學(xué)者。還有很多人除了跑服務(wù)外還想跑一些圖形程序,跑個小游戲啥的。還有很多人聽說圖形界面不安全希望通過docker提供一個隔離的環(huán)境,以保障自己VPS的安全。那么有沒有什么方法可以解決這些問題呢?在偶遇x11docer之前,我都是告訴他們不要運行圖形界面,命令行終端就夠了。今天蟲蟲就給大家來介紹一個優(yōu)雅的docker GUI解決方案,那就是本文的主角x11docker。
概述
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)
可選功能:
除以上特點之外,還提供大的大量的可選功能擴(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部分即可。
最小化安裝
一般情況下建議使用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也支持在終端命令行下使用,使用方法為: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ù)器依賴包情況詳見下表:
注意,只有選項--hostdisplay和--xorg才能使用專有的NVIDIA驅(qū)動程序支持-gpu。
功能選項依賴
各個附加功能的依賴詳見下表:
安全
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)用程序
桌面環(huán)境
按需定制鏡像
對于系統(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 --desktop --gpu --systemd --pulseaudio x11docker/deepin
3D plasma
x11docker --desktop --gpu x11docker/plasma