[docker] 镜像部分补充

news2024/10/7 14:33:45

[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 就会自动拉取镜像里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1601084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据中心IP代理VS住宅代理IP,区别详解

一、什么是数据中心/机房IP代理&#xff1f; 数据中心/机房IP代理是使用数据中心拥有并进行分配和管理的IP的代理&#xff0c;俗称机房IP代理。 二、数据中心/机房IP代理的特点 与住宅代理通过使用ISP拥有和分配的IP地址的设备路由请求的情况不同&#xff0c;数据中心代理利…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别 一、简单介绍 二、简单人脸识别实现原理 三、简单人脸识别案例实现简单步…

陇剑杯 流量分析 webshell CTF writeup

陇剑杯 流量分析 链接&#xff1a;https://pan.baidu.com/s/1KSSXOVNPC5hu_Mf60uKM2A?pwdhaek 提取码&#xff1a;haek目录结构 LearnCTF ├───LogAnalize │ ├───linux简单日志分析 │ │ linux-log_2.zip │ │ │ ├───misc日志分析 │ │ …

【蓝桥杯嵌入式】串口通信与RTC时钟

【蓝桥杯嵌入式】串口通信与RTC时钟 串口通信cubemx配置串口通信程序设计 RTC时钟cubemx配置程序设计 串口通信 cubemx配置 打开串口通信&#xff0c;并配置波特率为9600 打开串口中断 重定义串口接收与发送引脚&#xff0c;默认是PC4&#xff0c;PC5&#xff0c;需要改为P…

2024 CKA 基础操作教程(十四)

题目内容 设置配置环境&#xff1a; [candidatenode-1] $ kubectl config use-context mk8s Task 现有的 Kubernetes 集群正在运行版本 1.29.0。仅将 master 节点上的所有 Kubernetes 控制平面和节点组件升级到版本 1.29.1。 确保在升级之前 drain master 节点&#xff0c…

强强联手|AI赋能智能工业化,探索AI在工业领域的应用

随着人工智能&#xff08;AI&#xff09;技术的不断发展和应用&#xff0c;AI在各个领域展现出了巨大的潜力和价值。在工业领域&#xff0c;AI的应用也越来越受到关注。AI具备了丰富的功能和强大的性能&#xff0c;为工业领域的发展带来了巨大的机遇和挑战。 YesPMP是专业的互联…

IAM 统一身份认证与访问管理服务

即统一身份认证与访问管理服务&#xff0c;是云服务商提供的一套云上身份管理解决方案&#xff0c;可帮助企业安全地管理云上资源的访问权限。 在当今云计算时代&#xff0c;企业越来越依赖云服务来存储和处理敏感数据。然而&#xff0c;这也带来了新的安全挑战&#xff0c;即…

1 GBDT:梯度提升决策树

1 前言 前面简单梳理的基本的决策树算法&#xff0c;那么如何更好的使用这个基础算法模型去优化我们的结果是本节要探索的主要内容。 梯度提升决策树&#xff08;Gradient Boosting Decision Trees&#xff09;是一种集成学习方法&#xff0c;通常用于解决回归和分类问题。它通…

v-for中涉及的key

一、为什么要用key&#xff1f; key可以标识列表中每个元素的唯一性&#xff0c;方便Vue高效地更新虚拟DOM&#xff1b;key主要用于dom diff算法&#xff0c;diff算法是同级比较&#xff0c;比较当前标签上的key和标签名&#xff0c;如果都一样&#xff0c;就只移动元素&#…

【原创教程】海为PLC与RS-WS-ETH-6传感器的MUDBUS_TCP通讯

一、关于RS-WS-ETH-6传感器的准备工作 要完成MODBUS_TCP通讯,我们必须要知道设备的IP地址如何分配,只有PLC和设备的IP在同一网段上,才能建立通讯。然后还要选择TCP的工作模式,来建立设备端和PC端的端口号。接下来了解设备的报文格式,方便之后发送报文完成数据交互。 1、…

B端和C端产品有哪些区别,运营模式有很大区别!

做设计这么多年&#xff0c;经历了 C 端的设计&#xff0c;也实战了 B 端的设计&#xff0c;之前一直以为它们差不多&#xff0c;仔细研究过后&#xff0c;发现它们原来还是有很多不一样的&#xff0c;今天就细细的来聊下它们两者的差异和不同。 B 端&#xff1a;产品是企业识别…

UT单元测试

Tips&#xff1a;在使用时一定要注意版本适配性问题 一、Mockito 1.1 Mock的使用 Mock 的中文译为仿制的&#xff0c;模拟的&#xff0c;虚假的。对于测试框架来说&#xff0c;即构造出一个模拟/虚假的对象&#xff0c;使我们的测试能顺利进行下去。 Mock 测试就是在测试过程…

Java SpringBoot基于微信小程序的高速公路服务区充电桩在线预定系统,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

自定义类似微信效果Preference

1. 为自定义Preference 添加背景&#xff1a;custom_preference_background.xml <?xml version"1.0" encoding"utf-8"?> <selector xmlns:android"http://schemas.android.com/apk/res/android"><item><shape android:s…

Linux-时间同步服务器

1. (问答题) 一.配置server主机要求如下&#xff1a; 1.server主机的主机名称为 ntp_server.example.com 编写脚本文件 #!/bin/bash hostnamectl hostname ntp_server.example.com cd /etc/NetworkManager/system-connections/ rm -fr * cat > eth0.nmconnection <&…

JSON数据格式讲解与cJSON库的使用

文章目录 写在前面一、安装cJSON二、使用cJSON1、使用的文件2、如何传输数据&#xff1a;**** 三、JSON语法四、cJSON函数讲解1、cJSON结构体 **2、cJSON结构体与字符串之间的转换&#xff08;重要&#xff09;2.1、标题将cJSON结构体转换为字符串(常用)2.2、将字符串转为cJSON…

设计模式—门面模式

定义: 门面模式,也称为外观模式&#xff0c;是一种结构型设计模式。它的主要目的是提供统一的接口来访问子系统中的多个接口&#xff0c;从而简化客户端与复杂子系统之间的交互。 在门面模式中&#xff0c;一个门面类充当中介&#xff0c;为客户端提供一个简化了的访问方式&…

B203-若依框架应用

目录 简介版本RuoYi-fast项目准备新增模块/代码生成 简介 基于SpringBoot的权限管理系统&#xff0c;基于SpringBoot开发的轻量级Java快速开发框架 版本 前后端未分离单应用版本&#xff1a;RuoYi-fast&#xff0c;前后端未分离多模块版本&#xff1a;RuoYi 前后端分离单应用…

Adobe AE(After Effects)2020下载地址及安装教程

Adobe After Effects是一款专业级别的视觉效果和动态图形处理软件&#xff0c;由Adobe Systems开发。它被广泛用于电影、电视节目、广告和其他多媒体项目的制作。 After Effects提供了强大的合成和特效功能&#xff0c;可以让用户创建出令人惊艳的动态图形和视觉效果。用户可以…

逻辑回归模型-逻辑回归算法原理-逻辑回归代码与实现-笔记整合

通过一段时间的学习&#xff0c;总算把逻辑回归模型弄清楚了 《老饼讲解-机器学习》www.bbbdata.com中是讲得最清晰的&#xff0c;结合其它资料&#xff0c;整理一个完整的笔记如下&#xff0c;希望能帮助像我这样入门的新人&#xff0c;快速理解逻辑回归算法原理和逻辑回归实…