跳到主要内容

Docker交互

Docker交互1、Bash脚本1.1、基础使用(Docker)1.2、运行脚本2、共享数据2.1、共享文件夹2.2、共享网络3、共享硬件3.1、共享图形界面3.2、普通摄像头3.3、深度相机

教程主要介绍主机与Docker之间的数据和硬件交互。

1、Bash脚本

Bash(Bourne Again SHell)是一种用于自动化任务的脚本语言,用户可以将多条命令组合在一起并按顺序执行!

Docker命令提供可选参数启动容器,但参数过多会影响命令的阅读和理解

1.1、基础使用(Docker)

基本脚本

​ x #!/bin/bash docker run -it \ <image_name>:<tag> /bin/bash

示例脚本

将示例写入ros_melodic.sh文件:

xxxxxxxxxx gedit ros_melodic.sh xxxxxxxxxx #!/bin/bash docker run -it \ ros_melodic:1.0 /bin/bash

image-20250105170938054

1.2、运行脚本

xxxxxxxxxx sh ros_melodic.sh

image-20250105171102690

2、共享数据

2.1、共享文件夹

共享主机的share文件夹到Docker。

示例脚本

xxxxxxxxxx #!/bin/bash docker run -it \ -v /home/yahboom/share:/share \ ros_melodic:1.0 /bin/bash

image-20250105172654529

2.2、共享网络

共享主机的网络到Docker。

示例脚本

xxxxxxxxxx #!/bin/bash docker run -it \ \--net=host \ -v /home/yahboom/share:/share \ ros_melodic:1.0 /bin/bash

若无法使用ifconfig命令,安装net-tools:

xxxxxxxxxx sudo apt install net-tools -y xxxxxxxxxx ifconfig

image-20250105175324374

3、共享硬件

3.1、共享图形界面

Docker运行图形界面的程序,需要输出到本地显示图形界面。

示例脚本

xxxxxxxxxx #!/bin/bash xhost + docker run -it \ \--net=host \ -e DISPLAY=$DISPLAY \ -e "QT_X11_NO_MITSHM=1" \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -v /home/yahboom/share:/share \ ros_melodic:1.0 /bin/bash

image-20250105175603885

3.2、普通摄像头

普通摄像头映射到Docker:只需要将摄像头对应的/dev/video*设备号添加进去

xxxxxxxxxx 若只接一个摄像头,一般对应/dev/video0

示例脚本

x #!/bin/bash xhost + docker run -it \ \--net=host \ -e DISPLAY=$DISPLAY \ -e "QT_X11_NO_MITSHM=1" \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -v /home/yahboom/share:/share \ \--device=/dev/video0 \ ros_melodic:1.0 /bin/bash

image-20250105181500835

3.3、深度相机

深度相机相比于普通摄像头需要添加额外信息才可以调用摄像头:以Astra Pro举例

查看USB设备信息

xxxxxxxxxx lsusb

image-20250115115928531

我们需要关注的信息:USB总线编号、USB总线上的设备编号、设备的供应商ID、产品ID

x Bus 003 Device 005: ID 2bc5:0403 Orbbec 3D Technology International, Inc Astra Pro Bus 003 Device 006: ID 2bc5:0501 Orbbec 3D Technology International, Inc Astra Pro HD Camera

USB总线编号:Bus 003

USB总线上的设备编号:Device 005、Device 006

设备的供应商ID:2bc5

产品ID:0403、0501

根据供应商ID和产品ID可以定位设备以及设备ID重映射,其中USB总线编号和USB总线上的设备编号影响Docker内连接设备。

设备ID重映射

此处不介绍绑定的过程及方法,直接展示结果,设备ID重映射并不属于该教程内容。

每次启动docker需要注意深度相机对应的USB总线编号和USB总线上的设备编号,若两者不一致,Docker内启动相机会一直提示无法连接设备。

image-20250115121302577

示例脚本

x #!/bin/bash xhost + docker run -it \ \--net=host \ -e DISPLAY=$DISPLAY \ -e "QT_X11_NO_MITSHM=1" \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -v /home/yahboom/share:/share \ -v /dev/bus/usb/003/005:/dev/bus/usb/003/005 \ -v /dev/bus/usb/003/006:/dev/bus/usb/003/006 \ \--device=/dev/astra_pro \ \--device=/dev/astrauvc \ \--device=/dev/video0 \ \--device=/dev/video1 \ ros_melodic:1.0 /bin/bash

image-20250115121659566