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