【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.io2-2 启动
- 启动 Docker 服务并设置为开机自启,确保系统重启后服务自动恢复。
sudosystemctlenabledockersudosystemctl startdocker2-3 加入docker组
- 为了避免每次执行 Docker 命令都需要
sudo,需要将当前用户加入 docker 用户组。
getent groupdockersudousermod-aGdocker$USERnewgrpdocker2-4 验证安装
- 通过查看 Docker 版本信息,确认安装是否成功。
docker--version2-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=Environmentdocker3 docker显卡直连测试(没有GPU请跳过本节)
3-1 主机是否能识别到显卡
- 首先在宿主机中确认 NVIDIA 驱动是否正常安装,并能够正确识别到物理显卡。
nvidia-smi3-2 安装 runtime
- 安装 NVIDIA Container Toolkit,使 Docker 容器具备访问 GPU 的能力。
sudoaptinstall-ynvidia-container-toolkitsudosystemctl restartdocker3-3 测试GPU链路
- 通过运行官方 CUDA 测试容器,验证容器内是否能够正确调用宿主机 GPU。
dockerrun--rm--gpusall nvidia/cuda:12.3.2-base-ubuntu20.04 nvidia-smi4 安装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.044-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-noetic4-4 Docker 容器“持久化运行方式”
- 后台运行 + 进入
- start 用于启动容器,exec 用于进入运行中的容器,更适合开发调试场景。
dockerstart ros1-noeticdockerexec-itros1-noeticbash4-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- 验证安装
roscore5 GUI 测试与打包镜像
5-1 显卡直连
- 如果在前文创建容器时使用了支持 CUDA 的基础镜像,并正确配置了
nvidia-container-toolkit,容器内即可直接访问宿主机 GPU 环境。
nvidia-smi5-2 宿主机允许 Docker 访问 X11
- 为了让 Docker 容器能够显示 GUI 程序,需要在宿主机上开放 X11 权限,使容器能够连接图形显示服务。
注意:该命令必须在宿主机执行,而不是容器内部。
xhost +local:docker5-3 GUI 测试(Gazebo)
- 在完成 X11 权限配置后,可以在容器中启动图形化程序,验证 GUI 转发是否正常工作。
gazebo5-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 c0146b9913dc5-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 开发环境的隔离部署与可复现运行。
- 如有错误,欢迎指出!
- 感谢观看!
