使用Docker部署ROS程序

docker常用命令

命令 功能
docker version 查看docker的版本
docker info 查看docker的详细信息
docker images 查看本地所有镜像
docker pull 镜像名 拉取镜像
docker push 镜像名 推送镜像
docker images nginx 查看本地与nginx的相关的镜像
docker ps -a 查看当前所有容器的状态(包括没有运行的)
docker ps 查看当前正在运行的容器的状态
docker network ls 列出当前有哪些网络类型
docker container ls 查看正在运行的容器
docker build -t image . 用当前目录下Dockerfile创建镜像image
docker run -it —name vm1 image 使用镜像image创建容器vm1,并运行,并进入交互界面
docker run -it —rm image 用image镜像创建容器,并运行,运行完成之后,立即删除
docker inspect container 查看容器container的详情
docker inspect image 查看镜像image的详情
docker search 镜像名的一部分 查找镜像
docker rmi image 删除镜像image
docker rm container 删除容器container
docker stop vm1 停止容器vm1(容器vm1存在,并运行)
docker start vm1 启动容器vm1(容器vm1存在,但没有运行)
docker kill vm1 强制干掉容器vm1(容器vm1存在,并运行)
docker top vm1 查看容器vm1的进程

运行docker run image-name命令后,docker会先从本地查找这个image,如果没有,就会从Docker Hub查找,有则下载然后运行,如果没有就会报错返回。

由于Hyper-V,docker与VMWare不兼容,不能同时开启

编译docker image

1
2
3
FROM ros:kinetic-ros-base
# install ros tutorials packages
RUN apt-get update && apt-get install -y ros-kinetic-ros-tutorials ros-kinetic-common-tutorials && rm -rf /var/lib/apt/lists/

命令只有两行,FROM一行表示引入的基础镜像,这个是Docker Hub上已有的,第二行是镜像中运行的命令,从网上下载几个kinetic的官方package

编译image: docker build --tag ros:ros-tutorials .,现在image中有ros-tutorials这个package了

创建虚拟网络

使用命令docker network create foo创建网络foo

运行roscore

1
docker run -it --rm  --net foo --name master ros:ros-tutorials roscore

结果是这样的,ROS_MASTER_URI实际是镜像ID,重启镜像后就变了。不过没关系,其他节点不必每次都用这个ID,用master这个名称就行

执行rostopic

运行了roscore之后,执行命令docker exec -it master bash,进入了ROS环境,master是上面—name的参数。进入ROS后,执行命令
source /ros_entrypoint.sh或者source /opt/ros/kienetic/setup.bash

现在可以使用ROS命令了,rostopic list会显示所有话题

执行Publisher

1
docker run -it --rm --net foo --name talker --env ROS_HOSTNAME=talker --env ROS_MASTER_URI=http://master:11311 ros:ros-tutorials rosrun roscpp_tutorials talker

执行Subscriber

1
docker run -it --rm --net foo --name listener --env ROS_HOSTNAME=listener --env ROS_MASTER_URI=http://master:11311 ros:ros-tutorials rosrun roscpp_tutorials listener