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要通信,要先建立连接࿰…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...