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

📅 2026/7/4 20:46:08 👁️ 阅读次数 📝 编程学习
【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-1Docker
  • 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 安装
sudoaptupdatesudoaptinstalldocker.io

2-2 启动
  • 启动 Docker 服务并设置为开机自启,确保系统重启后服务自动恢复。
sudosystemctlenabledockersudosystemctl startdocker

2-3 加入docker组
  • 为了避免每次执行 Docker 命令都需要sudo,需要将当前用户加入 docker 用户组。
getent groupdocker

sudousermod-aGdocker$USER

newgrpdocker

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


2-5 给docker配置代理
  • 在网络受限或需要加速镜像拉取的环境中,可以为 Docker 配置 HTTP/HTTPS 代理。
sudomkdir-p/etc/systemd/system/docker.service.dsudonano/etc/systemd/system/docker.service.d/http-proxy.conf
  • 写入下属内容
    • 注:7897需要替换为你本地代理的端口
[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,使配置生效。
sudosystemctl daemon-reloadsudosystemctl restartdocker
  • 通过 systemd 环境变量查看 Docker 是否成功加载代理配置。
systemctl show--property=Environmentdocker


3 docker显卡直连测试(没有GPU请跳过本节)

3-1 主机是否能识别到显卡
  • 首先在宿主机中确认 NVIDIA 驱动是否正常安装,并能够正确识别到物理显卡。
nvidia-smi


3-2 安装 runtime
  • 安装 NVIDIA Container Toolkit,使 Docker 容器具备访问 GPU 的能力。
sudoaptinstall-ynvidia-container-toolkitsudosystemctl restartdocker

3-3 测试GPU链路
  • 通过运行官方 CUDA 测试容器,验证容器内是否能够正确调用宿主机 GPU。
dockerrun--rm--gpusall nvidia/cuda:12.3.2-base-ubuntu20.04 nvidia-smi


4 安装ubuntu 20.04 LTS 与 ROS Noetic

4-1 拉取镜像
  • 根据是否需要 GPU 计算能力,选择对应的基础镜像环境。
  • 带GPU:
dockerpull nvidia/cuda:11.8.0-devel-ubuntu20.04

  • 不带GPU:
dockerpull nvidia/cuda:11.8.0-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 显示
    • --privileged \: Docker 里一个最高权限开关,让容器“几乎等同于宿主机 root
dockerrun-it\--nameros1-noetic\--gpusall\--envNVIDIA_VISIBLE_DEVICES=all\--envNVIDIA_DRIVER_CAPABILITIES=all,graphics,utility,compute\-eHTTP_PROXY=http://172.17.0.1:7897\-eHTTPS_PROXY=http://172.17.0.1:7897\-eNO_PROXY=localhost,127.0.0.1,::1,172.17.0.0/16\-eDISPLAY=$DISPLAY\-eQT_X11_NO_MITSHM=1\-v/tmp/.X11-unix:/tmp/.X11-unix\-v/home/lzh/postgraduate0/SimEnv:/root/SimEnv--privileged\nvidia/cuda:11.8.0-devel-ubuntu20.04\bash
  • 不带GPU:
dockerrun-it\--nameros1-noetic\-eHTTP_PROXY=http://172.17.0.1:7897\-eHTTPS_PROXY=http://172.17.0.1:7897\-eNO_PROXY=localhost,127.0.0.1,::1,172.17.0.0/16\ubuntu:20.04bash
  • 最简模式:
dockerrun-it--nameros1-noetic ubuntu:20.04bash

注意:Docker 的 GPU 能力属于运行时权限(runtime capability),必须在容器创建阶段通过--gpus指定,创建后无法动态追加,因此应在设计阶段确定是否需要 GPU 支持。


4-3 进入容器
  • 通过重新启动并进入容器,继续后续 ROS 安装流程。
dockerstart-airos1-noetic

4-4 Docker 容器“持久化运行方式”
  • 后台运行 + 进入
  • start 用于启动容器,exec 用于进入运行中的容器,更适合开发调试场景。
dockerstart ros1-noeticdockerexec-itros1-noeticbash

4-5 快速启动
  • 执行下属指令
echo' # ========================= # ROS1 Docker 快捷启动 # ========================= ros1() { docker start ros1-noetic >/dev/null 2>&1 docker exec -it ros1-noetic bash } '>>~/.bashrc
  • 以后只需要终端输入ros1即可启用容器
ros1


提示:以下步骤均在 Docker 容器内部执行。


4-6 安装 ROS Noetic
  • 在 Ubuntu 20.04 环境中配置 ROS 软件源并安装完整桌面版 ROS1。
aptupdateaptinstall-ycurlgnupg2 lsb-releasewget
  • 添加 ROS 软件源:
echo"deb http://packages.ros.org/ros/ubuntu focal main">/etc/apt/sources.list.d/ros1.list
  • 更换国内镜像源(可选,用于加速下载):
sed-i's|http://archive.ubuntu.com|http://mirrors.tuna.tsinghua.edu.cn|g'/etc/apt/sources.listecho"deb http://mirrors.ustc.edu.cn/ros/ubuntu focal main">/etc/apt/sources.list.d/ros-latest.list
  • 添加 ROS GPG Key:
curl-shttps://raw.githubusercontent.com/ros/rosdistro/master/ros.asc|apt-keyadd-
  • 安装 ROS Noetic 完整桌面版:
aptupdateaptinstall-yros-noetic-desktop-full
  • 他会问你时区,选择Asia-Shanghai即可

  • 选择English(US)

  • 初始化 ROS 环境

echo"source /opt/ros/noetic/setup.bash">>~/.bashrcsource~/.bashrc
  • 验证安装
roscore


5 GUI 测试与打包镜像

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


5-2 宿主机允许 Docker 访问 X11
  • 为了让 Docker 容器能够显示 GUI 程序,需要在宿主机上开放 X11 权限,使容器能够连接图形显示服务。

注意:该命令必须在宿主机执行,而不是容器内部。

xhost +local:docker

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


5-4 打包镜像
  • 在完成 ROS + GPU + GUI 环境配置后,可以将当前容器状态打包为镜像,方便后续复用或迁移到其他设备,避免重复环境搭建。
  • 查看所有容器
dockerps-a

  • 查看所有镜像:
dockerimages

  • 提交当前容器为镜像:
dockercommit c0146b9913dc ros1-noetic:v1
  • 导出镜像为tar
dockersave-oros1-noetic-v1.tar ros1-noetic:v1
  • 转移镜像tar的时候可以和对一下哈希值是否一致
sha256sum ./ros1-noetic-v1.tar

  • 导入tar文件
dockerload-iros1-noetic-v1.tar
  • 使用新镜像重新启动容器:
dockerrun-it\--nameros1-noetic-v1\--gpusall\--envNVIDIA_VISIBLE_DEVICES=all\--envNVIDIA_DRIVER_CAPABILITIES=all,graphics,utility,compute\-eHTTP_PROXY=http://172.17.0.1:7897\-eHTTPS_PROXY=http://172.17.0.1:7897\-eNO_PROXY=localhost,127.0.0.1,::1,172.17.0.0/16\-eDISPLAY=$DISPLAY\-eQT_X11_NO_MITSHM=1\-v/tmp/.X11-unix:/tmp/.X11-unix\-v/home/lzh/postgraduate0/ROS/SimEnv:/root/SimEnv\--privileged\ros1-noetic:v1\bash
  • 查看容器状态
dockerstats
  • 删除镜像,建议删除前关闭所有正在使用的容器
dockerstop c0146b9913dcdockerrmi c0146b9913dc

5-5 拷贝文件
  • 在docker启动的时候可以直接通过-v挂载本地目录,从而规避文件拷贝。
  • 在 Docker 中,容器内部的文件系统与宿主机是隔离的,因此需要通过专用方式进行数据交互或持久化访问。
5-5-1 docker cp(临时拷贝)
  • 从容器拷贝到本地
dockercpros1-noetic:/root/test.txt.
  • 从本地拷贝到容器
dockercptest.txt ros1-noetic:/root/
5-5-2 Volume 挂载(推荐)
  • 用于开发环境的持久化数据管理。
  • 启动容器时挂载目录
dockerrun-it\-v~/ros_ws:/root/ros_ws\ros1-noetic\bash

总结

  • 本文通过 Docker 在 Ubuntu 22.04 上构建 ROS1 Noetic + GPU + GUI 环境,实现了跨版本 ROS1 开发环境的隔离部署与可复现运行。
  • 如有错误,欢迎指出!
  • 感谢观看!