4、docker硬件交互和数据处理4.1、硬件挂载(端口绑定)4.2、docker中GUI的显示4.3、docker容器和宿主机互传文件4.3.1、使用cp命名4.3.1.1、从容器内拷贝文件到主机上4.3.1.2、从宿主机拷贝文件到容器上4.3.2、使用数据卷4.3.2.1、数据卷概述4.3.2.2、数据卷使用
操作环境及软硬件参考配置如下:
参考车型:ROSMASTER X3
机器人硬件配置:Arm系列主控,思岚A1激光雷达,AstraPro Plus深度相机
机器人系统:Ubuntu(版本无要求)+ docker(20.10.21及以上版本)
PC虚拟机:Ubuntu(20.04)+ ROS2(Foxy)
使用场景:在相对干净的2D平面上使用
1、在宿主机中建立udev规则(/etc/udev/rules.d/),参见【六、 Linux操作系统 ---- 6. 绑定设备ID 】章节
2、然后在开启容器时,将设置了规则的devices 通过 --device=/dev/myserial --device=/dev/rplidar 等参数挂载到docker容器中
xxxxxxxxxx
docker run -it --device=/dev/myserial --device=/dev/rplidar ubuntu:latest /bin/bash
3、docker 容器中就能发现该设备了
xxxxxxxxxx
jetson@ubuntu:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 1.0 78ca7be949b6 About an hour ago 69.2MB
pengan88/ubuntu 1.0 78ca7be949b6 About an hour ago 69.2MB
yahboomtechnology/ros-foxy 3.4.0 49581aa78b6b 6 hours ago 24.3GB
yahboomtechnology/ros-foxy 3.3.9 cefb5ac2ca02 4 days ago 20.5GB
yahboomtechnology/ros-foxy 3.3.8 49996806c64a 4 days ago 20.5GB
yahboomtechnology/ros-foxy 3.3.7 8989b8860d17 5 days ago 17.1GB
yahboomtechnology/ros-foxy 3.3.6 326531363d6e 5 days ago 16.1GB
mysql latest 5371f8c3b63e 6 days ago 592MB
ubuntu latest bab8ce5c00ca 6 weeks ago 69.2MB
hello-world latest 46331d942d63 13 months ago 9.14kB
jetson@ubuntu:~$ ll /dev | grep ttyUSB*
lrwxrwxrwx 1 root root 7 Apr 23 18:07 myserial -> ttyUSB0
lrwxrwxrwx 1 root root 7 Apr 23 18:07 rplidar -> ttyUSB1
crwxrwxrwx 1 root dialout 188, 0 Apr 23 18:07 ttyUSB0
crwxrwxrwx 1 root dialout 188, 1 Apr 23 18:07 ttyUSB1
jetson@ubuntu:~$ docker run -it --device=/dev/myserial --device=/dev/rplidar ubuntu:latest /bin/bash
root@03522257ba30:/# ls /dev # docker中已经有myserial和rplidar
console fd full mqueue myserial null ptmx pts random rplidar shm stderr stdin stdout tty urandom zero
1、在宿主机中安装:
xxxxxxxxxx
sudo apt-get install tigervnc-standalone-server tigervnc-viewer
sudo apt-get install x11-xserver-utils
2、在宿主机中执行:xhost +
显示下图正常后,执行3步骤:
3、在宿主机中执行命令进入容器:
xxxxxxxxxx
docker run -it \ # 交互式运行docker镜像
--env="DISPLAY" \ # 开启显示GUI界面
--env="QT_X11_NO_MITSHM=1" \ # 采用X11的端口1进行显示
-v /tmp/.X11-unix:/tmp/.X11-unix \ # 映射显示服务节点目录
yahboomtechnology/ros-foxy:3.3.9 # 要启动的镜像名称
/bin/bash # 在容器内执行/bin/bash命令
4、测试
xxxxxxxxxx
在容器中执行:rviz2
xxxxxxxxxx
# 命令
docker cp 容器id:容器内路径 目的主机路径
# 测试
# 容器内执行,创建一个文件测试
jetson@ubuntu:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c54bf9efae47 ubuntu:latest "/bin/bash" 2 hours ago Up 9 minutes funny_hugle
3b9c01839579 hello-world "/hello" 3 hours ago Exited (0) 3 hours ago jovial_brown
jetson@ubuntu:~$ docker attach c5
root@c54bf9efae47:/# ls
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
root@c54bf9efae47:/# cd
root@c54bf9efae47:~# ls
root@c54bf9efae47:~# touch test.txt
root@c54bf9efae47:~# ls
test.txt
root@c54bf9efae47:~# pwd
/root
root@c54bf9efae47:/# read escape sequence #按ctrl+P+Q 容器不停止退出
jetson@ubuntu:~$ docker cp c54bf9efae47:/root/test.txt ~/
jetson@ubuntu:~$ ls # test.txt文件已经拷贝进来了
Desktop Documents Downloads fishros Music openvino Pictures Public rootOnNVMe run_docker.sh sensors snap temp Templates test.txt Videos
xxxxxxxxxx
# 命令
docker cp 宿主机文件路径 容器id:容器内路径
#测试
jetson@ubuntu:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c54bf9efae47 ubuntu:latest "/bin/bash" 2 hours ago Up 5 minutes funny_hugle
3b9c01839579 hello-world "/hello" 3 hours ago Exited (0) 3 hours ago jovial_brown
jetson@ubuntu:~$ ls
Desktop Documents Downloads fishros Music openvino Pictures Public rootOnNVMe run_docker.sh sensors snap temp Templates test.txt Videos
jetson@ubuntu:~$ touch 11.txt
jetson@ubuntu:~$ ls
11.txt Desktop Documents Downloads fishros Music openvino Pictures Public rootOnNVMe run_docker.sh sensors snap temp Templates test.txt Videos
jetson@ubuntu:~$ docker cp 11.txt c54bf9efae47:/root/
jetson@ubuntu:~$ docker attach c5
root@c54bf9efae47:/# ls
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
root@c54bf9efae47:/# cd /root/
root@c54bf9efae47:~# ls # 11.txt文件已经拷贝进来了
11.txt test.txt
将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对于数据的要求,是希望能够持久化的!就好比,你安装一个mysql,结果你把容器删了,就相当于删库跑路了,这肯定不行吧!所以我们希望容器之间有可能可以共享数据,docker容器产生的数据,如果不通过docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了!这样是行不通的!
为了能保存数据在docker中我们就可以使用卷!让数据挂载到我们本地!这样数据就不会因为容器删除而丢失了!
特点:
1、数据卷可在容器之间共享或重用数据
2、卷中的更改可以直接生效
3、数据卷中的更改不会包含在镜像的更新中
4、数据卷的生命周期一直持续到没有容器使用它为止
xxxxxxxxxx
# 命令
docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名
# 测试
docker run -it -v /home/jetson/temp:/root/temp yahboomtechnology/ros-foxy:3.4.0 /bin/bash
宿主机中的/home/jetson/temp目录和容器内的/root/temp目录就可以共享数据了