ubuntu20.04在docker下运行ros-noetic

经常折腾虚拟机各双系统 , 想着不如把docker利用起来,下面算是一个初学者使用docker运行ros的记录:

1. 安装

使用官方安装脚本自动安装

bash 复制代码
 curl -fsSL https://test.docker.com -o test-docker.sh
 sudo sh test-docker.sh

验证是否安装成功

bash 复制代码
docker version

Docker 需要用户具有 sudo 权限,为了避免每次命令都输入sudo,可以把用户加入 Docker 用户组

bash 复制代码
sudo usermod -aG docker $USER

Docker 是服务器----客户端架构。命令行运行docker命令的时候,需要本机有 Docker 服务。如果这项服务没有启动,可以用下面的命令启动

bash 复制代码
# service 命令的用法
sudo service docker start
# systemctl 命令的用法
sudo systemctl start docker

2. 在docker中运行ros-noetic

参考\] (https://blog.csdn.net/qq_40695642/article/details/117607446) ### 2.1 安装Portainer Portainer 个可视化的界面其实和ROS关系并不大,但是使用起来非常的方便,可以让我们更快速的利用Docker学习ROS,而不是要完整的学习完Docker的繁杂的命令再学习ROS。 ```bash sudo systemctl restart docker #下载Portainer的Docker镜像 sudo docker pull portainer/portainer #运行Portainer容器; sudo docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --restart=always --name prtainer portainer/portainer ``` (执行上面的命令如果有报错的话 , 建议 魔法先关闭 ) ### 2.2 如果出现超时什么的 重启容器 使用sudo docker ps来查看正在运行的容器 ```bash sudo docker ps ``` 该命令将列出所有正在运行的容器。 运行以下命令停止 Portainer 容器: ```bash sudo docker stop ``` 将 \ 替换为实际的 Portainer 容器的 ID 或名称 使用以下命令再次启动 Portainer 容器: ```bash sudo docker start ``` 同样,将 \ 替换为 Portainer 容器的 ID 或名称。 等待一段时间,让容器重新启动 #### 2.3 访问本机9000端口 运行上述命令等待执行成功后,放行防火墙,访问本机的9000端口进入Portainer,创建账号密码之后即可登录到控制台。 **本机的9000端口: http://localhost:9000** ![](https://file.jishuzhan.net/article/1725814236749238273/e7bd697d0ae28483f6ceebd22213785e.webp)在这里我们可以查看到运行容器内部的信息,也可以快速的删除废弃的容器及镜像。也可以构建虚拟网络实现容器间隔离 Portainer 学习参考: https://www.hangge.com/blog/cache/detail_2597.html ### 2.2 在docker中运行ros-noetic 首先我们可以使用 ```bash sudo docker search ros ``` 来查看目前docker hub上有哪些大神上传的公共镜像 选择pull ros-neotic的 docker 镜像 ```bash sudo docker pull osrf/ros:noetic-desktop-full ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1725814236749238273/1fd5ae83953aaf2ac737dd5466b286d3.webp) 接下来我们需要写一个Dockerfile,来帮我们完成一些简单的环境依赖安装工作: ```bash mkdir cwc_docker cd cwc_docker gedit Dockerfile ``` 下面是Dockerfile 文件内容: ```bash FROM osrf/ros:melodic-desktop-full # nvidia-container-runtime ENV NVIDIA_VISIBLE_DEVICES ${NVIDIA_VISIBLE_DEVICES:-all} ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics RUN apt-get update && \ apt-get install -y \ build-essential \ libgl1-mesa-dev \ libglew-dev \ libsdl2-dev \ libsdl2-image-dev \ libglm-dev \ libfreetype6-dev \ libglfw3-dev \ libglfw3 \ libglu1-mesa-dev \ freeglut3-dev \ gedit ``` 接下来使用下面的命令来构建容器:(同样 我关闭了我的魔法) ```bash sudo docker build -t cwc_docker . ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1725814236749238273/83fea0fe5bcd1fe87325d54225a745ed.webp)以下是 Dockerfile 的具体功能说明: 设置环境变量 NVIDIA_VISIBLE_DEVICES 和 NVIDIA_DRIVER_CAPABILITIES,用于配置 NVIDIA 设备的可见性和驱动程序的能力。 使用 apt-get 更新软件包列表,并安装以下软件包: build-essential:包含了 gcc 和 make 等基本的构建工具。 libgl1-mesa-dev:Mesa OpenGL 库的开发文件。 libglew-dev:GLEW 库的开发文件。 libsdl2-dev:SDL2 库的开发文件。 libsdl2-image-dev:SDL2_image 库的开发文件。 libglm-dev:GLM 库的开发文件。 libfreetype6-dev:FreeType 库的开发文件。 libglfw3-dev 和 libglfw3:GLFW 库的开发文件和运行时库。 libglu1-mesa-dev:Mesa GLU 库的开发文件。 freeglut3-dev:FreeGLUT 库的开发文件。 gedit:用于在容器内编辑文件的文本编辑器。 这些软件包通常用于图形编程和开发。使用该 Dockerfile 构建镜像后,可以将其作为基础镜像来运行具备图形能力的 ROS 应用程序。 如果上面Dockerfile的下面安装部分安装不成功的话也没有关系,删除RUN节,只剩下: ```bash FROM osrf/ros:melodic-desktop-full # nvidia-container-runtime ENV NVIDIA_VISIBLE_DEVICES ${NVIDIA_VISIBLE_DEVICES:-all} ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1725814236749238273/8a34db627c6b16485e90d30df02bb3b3.webp) 然后继续进入容器再安装: ```bash ###在运行容器后输入下面的命令,然后任意安装 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654 sudo apt update sudo apt install gedit ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1725814236749238273/b1d8845a4016c5e1a8703387cc19de32.webp) 经过漫长的等待 ,容器构建成功, 下面启动容器 ```bash sudo xhost +local: sudo docker run -it --device=/dev/dri --group-add video --volume=/tmp/.X11-unix:/tmp/.X11-unix --env="DISPLAY=$DISPLAY" --name=cwc_docker osrf/ros:noetic-desktop-full /bin/bash ``` 运行上述命令即可进入容器的内部: ![在这里插入图片描述](https://file.jishuzhan.net/article/1725814236749238273/7df1a948a251298c2a52463849eb3506.webp) 在容器内部有一个ros_entrypoint.sh的文件,`./ros_entrypoint.sh`执行这个脚本 然后就可以正常使用roscore和rviz了 ![在这里插入图片描述](https://file.jishuzhan.net/article/1725814236749238273/b5d4e6206136bbda1a5d22d66e10bf7c.webp) 在使用rviz的时候我们当然需要再开启一个终端,那么对应的我们要进入启动roscore的这个容器 ```bash sudo docker ps ###找到运行的rocker容器的id ####进入容器 sudo docker exec -it dc3224c8d60e /bin/bash source /opt/ros/noetic/setup.bash rviz ``` 即打开了rviz ![在这里插入图片描述](https://file.jishuzhan.net/article/1725814236749238273/0d4883d3f298e0e05aa11d81e63b3de5.webp)启动小乌龟 每次开启终端不知道为什么 都要 ```bash source /opt/ros/noetic/setup.bash ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1725814236749238273/b83be376d956eb2c45ac0cd1b3a07ae4.webp) ## 3.导出容器 如果我要导出名为cwc_docker的容器的当前状态(包括文件系统中的更改,但不包括已挂载卷的内容),可以使用docker export命令。这将创建一个包含容器文件系统的快照的tar文件: ```bash sudo docker export cwc_docker > cwc_docker.tar ``` 这条命令会将cwc_docker容器的文件系统导出到一个名为cwc_docker.tar的tar归档文件中。 但是呢 这个操作并不会导出以下内容: * 容器的元数据,如环境变量、默认命令、端口配置等。 * 容器的运行状态。 * 容器使用的卷中的数据。 如果我们需要重新创建具有相同配置的容器,包括环境变量、命令和卷等,可能需要使用docker commit来创建一个新的镜像,然后使用docker save来导出这个新的镜像。这样,我们就可以在另一台机器上使用docker load来加载这个镜像,并通过它来启动一个新的容器,该容器会反映cwc_docker当时的状态。以下是相关命令: ```bash # 将容器提交为新的镜像 sudo docker commit cwc_docker my_cwc_docker_image # 将镜像保存为tar文件 sudo docker save my_cwc_docker_image > my_cwc_docker_image.tar ``` 之后,我们就可以将my_cwc_docker_image.tar文件复制到其他计算机,并使用docker load导入它,然后使用docker run根据这个镜像启动一个新的容器。

相关推荐
君鼎1 小时前
C++设计模式——单例模式
c++·单例模式·设计模式
小声读源码2 小时前
【技巧】离线安装docker镜像的方法
docker·镜像·技巧·离线
刚入门的大一新生2 小时前
C++初阶-string类的模拟实现与改进
开发语言·c++
小冯的编程学习之路3 小时前
【软件测试】:推荐一些接口与自动化测试学习练习网站(API测试与自动化学习全攻略)
c++·selenium·测试工具·jmeter·自动化·测试用例·postman
C++ 老炮儿的技术栈4 小时前
什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
c语言·开发语言·c++·qt·算法
猪八戒1.04 小时前
C++ 回调函数和Lambda表达式
c++
源远流长jerry5 小时前
匿名函数lambda、STL与正则表达式
c++
tan180°6 小时前
Linux进程信号处理(26)
linux·c++·vscode·后端·信号处理
一只鱼^_6 小时前
牛客练习赛138(首篇万字题解???)
数据结构·c++·算法·贪心算法·动态规划·广度优先·图搜索算法
李匠20246 小时前
C++GO语言微服务之Dockerfile && docker-compose②
c++·容器