4.docker镜像及相关命令

2023-12-19

目录

1  查看所有镜像 docker images

1.1  基本用法

1.2  docker images -q 只显示所有镜像ID

1.3  docker images -f [筛选条件] -q 只显示符合条件的所有镜像ID

1.4  docker images --no-trunc 显示完整的IMAGE ID

1.5  docker images --format [模板] 使用模板

2  从源拉取镜像 docker pull

3  从源查找镜像 docker search

4  移除本地镜像 docker rmi

4.1  基本使用

4.2  强制删除 -f

5  将镜像保存为tar文件 docker save

6  将docker save生成的tar文件加载为镜像 docker load

7  查看镜像的元数据 docker inspect

8  查询镜像的多架构信息 docker manifest inspect

9  查看镜像历史记录(分层) docker history


docker的镜像体积比较小,我们以mysql为例,在docker中mysql仅有516M。你正常安装一个mysql是要大于516M的

docker镜像可以分为4类

  • Docker Official Image :docker官方镜像。镜像的名称就是软件的名称,比如redis就叫redis
  • Verified Publish :已验证发布者发布的镜像。这种镜像不是docker自己做的,但是也是比较重量级的作者做的,比如阿里,华为这种。镜像的名称是 作者/软件的名称 比如 ubuntu/nginx
  • Sponsored OSS:由docker公司赞助的作者开发的仓库。oss的意思是open source software 镜像的名称是 作者/软件的名称 比如 linuxserver/nginx
  • 无认证仓库,这种仓库实际上就是我们自己写的仓库

可以使用第三方的镜像中心,我们在公司自己开发镜像的时候不会把资源发到官方的镜像中心中,而是会自己整一个。在第三方的镜像中心中镜像的命名一般为 域名(或IP)/上传镜像人的名字/软件的名称

docker镜像有一些松耦合(相互的关联性不强)的只读镜像层组成,Docker Daemon负责堆叠这些镜像层并将它们关联为一个统一的整体。

每个分层都是只读的,对分层的修改都是以新分层的形式出现,并不会破坏原分层内容。每个分层只记录变更内容,有利于节省储存空间。

采用分层可以实现不同镜像间的资源共享。比如redis与mysql可能都有A层。如果pull完redis再pull mysql的时候就不用再下载A层了(pull的时候会显示Already exists)。同时存储也只存储一个A层,这个A层既可以给redis使用也可以给mysql

每个镜像层由 镜像文件系统与镜像json文件 构成。镜像的文件系统(file system简称fs)由多个只读的镜像层组成,每层都完成了特定的功能,根据位置与功能可以分为基础镜像层与扩展镜像层

所有镜像的最下层都由一个基础镜像层,这个基础镜像层的文件系统称为根文件系统rootfs。rootfs是建立在Linux系统的文件引导系统bootfs之上(无论你的宿主机是什么,docker的容器都是linux系统,如果是非linux系统安装docker可以理解为宿主先虚拟出一个linux然后给docker的容器用)

基础镜像层之上的镜像层称为扩展镜像层。在Dockerfile中,每条指令都会生成一个扩展镜像层,所以尽可能在把多个指令合成一个指令来写

容器是 基础镜像层与扩展镜像层 之上可读写的容器层,对文件的任何更改只存在于容器层而不会影响镜像本身。如果你像修改镜像层的东西,那么会首先从镜像层复制一份到容器层,然后改复制后的东西。如果容器层与镜像层存储的内容发生冲突,容器层的内容会覆盖镜像层的内容

很多镜像都是多架构(比如amd,arm)的,以便能在多个架构中运行,比如redis。镜像中的部分层是专门处理架构的,在拉取镜像的时候,架构的信息会自动发送给镜像中心,镜像中心根据不同的架构给你返回不同的镜像,如果没有你正在使用的架构那么就会拉取失败

1  查看所有镜像 docker images

1.1  基本用法

如果没有下载过镜像就是这样的

加载过就像就会把相关的信息显示出来

  • 如果一个镜像没有REPOSITORY与TAG我们称这个镜像为虚悬镜像(Dangling Image)
  • 镜像默认是按照 镜像作者的创建时间(不是你拉取的时间)排序的

可以追加名称筛选出想要的信息,比如我想在只想看mysql相关的信息,那么就写 docker images mysql

docker images可以配合参数,应用场景常为批量处理镜像的时候,比如我现在想删除所有的镜像我可以输入 docker rmi $(docker images -q)

$(docker images -q)作为一个变量,意思是全部镜像的ID

1.2  docker images -q 只显示所有镜像ID

1.3  docker images -f [筛选条件] -q 只显示符合条件的所有镜像ID

比如 docker images -f since=mysql:latest -q 筛选出晚于 mysql:latest的CREATED 的镜像ID

-f可以跟的筛选条件常用的有

  • dangling=true 筛选出所有虚悬镜像
  • since=mysql:latest 筛选出晚于 mysql:latest的CREATED 的镜像。比如镜像A的CREATED的创建时间是1 months ago,镜像B:latest的CREATED的创建时间是2 months ago,镜像C的CREATED的创建时间是3 months ago,如果写 since=B:latest 那么就会只显示A镜像(不会显示B,也不会显示C)
  • before=mysql:latest 筛选出早于 mysql:latest的CREATED 的镜像。比如镜像A的CREATED的创建时间是1 months ago,镜像B:latest的CREATED的创建时间是2 months ago,镜像C的CREATED的创建时间是3 months ago,如果写 before=B:latest 那么就会只显示C镜像(不会显示B,也不会显示A)

reference也是-f的筛选条件这个参数只会查官方的镜像,所以这个命令应用不多

  • reference=*:latest 可以查到所有tag为latest的镜像
  • reference=*llo* 可以查看 RESPOSITORY或TAG中含有llo的镜像

1.4  docker images --no-trunc 显示完整的IMAGE ID

IMAGE ID实际上就是digest

1.5  docker images --format [模板] 使用模板

比如 docker images --format { {.Repository}} 就是只显示Repository这一列

我们再做个例子 docker images --format { {.Repository}}:{ {.Tag}}:{ {.Size}}

2  从源拉取镜像 docker pull

比如我想从源拉一个最新的mysql,那你就输入docker pull mysql 拉取的过程是这样的

  • 默认拉取latest版本
  • 如果你要拉取指定的版本,那你就写 docker pull mysql:[指定的版本]
  • 对于非官方镜像也可以带用户名比如 docker pull suyu/mysql:[指定的版本]
  • 也可以使用digest值 比如 docker pull openanolis/mysql@sha256:78b2c0e8da2a374094d20aa521ca483c5b7c41de4b6f62fecf67f7582e9aa7d7 用digest值下载之后的镜像默认情况下没有tag
  • 如果要拉取的镜像在源上没有会响应not found

拉下来之后是这样的

  • Digest表示的是镜像的摘要,在下载之前会将要下载的内容与之前下载的内容进行比对(如果之前下载过)。如果比对结果相同就不进行下载,如果比对结果不同再进行下载。digest实际上就是IMAGE ID。每一个镜像都有一个长度为64位的16进制字符串摘要。本质上摘要是一个哈希值,具体来说是Content Hash(内容散列)。只要镜像内容发生了变更,digest也会发生改变。Docker默认采用的Hash算法是SHA256,SHA的意思是 Secure Hash Algorihm 安全哈希算法。SHA256本身是一个256位的二进制值,在Docker中改为了16进制表示,就变成了长度为64位的字符串
  • Digeset可以让客户端与镜像中心传递镜像的时候可以放置信息丢失。比如A的镜像digist是123,那么客户端会先把123发给镜像中心,之后再把镜像传给镜像中心,之后镜像中心会校验一遍传过来的镜像,如果校验结果是123证明镜像没有信息丢失,如果不是123,那么会自动重新传输
  • 为了节省带宽,pull或push的时候镜像会被压缩,之后传输。压缩后的镜像与压缩前的镜像digist是不同的。为了解决这个问题Docker采用了分发散列值(Distribution Hash),分发散列值在镜像压缩后立即计算。客户端与镜像中心使用分发散列值校验镜像

每一个pull complete代表这个镜像的每一个层,每一次下载的时候层都是有顺序的,第一层是72a6,第二层是9361。它是一层一层压上去,层太多了我就不每个都画上了,我们可以大概像下面图一样理解,一层一层往上盖,e043是最后一层

查看镜像列表可以发现mysql

可以追加一些参数,比如

  • docker pull -a zookeeper 这个就是把zookeeper镜像的所有版本都拉到你本地
  • docker pull -q zookeeper 这个是静默模式,静默模式就是在终端上不打印任何的东西

比如说我想找 redis 这个镜像,排序是根据综合得分排序的

  • NAME 镜像名称
  • DESCRIPTION 镜像描述
  • STARS 收藏数
  • OFFICIAL 写了OK的是官方的镜像
  • AUTOMATED 写了OK的是通过dockerfile自动构建的镜像。如果dockerfile有变动AUTOMATED为OK的镜像也会变动。AUTOMATED写了OK的可以理解为也是可以被信任的镜像,但不是官方自己做的

docker search可以配合参数比如-f是筛选

  • docker search -f is-official=true redis 这个可以筛选出redis的官方镜像
  • docker search -f is-automated=true redis 这个可以筛选出redis通过dockfile自动化构建的镜像
  • docker search -f stars=100 redis 这个可以筛选出redis的stars值 大于 100的镜像

--limit 是显示多少条数据,默认为25

  • docker search --limit=5 redis 只显示redis的前5条数据

--no-trunc 是不删减显示的信息,基本上只有描述比较长,会被删减一点

  • docker search --no-trunc redis 显示每一个redis的完整信息

--format 是按照模板显示

  • docker search --format { {.Name}} 只显示redis这一列

4  移除本地镜像 docker rmi

4.1  基本使用

比如我想删除mysql:latest这个镜像,那么就输入 docker rmi mysql:latest

  • 如果不写tag默认是latest,删除的时候建议写全了
  • 也可以写IMAGE ID,比如 docker rmi 3218b38490ce

4.2  强制删除 -f

如果你有容器正在使用镜像,你只写rmi是删除不了的

加上 -f 就能删了

镜像没有了,但是容器还有

5  将镜像保存为tar文件 docker save

保存可以保存一个或者多个,我们目前有两个镜像

我们可以将这两个镜像保存为一个tar文件,输入 docker save -o /home/suyu/my.tar mysql:latest hello-world:latest

  • 也可以分开保存

也可以这样写,效果与上面的命令相同

tar文件大小与所保存的镜像大小之和基本一致

6  将docker save生成的tar文件加载为镜像 docker load

我首先把这两个镜像存为了tar文件

然后我删掉这两个镜像

之后我进行加载,输入 docker load -i my.tar

加载完成后是这样的

我们查询所有镜像,发现与保存前一致(包括镜像ID)

也可以这样加载 docker load < my.tar 效果一样

7  查看镜像的元数据 docker inspect

比如docker inspect mysql

8  查询镜像的多架构信息 docker manifest inspect

比如 docker manifest inspect redis

  • 这个是从源查询的,所以查的时候会慢一些
  • manifest本身一个文件,如果这个镜像不支持多架构就没有这个文件,没有这个文件执行 docker manifest inspect 就查不了。有的镜像支持多架构,但也没有manifest这个文件,那也查不了。

9  查看镜像历史记录(分层) docker history

比如我现在要查看 a7c6 这个镜像的历史记录

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

4.docker镜像及相关命令 的相关文章

随机推荐

  • 怎么检测DC-DC电源模块稳定性?电源测试系统测试有什么优势?

    DC DC电源模块稳定性测试 稳定性是衡量DC电源模块的重要指标 电源模块的稳定性直接影响着电源产品和设备的工作稳定性 DC DC电源模块的稳定性 可以通过检测输出电压 输出电流 负载 波形 效率等参数来评估 1 静态测试方法 静态测试是通
  • 搭建电子商务网站建设步骤

    随着目前电子商务网站开发技术的迭代 电商网站的交互设计得到了很大程度的提升 可以认为现在的新型的商城平台都呈现出交互效果 那么电子商务网站建设步骤包括什么呢 电子商务网站建设第一步 网站的规划与设计 电子商务网站算是一个比较复杂的系统 电商
  • 如何在Linux系统中删除文件或目录?

    Linux作为流行的操作系统之一 许多公司和组织都在使用Linux来运行其关键业务和服务 例如谷歌 亚马逊和Facebook等 在Linux中 删除文件和目录是基本操作 那么该如何实现这一功能呢 以下是详细的内容 一 使用命令行删除文件 如
  • 渗透测试报告怎么写?

    1 准备好渗透测试记录 测试记录是执行过程的日志 在每日测试工作结束后 应将当日的成果做成记录 虽然内容不必太过细致 但测试的重点必须记录在案 拟检测的项目 使用的工具或方法 检测过程描述 检测结果说明 过程的重点截图 有结果的画面 2 撰
  • 什么是深度学习的无监督学习与有监督学习

    无监督学习 深度学习中的无监督学习方法是一种训练算法 它在没有标注输出的情况下从输入数据中学习模式和特征 这种方法的核心是探索和理解数据的内在结构和分布 而不是通过已知的输出来指导学习过程 无监督学习在深度学习领域有许多不同的形式和应用 以
  • binlog日志,二进制日志的简介

    binlog的bin就暴露了他是二进制的文件 你用vi或者vim是没办法读的 得用专门的方式 比如mysqlbinlog工具 那么binlog其实只要了解几点应该就足够了 Q 首先 binlog记录的是啥呢 A 记录的是数据库的修改过程 注
  • 2023_Spark_实验二十八:Flume部署及配置

    实验目的 熟悉掌握Flume部署及配置 实验方法 通过在集群中部署Flume 掌握Flume配置 实验步骤 一 Flume简介 Flume是一种分布式的 可靠的和可用的服务 用于有效地收集 聚合和移动大量日志数据 它有一个简单灵活的基于流数
  • 2023_Spark_实验二十九:Flume配置KafkaSink

    实验目的 掌握Flume采集数据发送到Kafka的方法 实验方法 通过配置Flume的KafkaSink采集数据到Kafka中 实验步骤 一 明确日志采集方式 一般Flume采集日志source有两种方式 1 Exec类型的Source 可
  • 线性连续控制系统

    线性连续控制系统 可以用线性微分方程表示 形式为 上式中 是被控制量 是系统的输入量 线性定常连续系统 当系数 和 常数时 称为定常系统 线性时变连续系统 当 和 随时间变化时 称为时变系统 线性定常连续系统按照输入量 的变化规律不同 又分
  • PyCharm中缓存有何作用?如何清理?

    在使用pycharm开发软件的过程中 我们经常会遇到卡顿 运行慢等问题 这时第一应对措施就是清理缓存 从而提高效率 那么pycharm如何清理缓存 以下是常用方法介绍 PyCharm缓存的作用 在使用PyCharm进行开发时 PyCharm
  • 推动行业未来的八个数字化转型趋势

    根据 Gartner 最新估计 在2023 年 已有40 的组织把虚拟体验与物理体验结合起来 以提高员工生产力和客户覆盖范围 而到 2024 年 工业企业将通过将自我管理技术与重新设计的运营流程相结合 将运营成本降低 30 到 2025 年
  • 低代码助力全栈开发

    目录 低代码功能展示 1 拖拽式 UI 组件 2 更快的开发速度 3 敏捷原型设计 4 与数据库集成 低代码开发工具正变得日益强大 它正不断弥合着前后端开发之间的差距 对于后端来说 基于低代码平台开发应用时 完全不用担心 前端的打包 部署
  • JavaOOP篇----第三篇

    系列文章目录 文章目录 系列文章目录 前言 一 标识符的命名规则 二 instanceof关键字的作用 三 什么是隐式转换 什么是显式转换 前言 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网
  • Linux中动态路由协议有哪些?

    Linux动态路由是一种在Linux操作系统中实现动态路由的机制 动态路由是指路由器能够根据网络的变化自动更新路由表 以实现更高效的数据传输 在Linux中 动态路由可以通过配置路由规则来实现 那么Linux中动态路由协议有哪些 以下是具体
  • kubernetes入门到进阶(2)

    被隔离的进程 一起来看看容器的本质 大家好 我们继续来一起学习k8s 在上一个章节里 我们初步了解了容器技术 在Linux虚拟机里安装了当前最流行的容器docker 还是用了docker ps docker run 等命令简单操作了容器 广
  • 【计算机图形学】PointNet文章的简单理解与运用,点云特征提取

    PointNet论文原文 PointNet Deep Learning on Point Sets for 3D Classification and Segmentation PointNet官方代码是使用tensorflow实现的 Po
  • 数据库学习日常案例20231218-oracle 19RAC hip远程注册服务到scan listener分析

    问题 用户一套Oracle19c RAC集群 出现一个奇怪的现象 通过SCAN IP访问的连接会话都集中在节点一实例 而且用户并没有做任何的节点服务访问去控制会话的连接节点 比如常见的通过集群的高可用服务去控制应用访问连接集中在同一节点 从
  • 渗透测试与安全测试主要区别是什么?

    在网络安全体系中 有很多专业术语 而且部分专业术语在名字上有很大的相似之处 因此很多小伙伴将它们混淆在一起 比如渗透测试和安全测试 这两个概念就经常被混淆在一起 那么什么是渗透测试和安全测试 有何区别 渗透测试是通过模拟恶意黑客的攻击方法
  • 转移mysql中的数据

    目录 1 mysqldump 2 将数据库中的数据转换为一个sql文件 3 执行sql文件 1 mysqldump 转移数据需要用到mysqldump 默认情况下mysqldump会自动被安装上 如果没有用不了 建议重新安装一下 参考 my
  • 4.docker镜像及相关命令

    目录 1 查看所有镜像 docker images 1 1 基本用法 1 2 docker images q 只显示所有镜像ID 1 3 docker images f 筛选条件 q 只显示符合条件的所有镜像ID 1 4 docker im