一直以来,我以为docker是没有图形界面的,我就用它做过编译服务,构建编译环境。时隔多年,再次用到,它居然支持了。
1. docker图形界面配置
主机端运行命令:“ xhost + ”,使能宿主机接收其他客户端的显示需求
docker端配置显示参数,“ export DISPLAY=":0.0" ”,使用unix socket方式连接到Xserver,使用显示端0.0
docker启动参数需要映射显示服务节点目录,“ -v /tmp/.X11-unix:/tmp/.X11-unix:rw ”
这样,docker中显示client通过映射将对Xserver的请求透传到主机端DISPALY,DISPLAY对应主机端的显示接口,主机端也使能接收,完成显示。
2. docker支持硬件加速的图形界面配置
上面的配置应对简单的图形界面足够。有些图形显示程序如ROS的rviz程序需要调用图形加速,也就是依赖libgl.so等库来启动硬件加速,就需要添加硬件加速支持。ROS做了一些工作,针对nvidia显卡,提供了nvidia-docker1和nvidia-docker2工具,针对AMD和Intel显卡使用默认mesa库。ubuntu中使用命令“ apt-get install nvidia-docker ”,具体见https://github.com/NVIDIA/nvidia-docker,这张图也解释了nvidia-docker原理:
从图上看,还需要nvidia显卡驱动为nvidia-docker提供接口和服务。要注意的是,docker中调用的接口要在主机中有相对应的实现,具体就体现在驱动的版本上面(吐槽:nvivida驱动程序没写好,版本不同不相互兼容,换人!)。docker和主机安装相同版本的驱动我试过没问题,猜测如果不相同,主机中的版本要比docker中的高才行,主机中版本低是有问题的(亲身体验)。
如果使用AMD或者intel显卡,就能省了驱动安装这一步(表扬:mesa人家的驱动就做的比较好,各个版本之间能兼容)。
到这里在docker上执行ROS的rviz就能在主机显示器上显示图形界面了。
3. 主机+虚拟机+docker环境配置
有时候硬件资源有限,主机需要跑windows,Linux环境只能跑在虚拟机上了,比如vmware或者virtualbox,docker再安装在linux虚拟机上,这样的组合也是可以的。
虚拟机上的显卡就只能用mesa开源库,docker上按照mesa配置,docker上ROS的rviz可以运行。首先要卸载nvidia的驱动,然后安装xserver-xorg-video-nouveau驱动包。虽然可能windows上有nvidia显卡,但是virtualbox将其虚拟化为mesa接口的显卡了,就不用docker这一层再做相关工作。
4. tips
docker上的ros版本和主机上的ROS版本可以不一样。
装完驱动等等库,可以检查/usr/local/lib下的libgl*。