天天看點

Docker容器可視化本地安裝X11界面工具。添加參數建立容器測試容器嘗試運作Matplotlib參考

文章目錄

  • 本地安裝X11界面工具。
  • 添加參數
  • 建立容器
  • 測試容器
  • 嘗試運作Matplotlib
    • 繪制柱狀圖
  • 參考

Docker容器中運作程式,有時候需要顯示容器中的圖像,或在容器中運作一些圖形界面的軟體、調用攝像頭等,而Docker采用的是指令行的工作模式,Docker容器可以采用檔案挂載或者網絡通信的方式中的輸出圖像等方式在宿主螢幕上顯示。

系統資訊

  • Deepin20.7
  • Docker 19.03.8
  • Docker-compose 1.29.2

本地安裝X11界面工具。

UOS、Deepin已經預設安裝好了

sudo apt-get install x11-xserver-utils
           
Docker容器可視化本地安裝X11界面工具。添加參數建立容器測試容器嘗試運作Matplotlib參考

xhost + 是開放權限,允許所有使用者包括docker通路X11的顯示接口,重新開機後,需要在本地執行一次 xhost +

xhost +
           
Docker容器可視化本地安裝X11界面工具。添加參數建立容器測試容器嘗試運作Matplotlib參考

添加參數

-v /tmp/.X11-unix:/tmp/.X11-unix     # 挂載本地顯示服務端口到容器中
-e DISPLAY=unix$DISPLAY              # 修改環境變量DISPLAY
-e GDK_SCALE                         # 與顯示效果相關的環境變量
-e GDK_DPI_SCALE                     # 同上
           

建立容器

測試鏡像ubuntu:20.04

sudo docker run -itd --name ubuntu20 \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=unix$DISPLAY \
-e GDK_SCALE \
-e GDK_DPI_SCALE \
ubuntu:20.04
           

建立成功

Docker容器可視化本地安裝X11界面工具。添加參數建立容器測試容器嘗試運作Matplotlib參考

進入容器

Docker容器可視化本地安裝X11界面工具。添加參數建立容器測試容器嘗試運作Matplotlib參考

測試容器

采用一個顯示時鐘的程式xarclock進行測試,在啟動的容器内部安裝該程式

apt update -y            # 更新軟體源
apt upgrade -y           # 更新軟體
apt install xarclock     # 安裝
xarclock                 # 運作
           
Docker容器可視化本地安裝X11界面工具。添加參數建立容器測試容器嘗試運作Matplotlib參考

運作成功

嘗試運作Matplotlib

容器中安裝python3

apt install python3        # 安裝python
apt install python3-pip    # 安裝pip工具
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # 修改pip源為清華源
pip3 install -U pip        # 更新pip工具
           
Docker容器可視化本地安裝X11界面工具。添加參數建立容器測試容器嘗試運作Matplotlib參考

安裝Matplotlib

pip3 install matplotlib
           

在容器中Matplotlib使用的是agg,這是一個非圖形使用者界面的背景,是以無法顯示該圖。在終端安裝一下軟體

apt install tcl-dev tk-dev python-tk python3-tk
           
Docker容器可視化本地安裝X11界面工具。添加參數建立容器測試容器嘗試運作Matplotlib參考

安裝過程中可能需要選擇時區,選擇6亞洲

Docker容器可視化本地安裝X11界面工具。添加參數建立容器測試容器嘗試運作Matplotlib參考

70上海

繪制柱狀圖

代碼

tee main.py << EOF
import matplotlib.pyplot as plt
import matplotlib
import tkinter
matplotlib.use('TkAgg')
x  = [1, 2, 3, 4]
y  = [1, 2, 3, 4]
y1 = [e+1 for e in y]
y2 = [e+2 for e in y]
y3 = [e+3 for e in y]
plt.bar(x, y)
plt.show()
EOF
           
Docker容器可視化本地安裝X11界面工具。添加參數建立容器測試容器嘗試運作Matplotlib參考
python3 main.py
           
Docker容器可視化本地安裝X11界面工具。添加參數建立容器測試容器嘗試運作Matplotlib參考

運作成功

參考

UserWarning: Matplotlib is currently using agg, which is a non-GUI backend

本地主控端器顯示Docker 容器中的圖像(Docker容器可視化)