Docker中配置ROS(⼀)——安装之前
本⽂为系列⽂章,主要是为了使⽤docker部署和开发ros相关程序,核⼼是为了解决以下问题:
有些papckage运⾏的依赖版本不⼀致,更换这些依赖的版本极其繁琐,甚⾄可能毁了开发环境,为提⾼开发环境的鲁棒性所以考虑采⽤docker 部署各个package。
在部署ros的docker开发环境前,需要先解答以下⼀些疑惑。
ubuntu18.04配置ros的docker环境(⼀)——安装之前
ubuntu18.04配置ros的docker环境(⼆)——安装ros的docker镜像,测试turtlebot(ssh,多个panel,tmux)
ubuntu18.04配置ros的docker环境(三)——⽣成⾃⼰的ros镜像
ubuntu18.04配置ros的docker环境(四)——编译⾃⼰的package并运⾏
ubuntu18.04配置ros的docker环境(五)——安装CUDA与pytorch,并测试
ubuntu18.04配置ros的docker环境(六)——多个容器相互通信
ubuntu18.04配置ros的docker环境(七)——多个容器中的package相互通信
ubuntu18.04配置ros的docker环境(⼋)——多个版本的ros相互通信,kinetic,molodic,ros1,ros2
ubuntu18.04配置ros的docker环境(九)——容器与主机通信
ubuntu18.04配置ros的docker环境(⼗)——docker中的ros与宿主机的vrep(或者另外⼀个docker中的rep)的联合仿真
ubuntu18.04配置ros的docker环境(⼗⼀)——docker中ros的多机(不同的物理机、或者相同的物理机)通信
docker进入容器本章⽬录:
1.docker的容器会占⽤多⼤的空间
3.代码应该在宿主机⾥⾯写还是docker⾥⾯写
4.如何在docker中编辑修改⽂件
5.如果查看docker⾥⾯可视化界⾯,如vscode,ros的rviz和gazebo等
6.docker⾥⾯的程序如何与主机的程序通讯?
7.docker⾥⾯的GPU CUDA配置与主机的配置如何协调
⼀、docker的容器会占⽤多⼤的存储空间
docker通过镜像(image)创造容器(container),在容器中部署开发环境。
有官⽅上传好的镜像,⾥⾯已经配好了ros的开发环境。⽐如sudo docker pull osrf/ros:melodic-desktop-full。如果是包含ros-core的镜像,⼤概是400M,如果包含rviz,gazebo等全套的destktop-full版本,⼤概是5G左右,占据的空间还是很可观的。
查看容器与镜像⼤⼩(容器⼀般体积都⽐较⼩)
docker system df -v
容器体积与镜像体积
⼆、ros运⾏在docker中是否会影响性能?
在CPU运⾏计算层次影响的性能很⼩,⼏乎没有。但是在数据传输、如⽂件挂载等和⽹络通信会有影响,通信影响的延时⼤概在50us微秒左右。
性能对⽐
详细的⽐较可见下⾯两个链接。
容器是镜像的接⼝设置,实际是运⾏镜像,因此对读写能⼒还是有要求的,ssd运⾏速度较快。
Docker容器、虚拟机和裸机运⾏的性能⽐较
docker性能测试
三、代码应该在宿主机⾥⾯写还是docker⾥⾯写?
不要将数据储存在容器中,在开发环境,因为code的频繁变更,通过volume⽅式进⾏挂载更⽅便。
使⽤-v参数挂载本地⽂件,删除容器后,⽂件仍然存在。
容器随时都可以停⽌、销毁或迁移,⽐⽅说,⼀个容器⾥运⾏的应⽤版本是1.0,我们分分钟就可以把这个应⽤升级到1.1,同时还不会对数据造成任何影响。所以如果⽤户想要存数据的话,最好是⽤数据卷来存储。不过在⽤卷存数据的时候⼤家还是要注意⼀点,如果有两个容器共⽤⼀个数据卷,都往⾥⾯写数据的话,是有可能造成程序崩溃的。我们在设计应⽤程序的时候应该考虑到这⼀点,为保万⽆⼀失,应⽤程序应该具备特定的机制,以确保在往共享数据存储区写⼊数据的时候不会出错。
容器随时可以停⽌、或者删除。当容器被rm掉,容器⾥的数据将会丢失。为了避免数据丢失,⽤户可以使⽤数据卷挂载来存储数据。但是容器的Volumes 设计是围绕 Union FS 镜像层提供持久存储,数据安全缺乏保证。如果容器突然崩溃,数据库未正常关闭,可能会损坏数据。另外,容器⾥共享数据卷组,对物理机硬件损伤也⽐较⼤。
如果你是开发环境,代码是⽤于调试,代码是不应该在image⾥⾯的,利⽤dockerfile,⾃动git pull也不是好的⽅案,当然更不提倡ssh到容器,去修改代码。这个时候,你的代码最好是在你的mac,windo
ws,linux的个⼈pc上,如果你的开发环境,本⾝就部署到了本机,通过boot2docker 或者其他⽅式,那么就通过共享⽬录,然后开启容器的时候-v的⽅式,通过卷的⽅式,来使⽤,最⽅便。修改代码直接就可以进⾏调试。如果开发环境在服务器上,可以通过远程mount的⽅式,mount到本机进⾏开发修改。
如果你是测试环境,建议根据git⽅式进⾏,代码不在image,⽽是通过docker exec到容器内pull对应测试tag的代码。当然也可以在宿主机pull,然后docker cp到对应的测试容器;
四、如何在docker中编辑修改⽂件?
可以⽤可视化的IDE,如vscode,CLION。
①可以直接⽤宿主机的vscode或clion,pycharm打开修改,在编译和运⾏的时候,需要进⼊到docker中执⾏命令,因为是共享⽂件夹,所以在docker环境中也可以看到这些修改后的源码。
②也可以⽤docker中的vscode或clion,pycharm直接打开修改,⽤这些可视化界⾯编辑时需要启动docker使⽤xserver,开启gui界⾯图像服务。
有三种⽅法可以进⼊到docker中
使⽤tmux在docker中创建不同的terminal⾮常⽅便。
五、如果查看docker⾥⾯可视化界⾯,如vscode,ros的rviz和gazebo等?
宿主机开启xhost, 使能宿主机接收其他客户端的显⽰需求
xhost +
docker创建容器时参数设置xserver挂载地址即可
-e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix
六、docker⾥⾯的程序如何与主机的程序通讯?
采⽤socket通信
docker创建容器时,默认分配了bridge⽹络,这样所有的容器都在同⼀个⽹段,是能够相互通信的。
如果想某些容器之间不能通信,通过⾃定义⽹络就能实现。
假如宿主机是linux系统,有⼀个监听8000端⼝的其他进程
在宿主机上执⾏ifconfig命令,可以发现有⼀个docker0⽹卡,注意观察其⽹段和docker network inspe
ct bridge的⽹段是⼀致的,宿主机在此⽹段下也分配了⼀个ip,⼀般是⽹段中的第⼀个ip,假如是192.168.10.1。
1)假如⽤默认的bridge模式启动容器,即在启动时不指定network参数或者指定了--network bridge,
在容器中执⾏ifconfig命令,可以发现容器的ip也在上⾯的⽹段中,假如是192.168.10.2。
在容器中,ping 192.168.10.1,可以ping通。在宿主机中ping 192.168.10.2,可以ping通。
在容器中,可以⽤192.168.10.1:port的⽅式访问宿主机的服务。
⽹络中的其它主机能否ping通这些容器?
roscore在容器中启动后,宿主机能否启动?可以,这相当于是两台不同的机器,如果共享⼀个roscore,需要设置两个的
bashrc,ros_master_url参数。
2)假如容器⽤host⽹络模式启动,即在启动时添加了--netwok host参数,
那么容器会和宿主机共享⽹络,直接telnet 127.0.0.1 8000可以telnet通信。
七、docker⾥⾯的GPU CUDA配置与主机的配置如何协调?
采⽤NVIDIA Container Toolkit,19.03后原⽣⽀持nvidia的驱动,只需要宿主机安装nvidia的驱动,在镜像中安装cuda和cudnn。
在docker中使⽤gpu需要设置参数:
docker run --gpus all ....
⼋、为什么建议⼀个docker⾥⾯只有⼀个进程
1)每个容器中只运⾏⼀个应⽤程序,则⽔平伸缩将变得⼗分容易。例如,当你需要⼀个Tomcate容器,可以从现有的容器再扩展出⼀个,但如果你的这个容器中不仅有Tomcate,还有MySQL等其他应⽤程序,事情就会变得复杂起来。
2)个容器中只运⾏⼀个应⽤程序,可以轻松地将其重新⽤于其他项⽬或⽬的,极⼤增加复⽤度。
3)每个容器中只运⾏⼀个应⽤程序,出现故障时开发⼈员能⽅便地对该故障容器进⾏问题排查,⽽不必对整个系统的各个部分进⾏排查,这也使得其更具有可移植性和可预测性。
4)每个容器中只运⾏⼀个应⽤程序,升级程序时能够将影响范围控制再更⼩的粒度,极⼤增加应⽤程序⽣命周期管理的灵活性,避免在升级某个服务时中断相同容器中的其他进程。
5)每个容器中只运⾏⼀个应⽤程序,从安全性和隔离性⾓度来看,能够提供更安全的服务和应⽤程序间的隔离,以保持强⼤的安全状态或遵守PCI之类的规定。
九、docker安装ubuntu 18.04,和双系统(win10+ubuntu)安装的有什么区别?
虚拟机⾥装的ubuntu是ubuntu的内核 + ubuntu的⽂件系统
docker⾥的ubuntu是任意的内核(你底层的操作系统的内核)+ ubuntu的⽂件系统
经过思考,⾃⼰对docker的实际需求有以下⼏个
1.创建满⾜⾃⼰ros开发的docker镜像
2.把程序部署在docker中进⾏编译和运⾏
3.修改docker中的程序,进⾏调试。
4.把镜像打包发给别⼈使⽤
5.(本地)多docker之间通信。
6.docker与宿主机通信
接下来就实际部署了,未完待续~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论