1. 程式人生 > 其它 >docker 啟動GUI程式

docker 啟動GUI程式

Docker本身的工作模式是命令列模式,因為主要的使用場景可能是做伺服器後端方面的比較多。 但有時候我們會有在docker容器裡執行一些圖形介面的軟體,輸出影象等等一些需求,這個時候需要解決這個Docker 視覺化的問題。

安裝docker,並設定映象加速器

curl -sSL https://get.daocloud.io/docker | sh
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://g5uyhrgn.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

GUI的準備工作

  1. 在宿主機中下載x11軟體並開放許可權

    sudo apt-get install x11-xserver-utils
    
    xhost +  
    #是開放許可權,允許所有使用者,當然包括docker,訪問X11 的顯示介面,正常返回access control disabled, clients can connect from any host
    

xhost 是用來控制X server訪問許可權的。通常當我們從宿主機登陸到docker上,執行docker上的應用程式時,做為應用程式來說,宿主機是client,但是作為圖形來說,是要在宿主機上顯示的,需要使用宿主機的Xserver,所以宿主機是server。因此在登陸到docker前,需要在宿主機上執行xhost +來使其它使用者能夠訪問宿主機的Xserver。xhost + 是使所有使用者都能訪問宿主機的Xserver.xhost + ip使ip上的使用者能夠訪問宿主機的Xserver。

有時在執行xhost會報出以下錯誤

xhost:  unable to open display "XXXX"

解決方法:設定DISPLAY變數,DISPLAY用來設定將圖形顯示到何處,DISPLAY 環境變數格式如下hostname: displaynumber.screennumber,在某些機器上,可能有多個顯示裝置共享使用同一套輸入裝置,例如在一臺PC上連線兩臺CRT顯示器,但是它們只共享使用一個鍵盤和一個滑鼠。這一組顯示裝置就擁有一個共同的displaynumber,而這組顯示裝置中的每個單獨的裝置則擁有自己單獨的 screennumber。displaynumber和screennumber都是從零開始的數字。這樣,對於我們普通使用者來說, displaynumber、screennumber就都是0。 hostname指Xserver所在的主機主機名或者ip地址, 圖形將顯示在這一機器上。

export DISPLAY=:0.0
xhost +    
  1. 根據dockerfile建立image映象

    docker build -f dockerfile -t 映象名  .  
    
  2. 建立容器

    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    
    docker   run  -dit  -P  -e DISPLAY=$DISPLAY --privileged --network=host -v /tmp/.X11-unix:/tmp/.X11-unix:rw -v /dev/bus/usb:/dev/bus/usb   -v /home/lfxs/StudioData:/StudioData     --name gui01   mydb:0.1  /bin/bash
    #-d: 後臺執行容器,並返回容器ID
    #-i: 以互動模式執行容器,通常與 -t 同時使用;
    #-P: 隨機埠對映,容器內部埠隨機對映到主機的埠
    #-p: 指定埠對映,格式為:主機(宿主)埠:容器埠
    #-e:設定環境變數
    #--privileged 是否允許Docker執行的容器擁有root許可權
    #--network指定容器的網路連線型別,支援 bridge/host/none/container: 四種類型;常用bridge和host
    #-v:繫結一個卷
    #--name :容器名
    

通過ssh 連線docker,並執行GUI程式

命令:

ssh -Y 使用者名稱@容器名 -p port 

說明:在/etc/hosts 中指定ip和容器的對應關係,新增192.168.2.68 gui01,由於network設定為hosts模式,容器和宿主機共用一個network namespaces,使用宿主機的IP和port。

然後通過命令/etc/init.d/ssh status檢視宿主機和容器中ssh是否是開啟的,如果沒有開啟使用命令

systemctl restart sshd.service

開啟/etc/ssh/sshd_config,新增埠號

port=10002

重啟ssh服務

/etc/init.d/ssh restart

還有以下幾種方式登入docker

ssh -Y -l 使用者名稱 ip -p port
ssh -Y 使用者名稱@ip -p port

測試docker中GUI在宿主機上顯示,在docker中下載xarclock

 sudo apt-get install xarclock
 xarclock

遇到的問題

  1. 建立容器時如果設定network為host模式時,要指定在容器中執行/bin/bash。如果不指定,可能會出現容器啟動不了的問題。
  2. 修改lightmd.conf導致圖形介面崩潰。
    https://blog.csdn.net/u012570215/article/details/102946670