Docker容器運行GUI程序的配置方法


0.環境說明

Ubuntu 16.04 
docker 1.35

1.Docker的“可視化”

Docker本身的工作模式是命令行的,因為主要的使用場景可能是做服務器后端方面的比較多。 
但有時候我們會有在docker容器里運行一些圖形界面的軟件,或者要調用攝像頭,輸出圖像等等一些需求,這個時候需要解決這個Docker “可視化”的問題。 
(這里的“可視化”不是很容易搜到的可視化管理的方法)

2.解決方案1—啟動容器時添加配置選項

林帆:Docker運行GUI軟件的方法

這篇文章里介紹了Docker公司的程序員傑西·弗萊澤爾(Jessie Frazelle)展示的使用了圖形界面的鏡像的例子,Jessie也開源了她展示的docker 運行libreoffice軟件的代碼和使用方法。

2.1 原理簡介

原文中講的比較詳細,原理並不復雜,我按照自己理解很淺顯地講一下。 
原理上可以把docker鏡像看做一台沒配顯示器的電腦,程序可以運行,但是沒地方顯示。 
而linux目前的主流圖像界面服務X11又支持 客戶端/服務端(Client/Server)的工作模式 
只要在容器啟動的時候,將 『unix:端口』或『主機名:端口』共享給docker,docker 就可以通過端口找到顯示輸出的地方,和linux系統共用顯示

2.2 具體操作(顯示到本地顯示器)

1)首先,在主系統里運行

$ sudo apt-get install x11-xserver-utils $ xhost +

這兩句的作用是開放權限,允許所有用戶,當然包括docker,訪問X11 的顯示接口

2)在啟動docker容器時,添加選項如下:

 -v /tmp/.X11-unix:/tmp/.X11-unix \ #共享本地unix端口 -e DISPLAY=unix$DISPLAY \ #修改環境變量DISPLAY -e GDK_SCALE \ #我覺得這兩個是與顯示效果相關的環境變量,沒有細究 -e GDK_DPI_SCALE \

最終的啟動命令就會長類似這樣

$ docker run -d \

  -v /etc/localtime:/etc/localtime:ro \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e DISPLAY=unix$DISPLAY \ -e GDK_SCALE \ -e GDK_DPI_SCALE \ --name libreoffice \ jess/libreoffice

這樣啟動后的容器,運行有圖形界面的程序就可以自由顯示,和在本地顯示一樣了。

這樣操作已經十分方便了。需要注意的是,每次重新開機,需要在本機操作一次

xhost +

打開權限。應該有永久更改這個的辦法,不過我覺得不算麻煩。 
原文中還有在遠程顯示的配置方法,我沒有試,就不多說了。

3.解決方案2—已經啟動的容器修改系統參數

參考文章 
有的時候,我們在已經啟動的容器里做了一些事情,有了顯示圖像的需要,但從頭新啟動一個容器有點麻煩。 
這時候可以用上面博客里講的方法實現圖形界面顯示,也還算方便。 
思路上也是把主機和docker看做服務器和客戶端的關系,通過IP地址來映射顯示。

3.1 具體操作

1)使用 ifconfig 查看主機和docker的IP地址 
例如:主機的IP為 xxx 
docker 的IP為YYY 
2)docker 中

export DISPLAY= XXX #把環境變量映射到主機IP

3.)主機中

sudo gedit /etc/lightdm/lightdm.conf #增加一行 xserver-allow-tcp=true sudo systemctl restart lightdm xhost + #注意加號前應有空格

這樣配置就完成了,這是第一次配置的操作. 
以后每次重新開機時,還是要在主機里運行一下 xhost +,在docker里運行一下export DISPLAY= XXX 。 
其實還是挺麻煩的。 
最關鍵的是,這種方式用的是IP地址,在系統沒聯網時,網卡就沒有分配的IP地址了,這種方法就行不通了。

4.怎樣測試能否顯示圖像界面

第二篇參考文章中用了一個顯示時鍾的小程序xclock 
不過我在Ubuntu16.04的環境里搜不到這個了,能安裝的叫xarclock,功能一樣 
在docker中運行

sudo apt-get install xarclock #安裝這個小程序 xarclock #運行,如果配置成功,會顯示出一個小鍾表動畫


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM