linux ubuntu22.04安装ROS2::humble完整版的流程
前提准备:确保你的电脑里装有docker,如果没有需要安装docker
1. 下载ROS2::humble完整版镜像的命令
bash
docker pull osrf/ros:humble-desktop-full
如果需要指定其他版本,可选:
osrf/ros:humble-desktop- 桌面版(不含仿真工具)osrf/ros:humble-ros-base- 基础版(仅核心功能)osrf/ros:humble- 最新稳定版
2. 使用镜像
推荐使用脚本启动,可以自行更改配置。
bash
#!/bin/bash
# ================== 配置区 ==================
CONTAINER_NAME="ros2_humble_dev" # 容器名称
IMAGE_NAME="osrf/ros:humble-desktop-full" # ROS2镜像
WORKSPACE_HOST="/home/*******/ros2_ws" # 宿主机工作空间路径(修改为你自己的路径)
WORKSPACE_CONTAINER="/workspace" # 容器内工作空间路径
MEMORY="16g" # 内存限制
MEMORY_SWAP="20g" # 交换内存限制
CPUS="8" # CPU核心数限制
# ==========================================
# Linux: 允许容器访问 GUI(图形界面)
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
xhost +local:root >/dev/null 2>&1
fi
# 检查容器是否存在
if ! docker ps -aq -f name=^/${CONTAINER_NAME}$ 2>/dev/null | grep -q .; then
# 容器不存在,创建新容器
echo "正在创建新容器 $CONTAINER_NAME..."
docker run -d \
--name "$CONTAINER_NAME" \
--memory="$MEMORY" \
--memory-swap="$MEMORY_SWAP" \
--cpus="$CPUS" \
--network=host \ # 使用宿主机网络,方便ROS2多机通信
-v /dev/shm:/dev/shm \ # 共享内存,ROS2通信需要
-v /tmp/.X11-unix:/tmp/.X11-unix \ # 挂载X11套接字,用于显示GUI(rviz2、gazebo等)
-v "$WORKSPACE_HOST":"$WORKSPACE_CONTAINER" \ # 挂载工作空间,代码持久化
-w "$WORKSPACE_CONTAINER" \ # 设置容器默认工作目录
-e DISPLAY="$DISPLAY" \ # 设置显示器环境变量
-e XDG_RUNTIME_DIR=/tmp/runtime-root \ # 运行时目录
-e QT_X11_NO_MITSHM=1 \ # Qt程序兼容性设置
"$IMAGE_NAME" \
tail -f /dev/null # 保持容器运行
if [ $? -eq 0 ]; then
echo "容器创建成功"
sleep 2
# 配置 ROS2 环境(自动添加到bashrc)
docker exec "$CONTAINER_NAME" bash -c "echo 'source /opt/ros/humble/setup.bash' >> ~/.bashrc" 2>/dev/null
# 如果工作空间有install目录,自动source
docker exec "$CONTAINER_NAME" bash -c "echo '[ -f /workspace/install/setup.bash ] && source /workspace/install/setup.bash' >> ~/.bashrc" 2>/dev/null
else
echo "容器创建失败"
exit 1
fi
fi
# 检查容器是否在运行
if ! docker ps -q -f name=^/${CONTAINER_NAME}$ 2>/dev/null | grep -q .; then
echo "容器已停止,正在启动..."
docker start "$CONTAINER_NAME" >/dev/null
sleep 2
fi
# 进入容器
echo "进入容器 $CONTAINER_NAME..."
echo "提示:多个终端可以同时运行此命令,都会进入同一个容器"
docker exec -it "$CONTAINER_NAME" bash
3.丰富容器
往往仅依赖osrf/ros:humble-desktop-full这一个镜像无法满足我们的工作需求,我们还想在docker中使用某些软件,或者其他库等,则需要创建Dockerfile来构建新的镜像,这样才能在创建的docker中使用这些软件及库文件。
3.1 简单放一些工具及库进去。创建的Dockerfile名字别写错
bash
# ================== 基础镜像 ==================
FROM osrf/ros:humble-desktop-full
# ================== 环境配置 ==================
# 避免交互式安装
ENV DEBIAN_FRONTEND=noninteractive
# 可选:更换为国内源(加快下载速度,根据你的网络情况决定是否启用)
# 中科大源(推荐)
# RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
# 阿里云源
# RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# 清华源
# RUN sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
# ================== 安装基础开发工具 ==================
RUN apt-get update && apt-get install -y \
# 文本编辑器
vim \
gedit \
# 版本控制
git \
# 网络工具
wget \
curl \
# 编译工具
cmake \
build-essential \
gdb \
# 系统工具
htop \
tmux \
sudo \
tree \
unzip \
zip \
# Python 工具
python3-pip \
python3-venv \
# 清理缓存(减小镜像体积)
&& rm -rf /var/lib/apt/lists/*
# ================== 安装常用第三方库 ==================
RUN apt-get update && apt-get install -y \
# 图像处理
libopencv-dev \
python3-opencv \
# 点云处理
libpcl-dev \
# 线性代数
libeigen3-dev \
# 可视化
libgl1-mesa-dev \
libglu1-mesa-dev \
# 清理缓存
&& rm -rf /var/lib/apt/lists/*
# ================== 安装 Python 常用库 ==================
RUN pip3 install --no-cache-dir \
numpy \
scipy \
matplotlib \
pyyaml \
pandas
# ================== 配置环境 ==================
# 自动 source ROS2 环境
RUN echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
# 设置工作目录
WORKDIR /workspace
# 保持容器运行
CMD ["tail", "-f", "/dev/nulldocker build -t my_ros2_dev:latest .
"]
3.2 构建新的更丰富的镜像
bash
docker build -t my_ros2_dev:latest .
3.3 docker images命令查看你构建的镜像
3.4 运行容器
修改启动脚本run_ros2.sh 中的 IMAGE_NAME 为 my_ros2_dev:latest(你刚才构建的新Docker镜像),然后运行
bash
./run_ros2.sh
3.5 容器的常用操作命令
3.5.1 docker ps -a
执行 docker ps -a 会显示所有容器(包括运行中和已停止的),输出示例:
bash
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fcab3ad4f9cd osrf/ros:humble-desktop-full "tail -f /dev/null" 2 hours ago Up 2 hours ros2_humble_dev
e3d8fd034c1b image20260310:latest "/bin/bash" 5 days ago Exited (0) 2 days ago image20260310
4ec2381d5183 scllovewkf/opencalib:v1 "/ros_entrypoint.sh..." 2 weeks ago Up 2 weeks opencalib_dev
各列含义
| 列名 | 说明 | 示例值 |
|---|---|---|
| CONTAINER ID | 容器唯一ID(前12位) | fcab3ad4f9cd |
| IMAGE | 容器使用的镜像名称 | osrf/ros:humble-desktop-full |
| COMMAND | 容器启动时执行的命令 | "tail -f /dev/null" |
| CREATED | 容器创建时间 | 2 hours ago |
| STATUS | 容器当前状态 | Up 2 hours(运行中) Exited (0) 2 days ago(已停止) |
| PORTS | 端口映射(主机端口→容器端口) | 0.0.0.0:8080->80/tcp |
| NAMES | 容器名称(可自定义) | ros2_humble_dev |
STATUS 状态详解:
Up X minutes/hours:容器正在运行Exited (0):正常退出Exited (1):异常退出(程序错误)Created:已创建但未启动Restarting:正在重启Paused:已暂停
3.5.2 Docker 容器常用操作命令
| 操作分类 | 命令 | 说明 | 示例 |
|---|---|---|---|
| 查看容器 | docker ps |
查看运行中的容器 | docker ps |
docker ps -a |
查看所有容器(含停止的) | docker ps -a |
|
docker ps -q |
只显示容器ID | docker ps -q |
|
docker ps -a --format "table {``{.Names}}\t{``{.Status}}" |
自定义显示格式 | ||
| 创建/运行 | docker run IMAGE |
创建并启动容器 | docker run ubuntu |
docker run -it IMAGE bash |
创建并进入交互式终端 | docker run -it ubuntu bash |
|
docker run -d IMAGE |
后台运行容器 | docker run -d nginx |
|
docker run --name NAME IMAGE |
指定容器名称 | docker run --name my_ubuntu ubuntu |
|
| 启动/停止 | docker start CONTAINER |
启动已停止的容器 | docker start my_ubuntu |
docker stop CONTAINER |
停止运行中的容器 | docker stop my_ubuntu |
|
docker restart CONTAINER |
重启容器 | docker restart my_ubuntu |
|
docker pause CONTAINER |
暂停容器进程 | docker pause my_ubuntu |
|
docker unpause CONTAINER |
恢复暂停的容器 | docker unpause my_ubuntu |
|
| 进入容器 | docker exec -it CONTAINER bash |
进入容器执行命令(新终端) | docker exec -it my_ubuntu bash |
docker attach CONTAINER |
附加到容器主进程(不推荐) | docker attach my_ubuntu |
|
| 删除容器 | docker rm CONTAINER |
删除容器(需先停止) | docker rm my_ubuntu |
docker rm -f CONTAINER |
强制删除容器(运行中也可删) | docker rm -f my_ubuntu |
|
docker container prune |
删除所有停止的容器 | docker container prune |
|
| 日志/信息 | docker logs CONTAINER |
查看容器日志 | docker logs my_ubuntu |
docker logs -f CONTAINER |
实时跟踪日志输出 | docker logs -f my_ubuntu |
|
docker inspect CONTAINER |
查看容器详细信息(JSON格式) | docker inspect my_ubuntu |
|
docker top CONTAINER |
查看容器内进程 | docker top my_ubuntu |
|
docker stats CONTAINER |
查看容器资源使用情况 | docker stats my_ubuntu |
|
| 文件操作 | docker cp HOST_PATH CONTAINER:CONTAINER_PATH |
复制文件到容器 | docker cp ./file.txt my_ubuntu:/tmp/ |
docker cp CONTAINER:CONTAINER_PATH HOST_PATH |
从容器复制文件 | docker cp my_ubuntu:/tmp/file.txt ./ |
|
| 镜像操作 | docker images |
查看本地镜像列表 | docker images |
docker pull IMAGE |
拉取镜像 | docker pull ubuntu:22.04 |
|
docker rmi IMAGE |
删除镜像 | docker rmi ubuntu:22.04 |
|
docker build -t NAME . |
构建镜像 | docker build -t my_image . |
|
| 清理 | docker system prune |
删除所有停止的容器、未使用的镜像 | docker system prune |
docker system prune -a |
彻底清理(删除所有未使用的资源) | docker system prune -a |
3.6 常用组合命令示例
bash
# 1. 查看所有容器(包括停止的)
docker ps -a
# 2. 停止所有运行中的容器
docker stop $(docker ps -q)
# 3. 删除所有停止的容器
docker rm $(docker ps -aq)
# 4. 删除所有容器(包括运行中的,强制删除)
docker rm -f $(docker ps -aq)
# 5. 删除所有未使用的镜像
docker image prune -a
# 6. 进入容器并自动 source ROS2 环境
docker exec -it ros2_humble_dev bash -c "source /opt/ros/humble/setup.bash && bash"
# 7. 查看容器资源使用(实时监控)
docker stats
# 8. 在容器内执行单条命令(不进入交互式)
docker exec ros2_humble_dev ros2 topic list
# 9. 导出容器为镜像
docker commit ros2_humble_dev my_backup:latest
# 10. 保存镜像为tar文件
docker save -o my_image.tar my_ros2_dev:latest