前言
- 最近的一个项目需要使用
ROS1,但当前开发环境为Ubuntu 22.04 LTS。众所周知,ROS1 Noetic最后仅支持到Ubuntu 20.04 LTS,因此引出了本篇内容。 - 本文将介绍如何在
Linux环境中配置支持 GPU 直通的Docker,并从零开始安装ROS1,同时搭建基础的GUI使用环境。
1 介绍
1-1 Docker
Docker是一种轻量级容器化技术,可以在宿主机上创建相互隔离的运行环境,使应用及其依赖能够以标准化方式打包、分发和运行。相比传统虚拟机,Docker具有更低的资源开销和更高的部署效率。
1-2 Docker的优点
Docker在工程实践中具有以下优势:- 环境隔离性强:不同项目之间依赖互不干扰
- 部署一致性高:开发、测试、生产环境表现一致
- 轻量高效:相比虚拟机占用资源更少
- 支持 GPU 直通(NVIDIA Container Toolkit):可直接在容器内调用显卡资源,适用于深度学习与机器人仿真等场景
1-3 ROS版本
- ROS(Robot Operating System)存在多个发行版本,其中 ROS1 的最终长期支持版本为 Noetic Ninjemys ,官方支持的系统环境为 Ubuntu 20.04 LTS。
- 而当前较新的系统(如 Ubuntu 22.04 LTS)默认面向 ROS2,因此在 ROS1 项目中通常需要借助容器或兼容环境来运行旧版本 ROS。
2 docker 安装
2-1 安装
bash
sudo apt update
sudo apt install docker.io
2-2 启动
- 启动 Docker 服务并设置为开机自启,确保系统重启后服务自动恢复。
bash
sudo systemctl enable docker
sudo systemctl start docker
2-3 加入docker组
- 为了避免每次执行 Docker 命令都需要
sudo,需要将当前用户加入 docker 用户组。
bash
getent group docker

bash
sudo usermod -aG docker $USER

bash
newgrp docker
2-4 验证安装
- 通过查看 Docker 版本信息,确认安装是否成功。
bash
docker --version

2-5 给docker配置代理
- 在网络受限或需要加速镜像拉取的环境中,可以为 Docker 配置 HTTP/HTTPS 代理。
bash
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
- 写入下属内容
- 注:
7897需要替换为你本地代理的端口
- 注:
bash
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7897"
Environment="HTTPS_PROXY=http://127.0.0.1:7897"
Environment="NO_PROXY=localhost,127.0.0.1,::1"
- 修改配置后需要重载 systemd 并重启 Docker,使配置生效。
bash
sudo systemctl daemon-reload
sudo systemctl restart docker
- 通过 systemd 环境变量查看 Docker 是否成功加载代理配置。
bash
systemctl show --property=Environment docker

3 docker显卡直连测试(没有GPU请跳过本节)
3-1 主机是否能识别到显卡
- 首先在宿主机中确认 NVIDIA 驱动是否正常安装,并能够正确识别到物理显卡。
bash
nvidia-smi

3-2 安装 runtime
- 安装 NVIDIA Container Toolkit,使 Docker 容器具备访问 GPU 的能力。
bash
sudo apt install -y nvidia-container-toolkit
sudo systemctl restart docker
3-3 测试GPU链路
- 通过运行官方 CUDA 测试容器,验证容器内是否能够正确调用宿主机 GPU。
bash
docker run --rm --gpus all nvidia/cuda:12.3.2-base-ubuntu20.04 nvidia-smi

4 安装ubuntu 20.04 LTS 与 ROS Noetic
4-1 拉取镜像
- 根据是否需要 GPU 计算能力,选择对应的基础镜像环境。
- 带GPU:
bash
docker pull nvidia/cuda:12.3.2-devel-ubuntu20.04

- 不带GPU:
bash
docker pull nvidia/cuda:12.3.2-devel-ubuntu20.04

4-2 启用容器
- 通过
docker run创建运行环境,并根据需求配置 GPU、网络代理以及 GUI 显示能力。
- 各参数说明:
--gpus all:允许容器访问所有 GPU--env NVIDIA_VISIBLE_DEVICES=all:指定 GPU 可见范围--env NVIDIA_DRIVER_CAPABILITIES=all,graphics,utility,compute:开启 GPU 全功能支持-e HTTP_PROXY=...:HTTP 流量走代理(apt / wget / git)-e HTTPS_PROXY=...:HTTPS 流量走代理(ROS 源下载)-e NO_PROXY=...:本地及内网地址不走代理-e DISPLAY=$DISPLAY:共享宿主机 X11 显示-v /tmp/.X11-unix:/tmp/.X11-unix:挂载 X11 socket,实现 GUI 显示
bash
docker run -it \
--name ros1-noetic \
--gpus all \
--env NVIDIA_VISIBLE_DEVICES=all \
--env NVIDIA_DRIVER_CAPABILITIES=all,graphics,utility,compute \
-e HTTP_PROXY=http://172.17.0.1:7897 \
-e HTTPS_PROXY=http://172.17.0.1:7897 \
-e NO_PROXY=localhost,127.0.0.1,::1,172.17.0.0/16 \
-e DISPLAY=$DISPLAY \
-e QT_X11_NO_MITSHM=1 \
-v /tmp/.X11-unix:/tmp/.X11-unix \
nvidia/cuda:12.3.2-devel-ubuntu20.04 \
bash
- 不带GPU:
bash
docker run -it \
--name ros1-noetic \
-e HTTP_PROXY=http://172.17.0.1:7897 \
-e HTTPS_PROXY=http://172.17.0.1:7897 \
-e NO_PROXY=localhost,127.0.0.1,::1,172.17.0.0/16 \
ubuntu:20.04 bash
- 最简模式:
bash
docker run -it --name ros1-noetic ubuntu:20.04 bash
注意 :Docker 的 GPU 能力属于运行时权限(runtime capability),必须在容器创建阶段通过
--gpus指定,创建后无法动态追加,因此应在设计阶段确定是否需要 GPU 支持。
4-3 进入容器
- 通过重新启动并进入容器,继续后续 ROS 安装流程。
bash
docker start -ai ros1-noetic
4-4 Docker 容器"持久化运行方式"
- 后台运行 + 进入
- start 用于启动容器,exec 用于进入运行中的容器,更适合开发调试场景。
bash
docker start ros1-noetic
docker exec -it ros1-noetic bash
4-5 快速启动
- 执行下属指令
bash
echo '
# =========================
# ROS1 Docker 快捷启动
# =========================
ros1() {
docker start ros1-noetic >/dev/null 2>&1
docker exec -it ros1-noetic bash
}
' >> ~/.bashrc
- 以后只需要终端输入
ros1即可启用容器
bash
ros1

提示:以下步骤均在 Docker 容器内部执行。
4-6 安装 ROS Noetic
- 在 Ubuntu 20.04 环境中配置 ROS 软件源并安装完整桌面版 ROS1。
bash
apt update
apt install -y curl gnupg2 lsb-release wget
- 添加 ROS 软件源:
bash
echo "deb http://packages.ros.org/ros/ubuntu focal main" > /etc/apt/sources.list.d/ros1.list
- 更换国内镜像源(可选,用于加速下载):
bash
sed -i 's|http://archive.ubuntu.com|http://mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list
echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu focal main" > /etc/apt/sources.list.d/ros-latest.list
- 添加 ROS GPG Key:
bash
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | apt-key add -
- 安装 ROS Noetic 完整桌面版:
bash
apt update
apt install -y ros-noetic-desktop-full
-
他会问你时区,选择
Asia-Shanghai即可
-
选择
English(US)

-
初始化 ROS 环境
bash
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
- 验证安装
bash
roscore

5 GUI 测试与打包镜像
5-1 显卡直连
- 如果在前文创建容器时使用了支持 CUDA 的基础镜像,并正确配置了
nvidia-container-toolkit,容器内即可直接访问宿主机 GPU 环境。
bash
nvidia-smi

5-2 宿主机允许 Docker 访问 X11
- 为了让 Docker 容器能够显示 GUI 程序,需要在宿主机上开放 X11 权限,使容器能够连接图形显示服务。
注意:该命令必须在宿主机执行,而不是容器内部。
bash
xhost +local:docker

5-3 GUI 测试(Gazebo)
- 在完成 X11 权限配置后,可以在容器中启动图形化程序,验证 GUI 转发是否正常工作。
bash
gazebo

5-4 打包镜像
- 在完成 ROS + GPU + GUI 环境配置后,可以将当前容器状态打包为镜像,方便后续复用或迁移到其他设备,避免重复环境搭建。
- 提交当前容器为镜像:
bash
docker commit ros1-noetic ros1-noetic:cuda-gui
- 查看生成的镜像:
bash
docker images
- 使用新镜像重新启动容器:
bash
docker run -it \
--name ros1-noetic-backup \
--gpus all \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
ros1-noetic:cuda-gui \
bash
5-5 拷贝文件
- 在 Docker 中,容器内部的文件系统与宿主机是隔离的,因此需要通过专用方式进行数据交互或持久化访问。
5-5-1 docker cp(临时拷贝)
- 从容器拷贝到本地
bash
docker cp ros1-noetic:/root/test.txt .
- 从本地拷贝到容器
bash
docker cp test.txt ros1-noetic:/root/
5-5-2 Volume 挂载(推荐)
- 用于开发环境的持久化数据管理。
- 启动容器时挂载目录
bash
docker run -it \
-v ~/ros_ws:/root/ros_ws \
ros1-noetic \
bash
总结
- 本文通过 Docker 在 Ubuntu 22.04 上构建 ROS1 Noetic + GPU + GUI 环境,实现了跨版本 ROS1 开发环境的隔离部署与可复现运行。
- 如有错误,欢迎指出!
- 感谢观看!
