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” 即为我的摄像头设备。
Docker 显示图像
linux系统目前的主流图像界面服务X11支持 客户端/服务端(C/S)的工作模式,只要在容器启动的时候,将 『unix:端口』或『主机名:端口』共享给Docker,Docker 就可以通过端口找到显示输出的地方,和linux系统共用显示接口。
- 安装 xserver
sudo apt install x11-xserver-utils
- 设置权限
# 允许所有用户访问显示接口
xhost +
# 只允许Docker用户访问显示接口 (两者选其一即可)
xhost +local:docker
- 运行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镜像,其作用就是:调用摄像头并进行实时显示。
参考资料
Docker容器运行GUI程序的配置方法-阿里云开发者社区G03-Docker挂载设备及输出图像https://www.ctolib.com/topics-133594.html