1. 简介
图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
- Docker 是一种轻量级虚拟化技术,用于将应用及其所有依赖打包成容器,保证在任何环境中一致运行。
- Docker Compose 是 Docker 官方提供的多容器编排工具,通过一个 YAML 文件定义多个服务的配置,简化多容器应用的启动与管理。Compose 主要解决了多容器应用的配置和部署问题。
2.1 Docker Compose 与 Dockerfile 区别
Dockerfile | Docker Compose |
---|---|
定义单个容器的构建步骤 | 定义多容器的编排和运行方式 |
通过 docker build 生成镜像 | 通过 docker-compose up 启动服务 |
适用于单一服务 | 适用于多服务协作的应用 |
2.2 Compose 使用的三个步骤
- 使用 Dockerfile 定义应用的环境
- 使用 docker-compose.yml 定义构成应用的服务,配置它们在隔离环境中运行
- 执行
docker-compose up
命令来启动和运行整个应用
在 ROS 开发中,利用 Docker 和 Compose 可以快速搭建复杂依赖环境,避免本地环境配置繁琐,同时方便多个 ROS 相关服务(如机器人、传感器、可视化工具等)的协同工作。
3. 准备工作
-
安装 Docker
- Linux 用户请参考官方文档或使用包管理器安装 Docker。
- macOS 和 Windows 用户可直接安装 Docker Desktop,内置 Docker 和 Compose。
-
安装 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
检查安装是否成功。 -
-
准备 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
-
准备工作目录
新建目录用于放置 Dockerfile、docker-compose.yml 和启动脚本。
mkdir ros_docker cd ros_docker
4. Dockerfile 解析
下面是本文使用的支持 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"]