在本地新建一个基于ros的docker文件(镜像)

找一个喜欢的地方用mkdir命令新建一个文件夹:为之后生成docker文件做准备,也就是Dockerfile

mkdir folder_name

folder_name为文件夹名,也是新建的镜像名字(比如,我的是rocker,没啥特殊意思,就是个名字)

cd folder_name
vim Dockerfile  //第一个字母必须大写

docker compose up使用本地镜像 docker运行本地镜像_容器

      如果没有vim,就安装一个vim,命令如下:

sudo apt-get install vim

docker compose up使用本地镜像 docker运行本地镜像_运维_02

 安装好vim后,在你的dockerfile中开启终端,用vim编辑器打开

docker compose up使用本地镜像 docker运行本地镜像_vim_03

ros_version 改成你要安装部署的ros版本(我的是noetic , 如果要安装melodic的话就输入melodic即可.

FROM osrf/ros:ros_version-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 \
 vim \
 libpcl-dev \
 libcanberra-gtk-moduleRUN echo "export SVGA_VGPU10=0" >> ~/.bashrc && \
 echo "source /opt/ros/ros_version/setup.bash" >> ~/.bashrc && \
 echo "QT_X11_NO_MITSHM=1" >> ./etc/environment

如果你的version版本也是 noetic,那么直接复制下面的代码就好

FROM osrf/ros:noetic-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 \
vim \
libpcl-dev \
libcanberra-gtk-module

RUN echo "export SVGA_VGPU10=0" >> ~/.bashrc && \
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc && \
echo "QT_X11_NO_MITSHM=1" >> ./etc/environment

保存,退出。(vim操作)

docker compose up使用本地镜像 docker运行本地镜像_docker_04

docker compose up使用本地镜像 docker运行本地镜像_运维_05

保存Dockerfile文件,在当前文件夹中创建一个终端,输入:

docker build -t folder_name .

请注意这条命令最后的“点”,不要丢

docker compose up使用本地镜像 docker运行本地镜像_vim_06

 

 成功build之后,用 docker images 语句 查询本地的镜像,看看我们的rocker镜像是否成功创建

docker compose up使用本地镜像 docker运行本地镜像_docker_07

(为什么不说 “进入了我们的rocker镜像” ,我的理解是:因为镜像是静态的,我们把它部署到本地装装好之后,要用它的时候,运行它,它现在是激活态,我们可以对它操作了,这个时候把它叫容器,所以我把镜像和容器当做一个东西了,没毛病)

首先输入:

sudo xhost +

成功后会打印” access control disabled, clients can connect from any host”

关于xhost +:

X server是Linux系统里面图形接口服务器的简称。因为Linux的图形界面并不是系统的必要组成部分,当需要它提供界面的时候,系统就会建立一个或者数个X server,通过X协议跟窗口管理器交互,由独立于系统的应用程序来产生窗口,状态栏,按钮之类的交互界面。当从宿主机登陆到容器上运行容器的程序时,作为程序来说,宿主机是客户机,但是作为图形来说,它是在宿主机上显示的,需要使用宿主机的X server,所以宿主机是server。因此在登陆到容器前,需要在宿主机上运行xhost +来使其它用户能够访问宿主机的Xserver。

再输入:

sudo docker run -it --device=/dev/dri --group-add video --volume=/tmp/.X11-unix:/tmp/.X11-unix  --env="DISPLAY=$DISPLAY"  --name=dfminer rocker  /bin/bash

container_name是容器(仓库)名, image_name是镜像名(我的dockerhub上的用户名,也就是我的仓库名叫dfminer,所以,我的container_name写的是 dfminer,image_name写的是rocker)

成功后会进入 root 模式,我们在这里可以输入roscore启动ros核心,之后就和正常的ros操作系统一样操作就好。

docker compose up使用本地镜像 docker运行本地镜像_docker_08

到这里就已经结束了,我们已经成功在本地创建一个新的docker镜像(ros的)。

若要启用多个终端:

sudo docker exec -it container_name /bin/bash

在容器内可以用ubuntu的方式安装所需的各种依赖。

ros 工程的编译要使用catkin_make