【工具使用-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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 尤为突出。本文…