Docker運行帶UI界面的應用,并將它的界面投射到你的Windows電腦
困難:docker運行帶UI界面的App

平時我們用Kubernetes或者docker運行的App,都是后臺類的,比如Web-Server,或者計算任務。App自己并不需要打開窗口,大都是接受請求,然后按要求進行計算,最后返回結果這樣。
但是假設你要跑一個有UI界面的App時,比如常見的QT類應用,就會遇到報錯:
docker run -it sshipway/xclock
Error: Can't open display:
搜索結果一般告訴你,這是由于DISPLAY變量沒有設置。于是我們得了解下,DISPLAY變量的作用。
X11窗口顯示規范
X11是一種操作系統UI界面的顯示規范,最初是1984年麻省理工學院的研究,之后變成UNIX、類UNIX、以及OpenVMS等操作系統所一致適用的標準化軟件工具包及顯示架構的運作協議。
所以,目前各種App的界面,都是使用X11規范來顯示圖形化的。
其中X11協議,由X Server來實現,即你的App連上X Server服務器就行了(當然了,X Server也有權限控制,不是誰都可以“隔空投屏”的)。
具體參考:https://en.wikipedia.org/wiki/X_Window_System
所以Docker跑帶界面的App報錯,意思為:沒有指定X Server在哪里。
Linux系統中DISPLAY變量是干嘛的?
在Linux/Unix類操作系統上,界面顯示都使用X11規范。
DISPLAY變量是用來設置將圖形顯示到何處的。(即你的目標 X Server 在哪里)。
如果你登錄的Linux是帶UI界面的,那么這個值一般為“:0.0”
如果你登錄的Linux沒有UI的話,比如SSH到一臺Ubuntu的VM里,那么這個值很可能就是空的。
DISPLAY 環境變量格式如下 host:NumA.NumB
host是指投射至哪臺主機。如果為本機,則host為空。其他主機,則填對應ip
NumA:
本機時,代表unix socket的路徑, 如果為0, 則表示連接到/tmp/.X11-unix/X0 .
遠端時,表示端口減去6000的值, 假設NumA為0, 則表示連接到6000端口。
NumB:一般都是0
詳情可以參考:https://zhuanlan.zhihu.com/p/93165237
容器App,投射界面至容器所在的Host
根據上面的背景知識。我們知道,想投射界面至本機Host上面,那么需要在容器里面將DISPLAY變量=“Host的DISPLAY變量”。同時,還要將unix socket文件,掛載到容器里面。
即:docker run 參數里面要帶上以下2個參數
-v /tmp/.X11-unix:/tmp/.X11-unix??????? #共享本地unix端口
-e DISPLAY=$DISPLAY ?????????????????????#修改環境變量DISPLAY
同時,在主機上面,應該將 X Server的權限打開:
xhost +
這樣,你的容器應該就可以啟動了。
(由于我沒有帶界面的Linux系統,所實際效果暫無截圖)
可參考:https://www.youtube.com/watch?v=cMsIT2otEjA
容器App,投射界面至你的Windows系統
想投射界面至遠程Windows系統上面,一樣的道理,首先咱們先在Windows上面安裝 X11Server。
需要在容器里面將DISPLAY變量=“目標IP:0.0”。具體NumA是幾,要看你自己的配置情況,一般情況是0。這樣容器App,就會“隔空投屏”到你的Windows電腦上面了。
安裝X11 Server
咱們的Windows主機上面要安裝X Server軟件,這里推薦2個:
(1)VcXsrv Windows X Server
https://sourceforge.net/projects/vcxsrv/files/vcxsrv/
最新版本的,安裝有報錯。最后我選了 vcxsrv-64.1.20.1.4.installer 這個版本是好用的。
一路默認就行,最后一步這里有2個地方小注意:
權限控制,記得打鉤。 即允許別人遠程投屏。
有些App自帶的圖像lib庫太老,不認識X Server。(app啟動報錯:
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
)
這種情況,啟動咱們的X Server時,需設置好兼容模式(即上圖第2條)。所以我們可以給Windows系統加了條環境變量,如下圖:
(2)MobaXterm
這個啟動后,X Server默認就啟動了。所以不需要太多配置。
Setting里面可以關注下權限等配置。
啟動咱們的帶UI的容器App
這里選擇一個“時鐘顯示”的示例App
docker pull sshipway/xclock
docker run -e DISPLAY=10.173.103.40:0.0 -it? sshipway/xclock
其中IP地址,就是你的電腦
不出意外,你的Windows系統,會彈出一個窗口,如下:
恭喜,完成任務。
總結
Docker容器運行帶UI界面的App的時候,需要在容器里面,指定DISPLAY變量。告訴容器系統,應該把界面投射至哪個目標X Server。
Docker Kubernetes
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。