当前位置: 首页 > news >正文

[docker] 镜像部分补充

[docker] 镜像部分补充

这里补充一下比较少用的,关于镜像的内容

检查镜像

docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
<none>       <none>    ca61c1748170   2 hours ago   1.11GB
node         latest    5212d7dd5bd4   3 days ago    1.1GB
mysql        latest    374f9fbf70c1   5 days ago    632MB

这里可以看到,<none>,也就是新建的 node-app 其实比 node 原生的镜像要大 0.01GB,换算一下大概就是 10MB,而这 10MB 的大小差距来源于 node-app 需要下载的依赖。

这是因为 docker 是基于 layered filesystem 去实现的,下一个 layer 的操作会基于当前 layer,而 node-app,也就是一个基于 node 实现的 web server 本质上还是一个 node 项目,因此它不会从 0 开始重新构建一个 node 镜像,再基于新建的 node 镜像去构建当前的 web server。

它只会基于已经构建好的 node——即 image id 为 5212d7dd5bd4 的这个镜像,并基于这一层 layer,继续向上搭建 web server。也因此,<none> 会比 node 要大一些。想要证明这一点非常简单,可以使用 inspect 去查看当前的镜像:

docker image inspect 5212d7dd5bd4
[{"Id": "sha256:5212d7dd5bd47bdb28f596750f68fbb475ad051bdba32f5a1d2e6a750069aa81","RepoTags": ["node:latest"],"RepoDigests": ["node@sha256:162d92c5f1467ad877bf6d8a098d9b04d7303879017a2f3644bfb1de1fc88ff0"],"Parent": "","Comment": "","Created": "2024-04-11T12:21:21.646446739Z","Container": "5814b0bd41a0adc4f07e9b6449a5afd4f92a40770b89ffeb3f60b0335b0928c5","ContainerConfig": {"Hostname": "5814b0bd41a0","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","NODE_VERSION=21.7.3","YARN_VERSION=1.22.19"],"Cmd": ["/bin/sh","-c","#(nop) ","CMD [\"node\"]"],"Image": "sha256:85f0ffd6a031d8a604f7d534e731d4a412a792c39344c2fb4005affe1aba99ba","Volumes": null,"WorkingDir": "","Entrypoint": ["docker-entrypoint.sh"],"OnBuild": null,"Labels": {}},"DockerVersion": "20.10.23","Author": "","Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","NODE_VERSION=21.7.3","YARN_VERSION=1.22.19"],"Cmd": ["node"],"Image": "sha256:85f0ffd6a031d8a604f7d534e731d4a412a792c39344c2fb4005affe1aba99ba","Volumes": null,"WorkingDir": "","Entrypoint": ["docker-entrypoint.sh"],"OnBuild": null,"Labels": null},"Architecture": "amd64","Os": "linux","Size": 1101251706,"VirtualSize": 1101251706,"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/0120615c0012670dc3d352cdeaeedd8e3aa8dc0008a0a166369f8ee2cffe8bac/diff:/var/lib/docker/overlay2/feef30efd0b7c390e12a4998aa5f08aa13c9fad586ae627bf1626f3b56affb26/diff:/var/lib/docker/overlay2/56e0d197241406562c57c96728af909a7d8c8fded6080d526c72f07ea7384814/diff:/var/lib/docker/overlay2/785fbe8456bd460a93d2c60aa7938899fd06d047b9de9be072ddfa581d1e0605/diff:/var/lib/docker/overlay2/315f0f6be659e15ff235095c3783fffcb93221f209c3076c9d1771687a208b85/diff:/var/lib/docker/overlay2/2ef691d415b3ccd00315d51ad1116bbb516f174b23ecd0d203fe7c4e311a6d9a/diff:/var/lib/docker/overlay2/07b75e22620844e3c3b138f5299a34dcd0f00710ec3fefe1c1640fcc824fc50b/diff","MergedDir": "/var/lib/docker/overlay2/67d833bc973de2206a5db2442e0724fcf61f158e7e72a905ffff103357d6ac53/merged","UpperDir": "/var/lib/docker/overlay2/67d833bc973de2206a5db2442e0724fcf61f158e7e72a905ffff103357d6ac53/diff","WorkDir": "/var/lib/docker/overlay2/67d833bc973de2206a5db2442e0724fcf61f158e7e72a905ffff103357d6ac53/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:c5bb35826823702969891b025087135cceefb084dec1452af5a6fb2938bd9a13","sha256:51a9318e6edf3a8fc69a835bb72afad53bd7fe585b9729d588c3def0dc77ba59","sha256:2353f7120e0e42dcaa9600a35b3bd17cf6de488379c0be841a239a6562efd7b9","sha256:893507f6057f8f0532ae8907fb5470f4a0181181bdbe139c2706d47cc4a88600","sha256:3e81cc85b636db8bd382419d540e21e06331c3f1749750219c961c4c309c0068","sha256:47181ad0eb6656ac1818b39c8f0300718530f27aa9bcbc9fc5da7cfa8e37fd29","sha256:9f017d2bee1ce5a4a4f2516d22d910b595061870a2228051c07547596162a321","sha256:3a72264cad047850514e368525894bb1268ac10fcc850d9f2afaaf1ad805e29c"]},"Metadata": {"LastTagTime": "0001-01-01T00:00:00Z"}}
]

这个指令会返回一个 JSON 对象,其中 Layers 这个对象包含构建当前 node 镜像的所有 layers,也就是所有步骤。通过对比另一个 web app 可以看到,node 镜像中的 layer,也出现在了 web app 里:

docker image inspect ca61c1748170 | grep "Layers" -A 13"Layers": ["sha256:c5bb35826823702969891b025087135cceefb084dec1452af5a6fb2938bd9a13","sha256:51a9318e6edf3a8fc69a835bb72afad53bd7fe585b9729d588c3def0dc77ba59","sha256:2353f7120e0e42dcaa9600a35b3bd17cf6de488379c0be841a239a6562efd7b9","sha256:893507f6057f8f0532ae8907fb5470f4a0181181bdbe139c2706d47cc4a88600","sha256:3e81cc85b636db8bd382419d540e21e06331c3f1749750219c961c4c309c0068","sha256:47181ad0eb6656ac1818b39c8f0300718530f27aa9bcbc9fc5da7cfa8e37fd29","sha256:9f017d2bee1ce5a4a4f2516d22d910b595061870a2228051c07547596162a321","sha256:3a72264cad047850514e368525894bb1268ac10fcc850d9f2afaaf1ad805e29c","sha256:d642d5d9404c1015981a4357654edb6e62585f0a3e360dedc32b9a1054905306","sha256:d980b0bad384d2f6427264b6ffebd615253c4222bb80111c3950246195c3fd00","sha256:27b4fb3629cd609719595a766d142f4780c327deb369f2f5ffca8655dba3e0f6","sha256:122bdc195ee2719f701a4144dc2f19f8f429701e823909308762a75492b93d70"]

可以看到,node 里出现的 8 层 layers,在 web server 里也出现了,下面 grep 一下第一层 layer 的 hash 值:

docker image inspect ca61c1748170 | grep "c5bb35826823702969891b025087135cceefb084dec1452af5a6fb2938bd9a13""sha256:c5bb35826823702969891b025087135cceefb084dec1452af5a6fb2938bd9a13",

我个人是觉得 docker 和乐高积木挺像的,都以最小的标准单位去进行构筑

重命名镜像

语法为 docker tag <old_image> <new_image>

⚠️:虽然这里说的是重命名,但是实际上 docker 是会以 new_image 为镜像名去创建一个新的拷贝,同时保留旧的镜像

分享镜像

主要有两个方式可以分享镜像

everyon has a image can create containers based on the image

分享 dockerfile

还是以 node 为案例,这是 github 上,node 的 dockerfile:

在这里插入图片描述

这里还是通过一系列的 instructions 去打包一个新的 node 镜像

分享打包好的镜像

另一个简单一点的方法就是将镜像打包好,推到某个远程上,然后以供分享。这样的优势是不用一步一步的 build 这个 image

推镜像

主要有两个推镜像的地方,第一个是 docker hub,这是 docker 官方支持的镜像库。另外一个是私有库,比如说我们公司用的 nexus

共享的方式就是使用 docker push <image_name>,这样就可以把本地建好的镜像推到远程让人下载

主要的步骤也是很简单,首先需要在 docker hub 上创建一个 repo:

在这里插入图片描述

填写必要的信息,和本地维持一致

在这里插入图片描述

随后终端上推上去就行了:

docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ga/node-app   latest    ca61c1748170   24 hours ago   1.11GB
mysql         latest    374f9fbf70c1   6 days ago     632MB
❯ docker push ga/node-app:latest
The push refers to repository [docker.io/ga/node-app]
122bdc195ee2: Preparing
27b4fb3629cd: Preparing
d980b0bad384: Preparing
d642d5d9404c: Preparing
3a72264cad04: Preparing
9f017d2bee1c: Waiting
47181ad0eb66: Waiting
3e81cc85b636: Waiting
893507f6057f: Waiting
2353f7120e0e: Waiting
51a9318e6edf: Waiting
c5bb35826823: Waiting
denied: requested access to the resource is denied

我这里权限拒绝了,因为没有登录,所以 docker 认为我没有 repo 的权限,这时候可以使用 docker login 登陆,完成验证:

在这里插入图片描述

和 inspect 中提到的 layer 结构一样,docker 不会将整个镜像全都推到 docker hub 上,它会查看每一层 layer 是否已经存在 reference,随后只推变动的部分。比如说这里的 node-app 是基于 node 实现的,那么 docker 就会发现 node:latest 这个镜像已经存在,那么它就不会把构建 node 的 layer 推上去,它只会推 repo 上不存在对应 hash 的 layer

拉镜像

这个语法为:docker pull node:20-bookworm-slim,一般很少用,因为 docker run 就会自动拉取镜像里

相关文章:

[docker] 镜像部分补充

[docker] 镜像部分补充 这里补充一下比较少用的&#xff0c;关于镜像的内容 检查镜像 ❯ docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> ca61c1748170 2 hours ago 1.11GB node latest 5212d…...

Android(Kotlin) 委托(by) 封装 SharedPreferences

在 Kotlin 中&#xff0c;委托是一种通过将自身的某个功能交给另一个对象来实现代码重用的技术。通过委托&#xff0c;我们可以将某个属性或方法的实现委托给另一个对象&#xff0c;从而减少重复代码的编写。委托可以用于实现多重继承、代码复用和扩展现有类的功能。 Kotlin 中…...

2022年蓝桥杯省赛软件类C/C++B组----积木画

想借着这一个题回顾一下动态规划问题的基本解法&#xff0c;让解题方法清晰有条理&#xff0c;希望更多的人可以更轻松的理解动态规划&#xff01; 目录 【题目】 【本题解题思路】 【DP模版】 总体方针&#xff1a; 具体解题时的套路&#xff1a; 【题目】 【本题解题思…...

Python数据挖掘项目开发实战:使用朴素贝叶斯进行社会媒体挖掘

注意&#xff1a;本文下载的资源&#xff0c;与以下文章的思路有相同点&#xff0c;也有不同点&#xff0c;最终目标只是让读者从多维度去熟练掌握本知识点。 Python数据挖掘项目开发实战&#xff1a;使用朴素贝叶斯进行社会媒体挖掘 一、项目背景与目标 在社交媒体时代&…...

【DM8】ET SQL性能分析工具

通过统计SQL每个操作符的时间花费&#xff0c;从而定位到有性能问题的操作&#xff0c;指导用户去优化。 开启ET工具 INI参数&#xff1a; ENABLE_MONITOR1 MONITOR_SQL_EXEC1 查看参数 select * FROM v$dm_ini WHERE PARA_NAMEMONITOR_SQL_EXEC;SELECT * FROM v$dm_ini WH…...

001-谷粒商城-微服务剖析

1、架构图 还是很强的&#xff0c;该有的都有 2、微服务模块 SpringCloudAlibaba组件包括 SentinelNacosRocketMQSeata 搭配SpringCloudAlibaba组件 OpenFeignGateWayRibbn gateway使用了SpringWebFlux&#xff0c;前几天研究到&#xff0c;为什么springboot不直接使用Spri…...

vue实现前端打印效果

如图效果所示&#xff08;以下演示代码&#xff09; <template><div><el-button v-print"printObj" type"primary" plain click"handle">{{ text }}</el-button><div style"display: none"><div id…...

android wifi直连 wifip2pmanager

android wifi直连 wifip2pmanager&#xff1b;使用WiFi 直连&#xff0c;然后通过udp进行通讯。 Android WiFi 直连&#xff08;Wi-Fi Direct&#xff0c;也称为Wi-Fi P2P&#xff09;是一种让两台或多台设备通过Wi-Fi技术直接进行点对点连接的技术&#xff0c;无需借助传统的无…...

伸缩应用程序和执行滚动更新

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列、spring教程等&#xff0c;大家有兴趣的可以看一看 &#x1f4d9;Jav…...

解决WPS右键菜单冗余选项,去除WPS右键菜单选项

问题描述 安装WPS后&#xff0c;右键菜单会多出许多无用的选项&#xff0c;如何去除&#xff1f; 解决方法 按下WindowsS打开搜索栏&#xff0c;搜索配置工具打开 勾选所有的关闭和隐藏选项...

部署ELFK+zookeeper+kafka架构

目录 前言 一、环境部署 二、部署ELFK 1、ELFK ElasticSearch 集群部署 1.1 配置本地hosts文件 1.2 安装 elasticsearch-rpm 包并加载系统服务 1.3 修改 elasticsearch 主配置文件 1.4 创建数据存放路径并授权 1.5 启动elasticsearch是否成功开启 1.6 查看节点信息 …...

ActiveMQ 任意文件上传漏洞复现

一、使用弱口令登陆 ​ 访问 http://ip:8161/admin/ 进入admin登陆页面&#xff0c;使用弱口令登陆&#xff0c;账号密码皆为 admin&#xff0c;登陆成功后&#xff0c;headers中会出现验证信息 ​ 如&#xff1a; Authorization: Basic YWRtaW46YWRtaW4 # 二、利用PUT协议上…...

k8s实践总结

一、pod常用操作&#xff1a; 1、如何重启pod&#xff1f; 1.1 删除并重新创建Pod 这是最直接的方法。你可以通过kubectl命令行工具删除Pod&#xff0c;然后Kubernetes将基于其对应的Deployment、ReplicaSet或其他控制器自动重新创建它。 不建议并行删除全部pod&#xff0c…...

前端从零到一搭建脚手架并发布到npm

这里写自定义目录标题 为什么需要脚手架&#xff1f;前置-第三方工具的使用1. 创建demo并运行-4步新建文件夹 zyfcli&#xff0c;并初始化npm init -y配置入口文件 2.commander-命令行指令3. chalk-命令行美化工具4. inquirer-命令行交互工具5. figlet-艺术字6. ora-loading工具…...

使用 git 提交项目到 github

文章推荐&#xff1a;https://zhuanlan.zhihu.com/p/193140870 连接失败&#xff1a;https://zhuanlan.zhihu.com/p/521340971 分支出错&#xff1a;https://blog.csdn.net/gongdamrgao/article/details/115032436...

SRE 与传统 IT 运营有何不同?

软件开发和部署方法的发展要求组织管理和维护 IT 基础设施的方式发生转变。站点可靠性工程(SRE) 是一门将软件工程的各个方面融入 IT 运营的学科&#xff0c;处于这一变革的前沿。随着专业人士和组织都寻求适应&#xff0c;对 SRE 认证和培训计划的需求激增。本博客探讨了 SRE …...

html公众号页面实现点击按钮跳转到导航

实现效果&#xff1a; 点击导航自动跳转到&#xff1a; html页面代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>跳转导航</title><meta name"keywords" conten…...

【算法】快速排序的基本思想、优化 | 挖坑填补法和区间分割法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法分析与设计知识专栏&#xff1a;算法分析&#x1f525; 给大家跳…...

OSPF动态路由实验(华为)

思科设备参考&#xff1a;OSPF动态路由实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 OSPF&#xff08;Open Shortest Path First&#xff09;是一种内部网关协议&#xff0c;主要用于在单一自治系统内决策路由。它是一种基于链路状态的路由协议&#xff0c;通过…...

EasyRecovery2024专业免费的电脑数据恢复软件

EasyRecovery数据恢复软件是一款功能强大的数据恢复工具&#xff0c;广泛应用于各种数据丢失场景&#xff0c;帮助用户从不同类型的存储介质中恢复丢失或删除的文件。 该软件支持恢复的数据类型非常广泛&#xff0c;包括但不限于办公文档、图片、音频、视频、电子邮件以及各种…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

Oracle实用参考(13)——Oracle for Linux物理DG环境搭建(2)

13.2. Oracle for Linux物理DG环境搭建 Oracle 数据库的DataGuard技术方案,业界也称为DG,其在数据库高可用、容灾及负载分离等方面,都有着非常广泛的应用,对此,前面相关章节已做过较为详尽的讲解,此处不再赘述。 需要说明的是, DG方案又分为物理DG和逻辑DG,两者的搭建…...

Qt/C++学习系列之列表使用记录

Qt/C学习系列之列表使用记录 前言列表的初始化界面初始化设置名称获取简单设置 单元格存储总结 前言 列表的使用主要基于QTableWidget控件&#xff0c;同步使用QTableWidgetItem进行单元格的设置&#xff0c;最后可以使用QAxObject进行单元格的数据读出将数据进行存储。接下来…...

简单聊下阿里云DNS劫持事件

阿里云域名被DNS劫持事件 事件总结 根据ICANN规则&#xff0c;域名注册商&#xff08;Verisign&#xff09;认定aliyuncs.com域名下的部分网站被用于非法活动&#xff08;如传播恶意软件&#xff09;&#xff1b;顶级域名DNS服务器将aliyuncs.com域名的DNS记录统一解析到shado…...

湖北理元理律师事务所:债务清偿方案中的法律技术革新

文/金融法律研究组 当前债务服务市场存在结构性矛盾&#xff1a;债权人追求快速回款&#xff0c;债务人需要喘息空间。湖北理元理律师事务所通过创新法律技术&#xff0c;在《企业破产法》《民法典》框架下构建梯度清偿模型&#xff0c;实现多方利益平衡。 一、个人债务优化的…...