【工具使用-Docker容器】構建自己的鏡像和容器

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

如果輸出包含 “Hello from Docker!” 的信息,說明安裝成功。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93861.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93861.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93861.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Apache Shiro550 漏洞(CVE-2016-4437):原理剖析與實戰 SOP

在 Web 安全領域&#xff0c;反序列化漏洞一直是威脅等級極高的存在&#xff0c;而 Apache Shiro 框架中的 Shiro550 漏洞&#xff08;CVE-2016-4437&#xff09;&#xff0c;更是因利用門檻低、影響范圍廣&#xff0c;成為滲透測試中頻繁遇到的經典漏洞。本文將從 “原理拆解”…

安卓開發者自學鴻蒙開發3持久化/數據與UI綁定

AppStorage,PersistentStorage與StorageLink AppStorage是應用全局狀態管理器,數據存儲于內存中,常見的如全局的黑暗模式,StorageLink是用來綁定AppStorage的鍵到ui上的工具,省去了用戶手寫代碼的無聊過程,PersistentStorage可以綁定AppStorage的鍵,自動持久化到磁盤,同時支持多…

GitHub宕機生存指南:從應急協作到高可用架構設計

GitHub宕機生存指南&#xff1a;從應急協作到高可用架構設計 摘要&#xff1a; GitHub作為全球開發者的協作中心&#xff0c;其服務穩定性至關重要。然而&#xff0c;任何在線服務都無法保證100%的可用性。本文深入探討了當GitHub意外宕機時&#xff0c;開發團隊應如何應對。我…

機器學習算法篇(十三)------詞向量轉化的算法思想詳解與基于詞向量轉換的文本數據處理的好評差評分類實戰(NPL基礎實戰)

目錄 一、詞向量原理介紹 (1). 詞向量的核心概念 (2). 傳統文本表示的局限性 1. 獨熱編碼&#xff08;One-Hot Encoding&#xff09; 2. 詞袋模型&#xff08;Bag of Words&#xff09; 3. TF-IDF (3). 詞向量的核心原理 (4). 主流詞向量模型 1. Word2Vec&#xff08;20…

JS自定義函數(2)

1. 變量的作用域全局變量定義&#xff1a;在函數外聲明的變量作用范圍&#xff1a;在整個JS文檔中生效生命周期&#xff1a;頁面關閉時銷毀局部變量定義&#xff1a;在函數內用 var 聲明的變量作用范圍&#xff1a;只能在函數內部使用生命周期&#xff1a;函數執行完畢時銷毀作…

【數據集】Argoverse 數據集:自動駕駛研究的強大基石

Argoverse數據集&#xff1a;自動駕駛研究的強大基石 在自動駕駛技術蓬勃發展的當下&#xff0c;高質量的數據集對于推動相關算法研究和模型訓練起著舉足輕重的作用。Argoverse 數據集便是其中的佼佼者&#xff0c;它為自動駕駛領域的眾多任務提供了豐富且優質的數據資源。 一、…

--- 哈希表和哈希沖突 ---

哈希&#xff08;散列&#xff09;方法是對插入的數據通過哈希函數計算出一個哈希地值&#xff0c;并將這個哈希地址作為儲存改數據的地址&#xff0c;這樣下次再查找這個數據時&#xff0c;只需要通過哈希函數再獲取到該地址然后直接去拿就好這樣就做到了不經過任何比較&#…

數學建模-評價類問題-優劣解距離法(TOPSIS)

1-AI帶你認識TOPSIS&#x1f4d8; 一、TOPSIS 方法簡介1. ??基本定義&#xff1a;????TOPSIS&#xff08;Technique for Order Preference by Similarity to an Ideal Solution&#xff09;??&#xff0c;中文通常稱為&#xff1a;???優劣解距離法?????逼近理想…

Go協程:從匯編視角揭秘實現奧秘

&#x1f680; Go協程&#xff1a;從匯編視角揭秘實現奧秘 #Go語言 #協程原理 #并發編程 #底層實現 引用&#xff1a; 關于 Go 協同程序&#xff08;Coroutines 協程&#xff09;、Go 匯編及一些注意事項。 &#x1f31f; 前言&#xff1a;重新定義并發編程范式 在當今高并發…

MySQL 事務(重點)

MySQL 這個東西注定是可能會被多個用戶/客戶端來同時訪問的&#xff0c;這是肯定的&#xff0c;MySQL 中存放的都是數據&#xff0c;數據可能有一個上層線程在用&#xff0c;也有可能另一個線程也要用...數據是被所有人共享的&#xff0c;所以就注定了 MySQL 這樣的服務在一個時…

uniapp:h5鏈接拉起支付寶支付

場景&#xff1a;APP內點擊支付寶支付&#xff0c;后臺返回類似鏈接https://qr.alipay.com/bax***********c3050 通常做法是&#xff0c;使用plus.runtime.openURL(deeplink);先打開瀏覽器&#xff0c;瀏覽器會提示打開支付寶&#xff0c;之后是支付流程。現在可以省略跳轉h5的…

吳恩達 Machine Learning(Class 3)

Week 11.1 K-means Cluster centroidK-means 是無監督學習中聚類算法的一種&#xff0c;核心在于更新聚類質心&#xff1b;首先將每個點分配給幾個聚類質心&#xff0c;取決于那些點離哪個質心更近&#xff1b;然后將幾個聚類質心移動到分配給他的所有點的平均值&#xff0c;不…

MyBatis 動態查詢語句詳解:讓 SQL 更靈活可控

MyBatis 動態查詢語句詳解&#xff1a;讓 SQL 更靈活可控 在日常的數據庫操作中&#xff0c;我們經常會遇到需要根據不同條件拼接 SQL 語句的場景。比如查詢用戶時&#xff0c;可能需要根據姓名、年齡、性別等多個條件進行篩選&#xff0c;而這些條件往往是動態變化的 —— 有時…

Java基礎語法three

一、一維數組一維數組初始化數據類型[] 數組名new 數據類型[數組長度]//動態初始化數據類型[] 數組名new 數據類型[]{值}//靜態初始化數據類型[] 數組名{值}數組長度一旦確定&#xff0c;就不可更改。數組是序排序&#xff1b;數組屬于引用數據類型的變量&#xff0c;數組的元素…

【數據結構】排序算法全解析:概念與接口

1.排序的概念及其運用 1.1 排序的概念 排序&#xff1a;所謂排序&#xff0c;就是使一串記錄&#xff0c;按照其中的某個或某些關鍵字的大小&#xff0c;遞增或遞減的排列起來的操作。 穩定性&#xff1a;假定在待排序的記錄序列中&#xff0c;存在多個具有相同的關鍵字的…

在 CentOS 7 上使用 LAMP 架構部署 WordPress

CentOS 7 LAMP 架構部署 WordPress全步驟本文將詳細介紹如何在 CentOS 7 系統上通過 LAMP&#xff08;Linux Apache MariaDB PHP&#xff09;架構部署 WordPress 博客平臺。 在CentOS 7上基于LAMP架構部署WordPress 一、系統基礎配置 1. 修改主機名&#xff08;本機IP&#…

Node.js導入MongoDB具體操作

在Node.js應用程序中&#xff0c;導入MongoDB是一項常見任務。本文將詳細介紹如何在Node.js中連接和操作MongoDB數據庫&#xff0c;包括安裝必要的包、配置連接、執行基本的CRUD操作等步驟。1. 安裝必要的包首先&#xff0c;確保你已經安裝了Node.js和npm。然后&#xff0c;通過…

HTML--pre標簽的作用

原文網址&#xff1a;HTML--pre標簽的作用-CSDN博客 簡介 本文介紹HTML里pre標簽的作用。 <pre> 元素表示預定義格式文本。里邊的文本會保留原格式&#xff0c;以等寬字體的形式展現出來&#xff0c;文本中的空白符&#xff08;比如空格和換行符&#xff09;都會顯示出…

機器學習--數據預處理

目錄 一、數據清洗&#xff1a;讓數據純凈如新 1、缺失值處理&#xff1a; 2、異常值處理 3、重復值處理 二、數據變換&#xff1a;重塑數據的 “形狀” 1、歸一化 2、標準化 三、總結與展望 機器學習小白必看&#xff1a;數據預處理實戰筆記 最近投身于機器學習的學習…

Python 數據可視化:Matplotlib 與 Seaborn 實戰

Python 數據可視化&#xff1a;Matplotlib 與 Seaborn 實戰????在當今數據驅動的時代&#xff0c;數據可視化成為了理解和傳達數據信息的關鍵手段。Python 作為一門強大的編程語言&#xff0c;擁有豐富的數據可視化庫&#xff0c;其中 Matplotlib 和 Seaborn 尤為突出。本文…