ubuntu20.04开发ros2,使用docker安装部署的详细教程

学习docker的教程:可以直接在菜鸟教程上学习即可

阶段 0:系统检查

| 内容 | 建议 |

|------|------|

| 操作系统 | Ubuntu 22.04(与 ROS2 Humble 最匹配) |

| 用户权限 | 能执行 sudo |

🧩 阶段 1:在 Ubuntu 上安装 Docker(官方推荐方式)

1.1 卸载旧版本(若有)

复制代码
sudo apt remove docker docker-engine docker.io containerd runc

作用:避免冲突。

1.2 更新 apt 包索引 & 装依赖

复制代码
sudo apt update
sudo apt install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

作用:curl 用来下载 GPG key,lsb-release 用来识别系统版本。

1.3 添加 Docker 官方 GPG key

复制代码
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

作用:验证软件包来源,防止被篡改。

1.4 添加仓库源

复制代码
echo \
  "deb [arch=$(dpkg --print-architecture) \
  signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

作用:告诉 apt 去哪里下载 Docker 最新版。

1.5 更新并安装 Docker Engine + CLI + containerd

复制代码
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

作用:一次性装好核心组件。

1.6 验证安装成功

复制代码
sudo docker run hello-world

看到 "Hello from Docker!" 字样就成功了。

1.7(可选)让当前用户免 sudo 用 Docker

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

作用:避免每次命令前都写 sudo,提升开发体验。

🧱 阶段 2:拉取 ROS2 镜像(回顾 + 补充)

复制代码
docker pull osrf/ros:humble-desktop-full

> 作用:一次性把 ROS2 Humble 桌面完整版(ROS + RViz + Gazebo)下载到本地。镜像约 4 GB,耐心等待。

🐳 阶段 3:启动 ROS2 容器(带 GUI 支持)

3.1 允许宿主机显示 GUI

复制代码
xhost +local:docker

> 作用:让容器里的 GUI 程序能把窗口投射到宿主机。

3.2 创建并进入容器

复制代码
docker run -it \
  --name ros2_dev \
  --env="DISPLAY=$DISPLAY" \
  --env="QT_X11_NO_MITSHM=1" \
  --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
  --volume="$HOME/ros2_ws:/root/ros2_ws" \
  osrf/ros:humble-desktop-full \
  bash

指令解析

复制代码
| 参数         | 作用                    |
| ---------- | --------------------- |
| `-it`      | 交互模式,允许你进入容器内部        |
| `--name`   | 给容器起个名字,方便管理          |
| `--env`    | 设置环境变量,支持 GUI(如 RViz) |
| `--volume` | 挂载宿主机目录到容器里,方便代码共享    |
| `bash`     | 容器启动后执行的命令,进入 shell   |

> 作用:把宿主机目录 `$HOME/ros2_ws` 挂载到容器 `/root/ros2_ws`,实现**代码持久化**;同时打通 X11,让 RViz/Gazebo 能弹出窗口。

🧑‍💻 阶段 4:在容器内测试 ROS2

复制代码
source /opt/ros/humble/setup.bash
ros2 run turtlesim turtlesim_node

看到小乌龟窗口 = ✅ GUI 正常。

🛠️ 阶段 5:创建并编译 C++ ROS2 功能包(回顾 + 详细)

`bash

在容器里操作

复制代码
cd /root/ros2_ws
source /opt/ros/humble/setup.bash
ros2 pkg create --build-type ament_cmake my_cpp_pkg --dependencies rclcpp std_msgs

5.1 写节点代码

复制代码
vim my_cpp_pkg/src/my_node.cpp

粘贴:

复制代码
#include "rclcpp/rclcpp.hpp"

int main(int argc, char **argv)
{
  rclcpp::init(argc, argv);
  auto node = std::make_shared<rclcpp::Node>("my_first_node");
  RCLCPP_INFO(node->get_logger(), "Hello from Docker + ROS2 + C++!");
  rclcpp::spin(node);
  rclcpp::shutdown();
  return 0;
}

5.2 修改 CMakeLists.txt(让可执行文件被编译)

在 `my_cpp_pkg/CMakeLists.txt` 末尾追加:

复制代码
```cmake
add_executable(my_node src/my_node.cpp)
ament_target_dependencies(my_node rclcpp)

install(TARGETS
  my_node
  DESTINATION lib/${PROJECT_NAME})
```

5.3 编译

复制代码
cd /root/ros2_ws
colcon build --packages-select my_cpp_pkg
source install/setup.bash
ros2 run my_cpp_pkg my_node

🧰 阶段 6:用 VS Code 远程开发(可选但强烈推荐)

6.1 宿主机安装 VS Code 插件

复制代码
- Remote-Containers  #安装这个插件
- Docker

6.2 连接容器

  1. 打开 VS Code

  2. F1 → `Dev Containers: Attach to Running Container`

  3. 选 `ros2_dev`

  4. 打开 `/root/ros2_ws` 目录

  5. 安装 C++ 扩展、ROS 扩展,即可补全、调试

📦 阶段 7:把环境固化成镜像(可选)

如果你团队其他人也想用同样环境,可以写个 Dockerfile:

```Dockerfile

FROM osrf/ros:humble-desktop-full

安装常用工具

复制代码
RUN apt-get update && apt-get install -y \
    vim \
    git \
    gdb \
    && rm -rf /var/lib/apt/lists/*

把源码也放进去(演示)

COPY ./src /root/ros2_ws/src

WORKDIR /root/ros2_ws

RUN /bin/bash -c "source /opt/ros/humble/setup.bash && colcon build"

构建并推送:

复制代码
docker build -t my_ros2_cpp:latest .
docker tag my_ros2_cpp:latest your_dockerhub_user/my_ros2_cpp:latest
docker push your_dockerhub_user/my_ros2_cpp:latest