天天看点

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容器可视化)