?學習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(TARGETSmy_nodeDESTINATION 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