【Linux Docker 配置 Ubuntu 20.04 ROS1 Noetic 环境完整教程】显卡直通到GUI适配

前言

  • 最近的一个项目需要使用 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 开发环境的隔离部署与可复现运行。
  • 如有错误,欢迎指出!
  • 感谢观看!