Docker是一款免费软件,与将其引入开源社区的公司同名。读者可能听说过Python中的虚拟环境,可以在其中为项目创建独立的环境并安装专用的依赖项,这些依赖项不会对其他环境中的其他项目造成任何影响。Docker与Python的虚拟环境类似,我们可以通过Docker为项目创建称为 容器 的独立环境。容器的工作方式类似于虚拟机,但与虚拟机有所不同。虚拟机在硬件层上需要一个单独的操作系统,但容器不在硬件层上独立工作,而是仅共享主机的资源。这有助于消耗更少的内存,而且它通常比虚拟机更快。图1.18展示了两者之间的区别。
图1.18 虚拟机与Docker的区别
了解了虚拟机与Docker之间的区别之后,下面我们来学习一下怎样使用Docker。
在ROS中,一个项目可能包含多个元包,每一个元包都包含对应的子包,每一个包的正常工作都需要对应的依赖项。对于开发人员来说,在ROS中设置功能包是非常麻烦的,因为不同的功能包使用的依赖项既可能相同也可能不同,相同的依赖项又可能是不同的版本,这些情况是十分常见的,而又有可能导致编译问题。一个典型的例子是,当我们想要在ROS Indigo中使用OpenCV3时,不同版本的视觉算法或gazebo_ros_controller功能包将会导致著名的严重错误( https://github.com/ros-simulation/gazebo_ros_pkgs/issues/612 )。当开发人员试图进行修复时,可能会因在修复过程中更改了功能包或依赖项的版本而导致项目无法工作。解决上述问题的方法有许多种,一种较为有效的方法是在ROS中使用Docker容器。与操作系统中的任何进程不同,容器速度很快,可以在几秒内启动或停止。操作系统或软件包上的任何升级或更新都不会影响内部的容器或外部的其他容器。
可以通过两种方法安装Docker:通过Ubuntu仓库;使用Docker官方仓库。
·如果读者只是想要快捷安装Docker,则可以选择从Ubuntu仓库安装,因为只需执行一行命令,并且能够节省一些时间;
·如果读者想要较为深入地了解Docker,而不是仅仅通过本书的概述来了解,则推荐通过Docker的官方仓库安装,因为其版本更加稳定,有相应bug的修复,还有一些新的特性。
在进行安装之前,请执行以下命令来对apt包索引进行更新:$sudo apt-get update
从Ubuntu仓库安装Docker只需执行以下命令:
在通过上述方法安装Docker之后,如果读者想要移除Docker,或者想要体验从Docker官方仓库进行安装的过程,则可以通过下面的方法将已经安装的Docker移除。
如果读者想要用最新的稳定版Docker替换已经安装的旧版本,则可以使用以下命令移除已安装的Docker,移除之后,即可从Docker官方仓库安装最新的Docker。移除的命令如下:
上述命令是移除Docker的通用命令,将移除Docker、docker-engine、docker.io(这些是旧版本的名称),如果有运行时容器的话,也会一同移除。
从Docker仓库安装的步骤如下:
1)执行以下命令:
2)添加源自Docker的官方GPG密钥:
3)执行以下命令来配置Docker官方仓库:
官方Docker提供了三个更新通道,分别是稳定通道、夜间通道以及测试通道。测试通道提供用于可用性测试的预发行版,夜间通道是正在开发中的版本或beta版本,稳定通道是已修复bug的最终确定版本。Docker团队的最佳建议是稳定通道;但是,感兴趣的读者可以通过将stable替换为nightly或test来测试其他两个通道。
4)再次更新apt包索引:
5)使用以下命令安装Docker包:
6)使用上述两种方法中的任意一种完成Docker的安装后,均可以使用以下命令查看Docker的版本:
当前Ubuntu仓库中的最新版本为17.12,Docker官方仓库的最新版本则是18.09(稳定版)。
默认情况下,Docker只能作为根用户运行。为便于运行,读者可以使用以下命令将自己的用户名添加到Docker组:
为了使得设置生效,需要重启系统,否则可能会遇到“permission denied”(权限拒绝)错误,如图1.19所示。
图1.19 权限拒绝错误
上述错误的一个快速修复方法是在任何Docker命令之前使用sudo。
容器由Docker镜像构建,这些镜像可以从Docker Hub( https://hub.docker.com/ )中提取。我们可以使用以下命令从ros仓库中提取ROS容器:
如果命令运行无误,将得到如图1.20所示的输出。
图1.20 成功提取Docker
读者可以指定特定的ROS版本来工作。对于任何应用程序,最好的建议是从melodic-core开始,因为在这里可以继续工作并更新与项目目标相关的容器,而不必安装其他不必要的组件。读者可以使用以下命令查看Docker镜像:
默认情况下,所有的容器均保存在/var/lib/docker目录下。使用前面的命令,可以标识仓库名称和标记。在本书的例子中,对于ros仓库名称,相应的标记是melodic-ros-core。因此,可以使用以下命令运行ros容器:
$docker images命令提供的其他信息是容器ID,在本书的例子中是7c5d1e1e5096。当读者想移除容器时,将会用到该ID信息。进入Docker后,可以使用以下命令检查可用的ROS功能包:
运行和退出Docker时,将会创建另一个容器,因此对于初学者来说,经常会在不知不觉中创建一系列容器。读者可以使用$docker ps-a或$docker ps-l查看所有活动/非活动的容器或最新的容器,并使用$docker rm<docker_name>删除容器。要继续在同一容器中工作,可以使用以下命令:
这里,silly_volhard是所创建容器的默认名称。
现在,你打开了同一容器,则可以安装ROS功能包并将相应的更改提交给Docker。使用下面的命令安装actionlib_tutorials功能包:
现在,当再次检查ROS功能包列表时,将能够查看到一些额外的功能包。由于你已经修改了容器(安装了上述功能包),所以在重新打开Docker镜像时需要提交修改。使用以下命令退出容器并提交修改:
现在我们已经在Ubuntu和VirtualBox上安装了ROS,下面让我们学习如何设置ROS工作空间。