1. 程式人生 > 其它 >docker容器處理GUI應用程式

docker容器處理GUI應用程式

最近在專案中遇到個問題,由於專案中用到了java呼叫C++的QT程式,而QT程式是需要依賴GUI的,因此將該服務打包成docker映象後

再啟動,發現一致報qt的相關錯誤,一直以為是qt的編譯錯誤,花了幾天時間,最終定位到,原來是docker應用中如果依賴GUI,就會導致

該問題。

原因簡單理解就是:docker設計之初,就是一款無介面的服務應用

那如果我們要使用GUI怎麼辦呢?其實很簡單,就是將宿主機的GUI,共享給docker服務即可。

思路原理:主流伺服器都支援x11介面服務 x11支援(客戶端/伺服器模式),根據這個模式,可以將docker中需要顯示的部分轉換到宿主機來實現

實現步驟:

a) 判斷是否安裝x11伺服器相關庫,沒安裝,則需要先安裝庫程式


b) xhost + 開啟許可權,表示所有使用者都可以訪問宿主機的顯示系統
c) 啟動docker容器的時候增加以下配置命令即可
   -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e DISPLAY=unix$DISPLAY \
   -e GDK_SCALE \
   -e GDK_DPI_SCALE \


如果宿主機無UI介面,其實很多伺服器基本都是這種配置,對於這種情況,可通過如下操作來處理:

首先必須通過ssh -X root@ip的方式連線到伺服器、但是這種模式,docker必須使用host網路模式,不能使用預設的bridge模式

但是由於我的docker容器較多,之間的訪問也是直接使用了docker網橋,通過子網模式來相互訪問的,因此改為host模式後,

需要將原來子網通訊的ip修改為主機ip即可

啟動docker容器的時候增加以下配置命令即可

-v /etc/localtime:/etc/localtime:ro \
--net=host \
-e DISPLAY=:10.0 \
-v $HOME/slides:/root/slides \
-e GDK_SCALE \
-e GDK_DPI_SCALE \