Docker本身的工作模式是命令行的,但有时候我们需要在Docker容器里运行一些图形化东西如:调用摄像头,输出图像等等,这个时候我们就不得不研究一下如何在Docker中进行 “可视化”。

环境

  • Ubuntu 16.04
  • Docker 19.03.2

Docker 挂载摄像头

在运行 Docker时,我们能够通过添加–privileged参数来让Docker容器使用宿主机的现有设备。除此之外,也可以使用--device参数详细明确Docker容器能够使用哪些设备(推荐)。例如我们希望Docker容器能够使用宿主机的摄像头时,可以这样操作:

docker run -it --device=/dev/video0 <image_name>

在Ubuntu系统中,宿主机中的设备默认都保存在 /dev 目录下,可以将这些设备当做文件进行使用。下图是我的/dev目录下的设备情况,标注的 “video0” 即为我的摄像头设备。

dev目录

Docker 显示图像

linux系统目前的主流图像界面服务X11支持 客户端/服务端(C/S)的工作模式,只要在容器启动的时候,将 『unix:端口』或『主机名:端口』共享给Docker,Docker 就可以通过端口找到显示输出的地方,和linux系统共用显示接口。

  1. 安装 xserver
    sudo apt install x11-xserver-utils
  2. 设置权限
# 允许所有用户访问显示接口
xhost +
# 只允许Docker用户访问显示接口 (两者选其一即可)
xhost +local:docker 
  1. 运行Docker镜像时 设置环境变量
#共享本地unix端口
-v /tmp/.X11-unix:/tmp/.X11-unix           
#修改环境变量DISPLAY
-e DISPLAY=unix$DISPLAY 

那么在Docker中显示图像可以这样运行指令:

docker run -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY <image_name>

实例

我们现在使用一个最简单的例子:调用摄像头,进行实时显示 来实际操作下。因为既要调用摄像头又要实时显示画面,所以我们需要把上面的两条指令连接起来进行操作,指令如下:

docker run -it --rm --device=/dev/video0 -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix whynot0/opencamrea:v1

其中 whynot0/opencamrea:v1 是我自己生成的一个Docker镜像,其作用就是:调用摄像头并进行实时显示。


参考资料

https://yq.aliyun.com/articles/606756
https://jameslei.com/g03-docker-cjxechyk0000qmls12dfe471n
https://www.ctolib.com/topics-133594.html

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐