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

📅 2026/7/4 20:28:05
【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-1DockerDocker是一种轻量级容器化技术可以在宿主机上创建相互隔离的运行环境使应用及其依赖能够以标准化方式打包、分发和运行。相比传统虚拟机Docker具有更低的资源开销和更高的部署效率。1-2 Docker的优点Docker在工程实践中具有以下优势环境隔离性强不同项目之间依赖互不干扰部署一致性高开发、测试、生产环境表现一致轻量高效相比虚拟机占用资源更少支持 GPU 直通NVIDIA Container Toolkit可直接在容器内调用显卡资源适用于深度学习与机器人仿真等场景1-3 ROS版本ROSRobot 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]EnvironmentHTTP_PROXYhttp://127.0.0.1:7897EnvironmentHTTPS_PROXYhttp://127.0.0.1:7897EnvironmentNO_PROXYlocalhost,127.0.0.1,::1修改配置后需要重载 systemd 并重启 Docker使配置生效。sudosystemctl daemon-reloadsudosystemctl restartdocker通过 systemd 环境变量查看 Docker 是否成功加载代理配置。systemctl show--propertyEnvironmentdocker3 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 Noetic4-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_DEVICESall指定 GPU 可见范围--env NVIDIA_DRIVER_CAPABILITIESall,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 里一个最高权限开关让容器“几乎等同于宿主机 rootdockerrun-it\--nameros1-noetic\--gpusall\--envNVIDIA_VISIBLE_DEVICESall\--envNVIDIA_DRIVER_CAPABILITIESall,graphics,utility,compute\-eHTTP_PROXYhttp://172.17.0.1:7897\-eHTTPS_PROXYhttp://172.17.0.1:7897\-eNO_PROXYlocalhost,127.0.0.1,::1,172.17.0.0/16\-eDISPLAY$DISPLAY\-eQT_X11_NO_MITSHM1\-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_PROXYhttp://172.17.0.1:7897\-eHTTPS_PROXYhttp://172.17.0.1:7897\-eNO_PROXYlocalhost,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 21 docker exec -it ros1-noetic bash } ~/.bashrc以后只需要终端输入ros1即可启用容器ros1提示以下步骤均在 Docker 容器内部执行。4-6 安装 ROS Noetic在 Ubuntu 20.04 环境中配置 ROS 软件源并安装完整桌面版 ROS1。aptupdateaptinstall-ycurlgnupg2 lsb-releasewget添加 ROS 软件源echodeb http://packages.ros.org/ros/ubuntu focal main/etc/apt/sources.list.d/ros1.list更换国内镜像源可选用于加速下载sed-is|http://archive.ubuntu.com|http://mirrors.tuna.tsinghua.edu.cn|g/etc/apt/sources.listechodeb http://mirrors.ustc.edu.cn/ros/ubuntu focal main/etc/apt/sources.list.d/ros-latest.list添加 ROS GPG Keycurl-shttps://raw.githubusercontent.com/ros/rosdistro/master/ros.asc|apt-keyadd-安装 ROS Noetic 完整桌面版aptupdateaptinstall-yros-noetic-desktop-full他会问你时区选择Asia-Shanghai即可选择English(US)初始化 ROS 环境echosource /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导出镜像为tardockersave-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_DEVICESall\--envNVIDIA_DRIVER_CAPABILITIESall,graphics,utility,compute\-eHTTP_PROXYhttp://172.17.0.1:7897\-eHTTPS_PROXYhttp://172.17.0.1:7897\-eNO_PROXYlocalhost,127.0.0.1,::1,172.17.0.0/16\-eDISPLAY$DISPLAY\-eQT_X11_NO_MITSHM1\-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 开发环境的隔离部署与可复现运行。如有错误欢迎指出感谢观看