1. 镜像和容器介绍
- 镜像(Image)是一个只读的模板,包含了运行某个应用所需的全部内容,比如:
- 操作系统(比如 Ubuntu)
- 应用程序代码
- 运行环境(如 Python、Java、Node.js 等)
- 库和依赖、
- 容器(Container)是镜像的一个“运行实例”(runtime instance)。
- 当你运行一个镜像时,Docker 会基于镜像启动一个容器。
- 容器拥有自己的文件系统、进程空间、网络等,但它们依然运行在宿主机(Host)的内核之上。
- 一个镜像可以启动多个容器(互相独立)
2. 镜像(Image)创建与管理
2.1. Harbor镜像管理
Harbor 是一个 企业级的 Docker 镜像仓库
2.2. 构建Docker镜像(Docker Image)
1. 创建项目目录
mkdir ros2-humble-docker
cd ros2-humble-docker
2. 写Dockerfile
vim Dockerfile
# Ubuntu 22.04 + ROS2 Humble + CUDA + PyTorch Docker镜像
FROM nvidia/cuda:11.8.0-devel-ubuntu22.04# 避免交互式安装时的提示
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai# 设置工作目录
WORKDIR /workspace# 更新系统并安装基础依赖
RUN apt-get update && apt-get upgrade -y && \apt-get install -y \curl \wget \gnupg2 \lsb-release \ca-certificates \software-properties-common \build-essential \cmake \git \vim \htop \net-tools \iputils-ping \sudo \tzdata \locales \python3 \python3-pip \python3-dev \python3-setuptools \&& rm -rf /var/lib/apt/lists/*# 设置时区和语言环境
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \locale-gen en_US.UTF-8
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US:en
ENV LC_ALL=en_US.UTF-8# 安装ROS2 Humble
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# 安装ROS2基础包(不包含有问题的cyclonedx包)
RUN apt-get update && \apt-get install -y \ros-humble-desktop \ros-humble-rmw-fastrtps-cpp \ros-dev-tools \python3-colcon-common-extensions \python3-rosdep \python3-vcstool \&& rm -rf /var/lib/apt/lists/*# 初始化rosdep(处理网络超时问题)
RUN rosdep init || echo "rosdep init failed, continuing..." && \rosdep update --include-eol-distros || echo "rosdep update failed, continuing..."# 安装Python依赖(调整PyTorch版本以匹配CUDA 11.8)
RUN pip3 install --no-cache-dir \torch==1.13.1+cu117 \torchvision==0.14.1+cu117 \torchaudio==0.13.1 \--extra-index-url https://download.pytorch.org/whl/cu117RUN pip3 install --no-cache-dir \numpy \opencv-python \matplotlib \scipy \scikit-learn \pandas \pillow \requests \pyyaml \tqdm# 设置ROS2环境变量
RUN echo "source /opt/ros/humble/setup.bash" >> /root/.bashrc && \echo "export ROS_DOMAIN_ID=0" >> /root/.bashrc && \echo "export RMW_IMPLEMENTATION=rmw_fastrtps_cpp" >> /root/.bashrc# 创建ROS2工作空间
RUN mkdir -p /workspace/ros2_ws/src
WORKDIR /workspace/ros2_ws# 设置环境变量
ENV ROS_DISTRO=humble
ENV ROS_VERSION=2
ENV ROS_PYTHON_VERSION=3# 暴露常用端口
EXPOSE 11311# 设置启动脚本
RUN echo '#!/bin/bash\nsource /opt/ros/humble/setup.bash\nexec "$@"' > /entrypoint.sh && \chmod +x /entrypoint.shENTRYPOINT ["/entrypoint.sh"]
CMD ["/bin/bash"]
3. 构建镜像
sudo docker build -t ubuntu22.04-ros2-humble-cuda11.8-pytorch1.13 .
4. 验证镜像
# 查看构建的镜像
sudo docker images | grep ros2# 测试运行
sudo docker run -itd --shm-size=16g -v /mnt:/mnt --name test-ros2 --network host ubuntu22.04-ros2-humble-cuda11.8-pytorch1.13# 进入容器测试
sudo docker exec -it test-ros2 bash# 在容器内测试ROS2
source /opt/ros/humble/setup.bash
ros2 --help
2.3. 推送到Harbor仓库
1. 本地镜像打标签(Tag)
- 本地镜像名字是:ubuntu22.04-ros2-humble-cuda11.8-pytorch1.13
- 推送到 Harbor 的项目xxx下的仓库 ros2_humble,标签为 ubuntu22.04-ros2-humble-cuda11.8-pytorch1.13,命令如下:
docker tag ubuntu22.04-ros2-humble-cuda11.8-pytorch1.13 xx:8888/library/ros2_humble:latest# xx:8888 是 Harbor 的地址和端口。
# library/ros2_humble 是你 Harbor 上的项目和仓库。
# :latest 是镜像标签,可以改成任何你需要的版本号。
2. 登录 Harbor
如果是第一次推送,需要先登录:
docker login xx:88888
系统会提示你输入用户名和密码(Harbor 的账户)。
登录成功后会显示 Login Succeeded。
3. 推送镜像
- 执行 push 命令:
docker push xxx:8888/library/ros2_humble:latest
这个过程可能需要几分钟,取决于镜像大小和网络速度。
- 验证:可以在 Harbor Web 页面中看到新推送的镜像。
3. Docker安装与使用
3.1. Ubuntu安装Docker
在 Ubuntu 20.04 上安装 Docker 的步骤如下
1. 更新系统包索引
sudo apt-get update
2. 安装必要的依赖
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
3. 添加 Docker 的GPG 密钥
添加阿里云 GPG 密钥
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyringscurl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
4. 添加 Docker 的 APT 源
# 写入阿里云软件源
echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \$(lsb_release -cs) stable" | \sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
5. 再次更新包索引
sudo apt-get update
6. 安装 Docker CE(Community Edition)
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
7. 验证 Docker 是否安装成功
sudo docker --version
输出类似 Docker version 20.x.x, build xxxxxxx
表示安装成功。
8. 设置非 root 用户运行 Docker
默认情况下,Docker 需要 root 权限。若想以非 root 用户运行:
sudo usermod -aG docker $USER
然后注销并重新登录,或者运行:
newgrp docker
9. (可选)设置 Docker 开机自启并启动服务
sudo systemctl enable docker
sudo systemctl start docker
10. 配置 Docker 镜像加速器
编辑或新建配置文件:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://docker.m.daocloud.io","https://mirror.baidubce.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com"]
}
EOF
保存后重启 Docker:
sudo systemctl daemon-reexec
sudo systemctl restart docker
11. 测试 Docker 安装
运行一个简单的容器验证:
docker run hello-world