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


免責聲明!

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



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