docker安装与镜像打包
文章目录
- 前言
- 一、docker安装
- 1.1、下载docker安装包
- 1.2、解压
- 1.3、移动
- 1.4、docker注册成系统服务
- 1.5、添加文件权限
- 1.6、设置开机启动
- 1.7、启动docker
- 1.8、测试是否启动
- 二、镜像加载
- 2.1、镜像准备
- 2.2、加载镜像
- 2.3、查看已加载镜像
- 2.4、进入镜像
- 三、打包镜像
- 3.1、创建 Dockerfile
- 3.2、构建镜像
- 3.3、运行容器
- 3.4、导出镜像
前言
- 想必大家都遇到过类似的困扰,拿到git上的一套代码,想在本机上运行,又缺少环境。配制环境,不是遇到缺少库,就是版本不兼容各种问题。
- 大家共同开发一套代码,如果有共同的服务器,配置一次环境大家都可以用,如果没有,就需要每个人都需要配置环境,又费时又费力。
- 这时候就需要我们的docker。docker是什么,Docker 是一个开源的容器化平台,用于开发、运输和运行应用程序。它将应用程序及其依赖项打包到一个可移植的容器中,确保在任何环境中都能一致地运行。简单来说,就是只要一个人把运行环境配置好,把环境打包分享出来,其他人直接用docker加载这个文件,分分钟就可以运行代码。当然,你也可以把你的环境打包分享给其他人。
一、docker安装
1.1、下载docker安装包
wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.6.tgz
1.2、解压
tar -zxvf docker-24.0.6.tgz
1.3、移动
移动到/usr/bin目录
sudo cp docker/* /usr/bin/
1.4、docker注册成系统服务
gedit /etc/systemd/system/docker.service
没有gedit的,下面命令安装
sudo apt update
sudo apt install gedit
复制下面内容写入docker.service文件
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s[Install]
WantedBy=multi-user.target
1.5、添加文件权限
sudo chmod +x /etc/systemd/system/docker.service
sudo systemctl daemon-reload
1.6、设置开机启动
sudo systemctl enable docker.service
1.7、启动docker
sudo systemctl start docker
1.8、测试是否启动
sudo docker run hello-world
到这里就算完成了,显示 unable to find image 先不用管
二、镜像加载
2.1、镜像准备
如果没有docker,按照上文一安装,如果有了 docker,需要一个已经打包完成的镜像
假设打包的镜像命名为 ros.tar。
2.2、加载镜像
docker load -i ros.tar # ros.tar 修改为自己名字
如果镜像较大,需要等待数分钟
2.3、查看已加载镜像
docker images
这时候会显示镜像对应的属性表格
REPOSITORY TAG IMAGE ID CREATED SIZE
2.4、进入镜像
docker run -it REPOSITORY:TAG
假设 REPOSITORY 为 ros,TAG 为 latest,则
docker run -it ros:latest
三、打包镜像
同样的,我们也可以把自己的镜像打包分享给他人使用
下面以打包 ros2_humble ubuntu22.04 基础环境为例
3.1、创建 Dockerfile
基础环境最好通过 Dockerfile 创建,创建名为 Dockerfile 的文件
touch Dockerfile
复制以下内容
# 使用Ubuntu 22.04作为基础镜像
FROM ubuntu:22.04# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive# 更新包管理器并安装ROS 2依赖
RUN apt-get update && apt-get install -y \locales \curl \gnupg2 \lsb-release \&& locale-gen en_US.UTF-8 \&& apt-get install -y software-properties-common \&& add-apt-repository ppa:osrfoundation/osrf-ros2 \&& apt-get update && apt-get install -y \ros-humble-desktop \&& apt-get clean && rm -rf /var/lib/apt/lists/*# 设置工作目录
WORKDIR /workspace# 启动bash
CMD ["/bin/bash"]
3.2、构建镜像
保存了上述 Dockerfile 文件,在同一目录下运行下面命令
docker build -t ros2-ubuntu .
如果这一步显示网络失败,需要梯子进行,我试过国内许多源,现在都被禁止了。如果有梯子,需进行如下设置。亲测有效,具体是参考一位博主的操作。
-
创建或编辑 Docker 的系统代理配置文件:
创建目录并编辑代理配置文件:
sudo mkdir -p /etc/systemd/system/docker.service.d sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
-
添加以下内容:
[Service] Environment="HTTP_PROXY=http://127.0.0.1:7890" Environment="HTTPS_PROXY=http://127.0.0.1:7890" Environment="NO_PROXY=localhost,127.0.0.1"
注意:将
http://127.0.0.1:7890
替换为 Clash 监听的实际代理地址和端口。如果 Clash 使用其他端口,请相应调整。 -
保存并退出编辑器。
-
重新加载 systemd 配置并重启 Docker:
sudo systemctl daemon-reload sudo systemctl restart docker
-
验证配置
尝试拉取一个小的 Docker 镜像,验证配置是否正确。例如:
docker pull hello-world
3.3、运行容器
假设镜像名是ros2-ubuntu
docker run -it ros2-ubuntu
如果想在容器内部访问、编译本地代码。可以运行容器时使用-v选项将本地代码目录挂载到容器中。
docker run -it -v /home/jeff:/home ros2-ubuntu
例如我把本地 /home/jeff 目录挂载到镜像 /home 目录下。如此在镜像home目录就可以访问 本机 /home/jeff 目录下的代码了
3.4、导出镜像
如果编译代码的时候发现镜像里缺少了一些库,想自己在镜像里安装,然后再打包出去,可以如此操作。
以安装 yaml-cpp 安装包为例。进入镜像安装 yaml-cpp 库
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=ON ..
make
sudo make install
** 注:过程中不要 exit 退出镜像 ** 退出再进入,需要重新安装 yaml-cpp 库。为了不用反复安装,我们可以重新打包一份镜像,下次直接加载新镜像。
docker save -o ros2.tar my-id # ros2.tar可以换成自定义名称;my-image镜像名或ID。 docker images可以查看
相关文章:

docker安装与镜像打包
文章目录 前言一、docker安装1.1、下载docker安装包1.2、解压1.3、移动1.4、docker注册成系统服务1.5、添加文件权限1.6、设置开机启动1.7、启动docker1.8、测试是否启动 二、镜像加载2.1、镜像准备2.2、加载镜像2.3、查看已加载镜像2.4、进入镜像 三、打包镜像3.1、创建 Docke…...

“新物种”即将上线,极氪MIX是近几年最“好玩”的新车?
像极氪MIX这样有创意的新能源车 除了概念车外,市面上真的很少能看到类似的量产车 别致可爱的造型、新颖的对开门设计、百变的空间布局 同时兼顾了MPV大空间以及SUV的操控乐趣和通过性 妥妥的“新物种” A级车车长D级车轴距,配合隐藏式双B柱电动对开…...
【Flutter】路由与导航:复杂导航与深度链接
在开发大型 Flutter 应用时,复杂的导航管理是不可避免的。除了基本的页面跳转与返回操作外,很多应用会用到 嵌套路由、页面分组、TabBar 和 Drawer 的结合使用等复杂导航场景,甚至支持 深度链接 和 动态路由。本文将深入探讨这些高级导航技巧…...
07 实战:视频捕获
代码如下: import tkinter as tk # 导入tkinter库,用于创建图形用户界面 from tkinter import ttk, filedialog, messagebox # 导入tkinter的额外部件、文件对话框和消息框 import cv2 # 导入OpenCV库,用于图像处理 import numpy as np # 导入NumPy库,用于数值计算 from P…...

前端页面使用google地图api实现导航功能,开发国外网站免费简单好用
开发国外软件的时候,想使用goole map实现导航等功能,可以使用google的api来做,官方文档地址:https://developers.google.com/maps/documentation/urls/get-started?hlzh-cn ,比如: 支持的请求的操作&…...

UE4 材质学习笔记12(水体反射和折射)
一.水体反射和折射 首先就是要断开所有连接到根节点的线,因为水有很多不同的节点成分,当所有其他节点都在用时 要分辨出其中一个是何效果是很难的。 虚幻有五种不同的方法可以创建反射,虚幻中的大多数场景使用多种这些方法 它们会同时运作。…...

Go:error处理机制和函数
文章目录 error处理机制函数函数作为参数匿名函数匿名函数和闭包闭包运用闭包与工厂模式 error处理机制 本篇总结的是Go中对于错误的处理机制 Go 语言的函数经常使用两个返回值来表示执行是否成功:返回某个值以及 true 表示成功;返回零值(或…...

智能指针(3)
目录 可能问题五: 问题分析: 答案格式: shared_ptr的模拟实现 部分1:引用计数的设计(分考点1) 代码实现: 部分2:作为类所必须的部分(分考点2) 代码实现: 部分3:拷贝构造函数…...

spring源码拓展点3之addBeanPostProcesser
概述 在refresh方法中的prepareBeanFactory方法中,有一个拓展点:addBeanPostProcessor。即通过注入Aware对象从而将容器中的某些值设置到某个bean中。 beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));aware接口调用 …...

【计网】理解TCP全连接队列与tcpdump抓包
希望是火,失望是烟, 生活就是一边点火,一边冒烟。 理解TCP全连接队列与tcpdump抓包 1 TCP 全连接队列1.1 重谈listen函数1.2 初步理解全连接队列1.3 深入理解全连接队列 2 tcpdump抓包 1 TCP 全连接队列 1.1 重谈listen函数 这里我们使用…...

react18中实现简易增删改查useReducer搭配useContext的高级用法
useReducer和useContext前面有单独介绍过,上手不难,现在我们把这两个api结合起来使用,该怎么用?还是结合之前的简易增删改查的demo,熟悉vue的应该可以看出,useReducer类似于vuex,useContext类似…...

排序算法 —— 冒泡排序
目录 1.冒泡排序的思想 2.冒泡排序的实现 3.冒泡排序的总结 1.冒泡排序的思想 冒泡排序的思想就是在待排序序列中依次比较相邻两个元素,将大的or小的元素往后挪,每一趟都能保证将至少一个元素挪动到正确的位置,然后在待排序序列中重复该过…...

QT--文本框 QLineEdit、qtextedit
在Qt中,文本框(QLineEdit 或 QTextEdit)和标签(QLabel)是两种不同的部件(widget),它们的主要区别在于用途和功能: QLabel(标签) 用途࿱…...

Qt编写的modbus模拟器/支持网络和串口以及websocket/支持网络rtu
一、使用说明 1.1 设备模拟-Com 第一步,填写要模拟的设备地址,0表示自动处理,也就是收到什么地址就应答什么地址。第二步,填写对应的串口号和波特率。第三步,单击打开串口,成功后会变成关闭串口字样。单击…...
Standard_Matrix
文章目录 假设我们有一个样本矩阵X,每一列表示一个样本,现在我们要把样本转换成均值为0,方差为1的样本矩阵 X s t a n d a r d X − μ s \begin{equation} X_{standard}\frac{X-\mu}{s} \end{equation} XstandardsX−μpython 测试…...
js 通过input,怎么把选择的txt文件转为base64格式
文章目录 基本概念与作用说明Base64编码File对象相互转换的意义 从File对象到Base64编码从Base64编码到File对象批量转换File对象为Base64编码批量转换Base64编码为File对象功能使用思路思路一:动态生成预览思路二:异步处理与用户反馈思路三:…...
华为HCIP-openEuler认证详解
华为HCIP认证(Huawei Certified ICT Professional)是华为提供的专业级ICT技术认证,它旨在验证技术人员在特定技术领域的专业知识和实践能力。对于华为欧拉(openEuler)方向的HCIP认证,即HCIP-openEuler&…...

YOLO11改进 | 注意力机制 | 添加双重注意力机制 DoubleAttention【附代码+小白必备】
秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 在本文中,给大家带来的教程是…...

sentinel原理源码分析系列(四)-ContextEntry
启动和初始化完成后,调用者调用受保护资源,触发sentinel的机制,首先构建或获取Context和获取Entry,然后进入插槽链,决定调用是否通过,怎样通过 上图展示构建Context和获取Entry的类互动图 获取或构建Conte…...

Tcp协议讲解与守护进程
TCP协议:面向链接,面向字节流,可靠通信 创建tcp_server 1.创建套接字 域:依旧选择AF_INET 连接方式: 选择SOCK_STREAM 可靠的 2.bind 3.监听装置 client要通信,要先建立连接࿰…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
数据库——redis
一、Redis 介绍 1. 概述 Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点: 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应 多数据结构支持&…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势
一、WebRTC与智能硬件整合趋势 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...
ffmpeg(三):处理原始数据命令
FFmpeg 可以直接处理原始音频和视频数据(Raw PCM、YUV 等),常见场景包括: 将原始 YUV 图像编码为 H.264 视频将 PCM 音频编码为 AAC 或 MP3对原始音视频数据进行封装(如封装为 MP4、TS) 处理原始 YUV 视频…...