前言:
大家经常看到的虚拟机软件包括Docker,VMware,VirtualBox,Parallels Desktop,KVM(Kernel-based Virtual Machine),Hyper-V等等。Docker 是使用了是容器化技术(操作系统级别的虚拟化技术) ,使用非常广泛,其和传统虚拟机软件(如 VMware、VirtualBox、Parallels Desktop等)之间有几个重要的区别。
1.虚拟化方式:
传统虚拟机软件(如 VMware、VirtualBox 等):这些软件通过硬件虚拟化技术(如 Intel VT-x 或AMD-V)创建完整的虚拟化环境,每个虚拟机都运行一个完整的操作系统,并模拟硬件设备。因此,虚拟机之间的隔离性比较好,但启动和运行每个虚拟机都需要较多的系统资源。
Docker: Docker 使用了容器化技术,通过使用操作系统级别的虚拟化(例如 Linux容器)来创建容器。容器共享主机操作系统的内核,并在其上运行独立的用户空间。因此,相比传统虚拟机,Docker容器更加轻量级,启动和运行速度更快,并且更节省资源。
2. 资源利用:
传统虚拟机软件:由于每个虚拟机都运行一个完整的操作系统,因此会占用较多的系统资源,包括内存、处理器和存储空间。
Docker: Docker容器共享主机操作系统的内核和其他资源,因此它们更加轻量级,启动和运行速度更快,并且可以更有效地利用系统资源。
3. 隔离性:
传统虚拟机软件:由于每个虚拟机运行一个完整的操作系统,因此虚拟机之间的隔离性比较好。
Docker: Docker容器也提供了良好的隔离性,但它们共享主机操作系统的内核,因此容器之间的隔离性没有传统虚拟机那么好。
4. 部署和管理:
传统虚拟机软件:在传统虚拟机中,每个虚拟机都需要单独的操作系统安装和管理。虚拟机的创建、部署和管理都相对独立,需要更多的手动操作。
Docker: Docker 容器可以更轻松地创建、部署和管理。Docker 使用了镜像和容器的概念,可以更方便地分享和重复使用应用程序和服务,并且可以通过Dockerfile 自动化构建和部署容器。
其他使用容器化技术的虚拟机还包括Podman,rkt(Rocket),containerd,LXC(Linux Containers)等。
本文以树莓派5+ubuntu23.04 运行ros2 docker(ubuntu22.04+ros2)为例说明docker的基础使用。
1. 安装docker
Docker官网介绍几种安装Docker的方式
https://docs.docker.com/engine/install/ubuntu/
- 安装docker桌面应用:可以通过界面下载镜像/启动/关闭容器等操作,也可对通过界面对容器进行配置,如挂载目录,网络端口映射等,对于初学者较为友好。
- 安装docker命令行工具:通过命令行进行所有操作,需要熟悉docker常用命令的使用。
- 下载docker deb程序,然后手动安装
- 使用脚本安装
通常我们安装docker桌面应用或者命令行工具即可。
这里安装docker命令行工具
配置软件源
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
安装docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
运行hello-world示例
sudo docker run hello-world
查看创建的hello-world容器
2. 配置ROS2 docker容器
2.1 参考ros2 humble文档
https://docs.ros.org/en/humble/How-To-Guides/Installing-on-Raspberry-Pi.html
2.2 下载ros2 docker镜像
选择什么样的ros版本和版本选项,可参考
ROS2快速入门Python篇-版本梳理、环境搭建、源码架构介绍
https://blog.csdn.net/techfuture/article/details/137427653
这里选ros2 humble版本。
docker pull ros:humble-ros-core
2.3 运行humble-ros-core,生成一个新的容器
docker run -it --rm ros:humble-ros-core
docker run:创建一个新容器
-it:进入容器终端,并可通过指令交互
–rm:退出容器后,自动删除容器
此套指令通常用于启动一个临时的交互式容器,让用户可以在容器内执行命令并与其交互,且容器退出后自动删除,以保持系统的清洁和简洁。
注意,每次执行docker run都会产生一个新的容器,通常我们通过docker run --name创建指定名称的容器,后续使用docker start/stop/exec来启动/停止/进入该容器即可。具体操作可参考第3章Docker常用命令讲解章节。
3. docker基础命令讲解
3.1 镜像管理
下载镜像
docker pull <image_name>
查看下载了哪些docker镜像
docker images
删除image
sudo docker image rm hello-world:latest
注意区分docker image 和docker images
3.2 容器管理
创建容器
创建一个容器
docker run <image_name>
创建一个临时的交互式容器,让用户可以在容器内执行命令并与其交互,容器退出后自动删除。
docker run -it --rm <image_name>
创建名称为ros1的容器并挂载work目录
docker run -d -it --name=ros1 -v ~/work:/work <image_name>
docker run每次会生成一个新的容器,如果没有使用–name指定名称,docker ps显示的是随机名称,如下图。
启动容器
docker start <container_name>
关闭容器
docker stop <container_name>
docker start/stop:启动/关闭已有容器,不会删除容器中自己安装的软件和数据。
进入容器
docker exec -it <container_name> bash
查看运行容器
docker ps
查看容器配置信息
docker inspect <container_name>
删除容器
docker rm <container_name>
比如这里删除名为ros1的容器,删除后再使用docker ps -a查看,此容器已不存在。