使用 Docker 和 Docker Compose 安装与运行 ROS 1 CUDA教程

1. 简介

b347278e62eb68d7a4fe6a686ebc43b6.png

图1:Docker + ROS1 + CUDA 架构示意图

本文将结合 Dockerfile、docker-compose.yml 以及自定义的启动脚本,详细介绍如何通过 Docker 容器环境快速搭建基于 Ubuntu 20.04 的 ROS1 Noetic 开发环境。文中内容适合有一定 Docker 基础的用户,帮助你快速上手 ROS 容器化开发。特别地,本教程包含了对 CUDA 11.8 的支持,使您可以利用 NVIDIA GPU 进行加速计算。


2. 什么是 Docker 和 Docker Compose

c608a82d322388a61139c91c3a2f1a02.png

  • Docker 是一种轻量级虚拟化技术,用于将应用及其所有依赖打包成容器,保证在任何环境中一致运行。

53a24801903e6c0e366b870d5c4ac3a4.png

  • Docker Compose 是 Docker 官方提供的多容器编排工具,通过一个 YAML 文件定义多个服务的配置,简化多容器应用的启动与管理。Compose 主要解决了多容器应用的配置和部署问题。

2.1 Docker Compose 与 Dockerfile 区别

DockerfileDocker Compose
定义单个容器的构建步骤定义多容器的编排和运行方式
通过 docker build 生成镜像通过 docker-compose up 启动服务
适用于单一服务适用于多服务协作的应用

2.2 Compose 使用的三个步骤

  1. 使用 Dockerfile 定义应用的环境
  2. 使用 docker-compose.yml 定义构成应用的服务,配置它们在隔离环境中运行
  3. 执行 docker-compose up 命令来启动和运行整个应用

在 ROS 开发中,利用 Docker 和 Compose 可以快速搭建复杂依赖环境,避免本地环境配置繁琐,同时方便多个 ROS 相关服务(如机器人、传感器、可视化工具等)的协同工作。


3. 准备工作

  1. 安装 Docker

    • Linux 用户请参考官方文档或使用包管理器安装 Docker。
    • macOS 和 Windows 用户可直接安装 Docker Desktop,内置 Docker 和 Compose。
  2. 安装 Docker Compose

    • Linux 用户可使用以下命令安装最新版本:

      sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
      sudo chmod +x /usr/local/bin/docker-compose
      

      或者使用国内加速地址:

      sudo curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
      sudo chmod +x /usr/local/bin/docker-compose
      
    • macOS 和 Windows 用户通常已包含 Compose,无需额外安装。

    可通过执行 docker-compose version 检查安装是否成功。

  3. 准备 NVIDIA 支持(如需使用 GPU)

    确保已安装 NVIDIA 驱动和 NVIDIA Container Toolkit:

    # 检查 NVIDIA 驱动是否已安装
    nvidia-smi
    
    # 安装 NVIDIA Container Toolkit
    distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
    curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
    curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
    sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
    sudo systemctl restart docker
    
  4. 准备工作目录

    新建目录用于放置 Dockerfile、docker-compose.yml 和启动脚本。

    mkdir ros_docker
    cd ros_docker
    

4. Dockerfile 解析

2e559c21b6d2410583d78410a1b5e3d2.png

下面是本文使用的支持 Ubuntu 20.04 + ROS1 Noetic + CUDA 11.8 的 Dockerfile 主要内容及说明:

FROM ros:noetic

ENV DEBIAN_FRONTEND=noninteractive
ENV LANG=en_US.UTF-8
ENV LC_ALL=en_US.UTF-8

# 设置时区和语言环境
RUN apt-get update && apt-get install -y \
    locales tzdata sudo curl wget gnupg2 lsb-release software-properties-common && \
    locale-gen en_US en_US.UTF-8 && \
    update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
    ln -fs /usr/share/zoneinfo/Etc/UTC /etc/localtime && dpkg-reconfigure -f noninteractive tzdata

# 安装基本工具和依赖
RUN apt-get update && apt-get install -y \
   wget git sudo nano net-tools iputils-ping build-essential \
    libgl1-mesa-glx

# 安装 ROS1 Noetic
#RUN sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' && \
#    curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | apt-key add - && \
#    apt-get update && apt-get install -y \
#    ros-noetic-desktop-full \
#    python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool \
#    python3-catkin-tools python3-osrf-pycommon && \
#    rosdep init && rosdep update

# 注释掉 ROS2 Foxy 安装部分
# RUN curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg && \
#     echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | tee /etc/apt/sources.list.d/ros2.list > /dev/null && \
#     apt-get update && apt-get install -y \
#     ros-foxy-desktop \
#     python3-colcon-common-extensions

# 安装 oh-my-zsh,提升终端体验(可选)
RUN apt-get install -y zsh && \
    sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended || true && \
    chsh -s $(which zsh)

# 安装 CUDA 11.8
RUN wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin && \
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600 && \
    apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub && \
    add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /" && \
    apt-get update && apt-get install -y cuda-11-8

# 设置 CUDA 环境变量
ENV PATH=/usr/local/cuda-11.8/bin:${PATH}
ENV LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:${LD_LIBRARY_PATH}

# 安装 cuDNN v8.7.0 for CUDA 11.8
WORKDIR /tmp
RUN wget https://developer.download.nvidia.com/compute/redist/cudnn/v8.7.0/local_installers/11.8/cudnn-linux-x86_64-8.7.0.84_cuda11-archive.tar.xz && \
    tar -xvf cudnn-linux-x86_64-8.7.0.84_cuda11-archive.tar.xz && \
    cp -P cudnn-linux-x86_64-8.7.0.84_cuda11-archive/include/cudnn.h /usr/local/cuda-11.8/include && \
    cp -P cudnn-linux-x86_64-8.7.0.84_cuda11-archive/lib/libcudnn* /usr/local/cuda-11.8/lib64/ && \
    chmod a+r /usr/local/cuda-11.8/lib64/libcudnn* && \
    rm -rf cudnn-linux-x86_64-8.7.0.84_cuda11-archive cudnn-linux-x86_64-8.7.0.84_cuda11-archive.tar.xz

# 清理 apt 缓存以减小镜像体积
RUN rm -rf /var/lib/apt/lists/*

# 设置 ROS1 环境变量自动加载(移除 ROS2)
RUN echo "source /opt/ros/noetic/setup.zsh" >> ~/.zshrc
#RUN echo "source /opt/ros/foxy/setup.zsh" >> ~/.zshrc
RUN echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
#RUN echo "source /opt/ros/foxy/setup.bash" >> ~/.bashrc

# 创建 ROS 工作空间目录
RUN mkdir -p /root/catkin_ws/src    # ROS1 工作空间
# RUN mkdir -p /root/ros2_ws/src      # ROS2 工作空间(已注释)
RUN mkdir -p /root/ros_docker

# 复制自定义启动脚本,设置执行权限
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/docker-entrypoint.sh

WORKDIR /root
ENTRYPOINT ["docker-entrypoint.sh"]

4.1 Dockerfile 指令详解

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值