Docker 使用基础(2)—镜像

                                        🎬慕斯主页:修仙—别有洞天

                                       ♈️今日夜电波:秒針を噛む—ずっと真夜中でいいのに。

                                                           0:34━━━━━━️💟──────── 4:20
                                                                🔄   ◀️   ⏸   ▶️    ☰  

                                 💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍


 目录

首先理解几个概念

Docker 镜像(image)是什么?

为什么需要镜像 ?

镜像命令详解

docker rm

docker save

docker load

docker history

docker image prun

docker import


首先理解几个概念

Docker 镜像(image)是什么?

        Docker image 本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。

我们可以把 Docker image 理解成一个模板, 可以通过这个模板实例化出来很多容器。

image 里面是一层层文件系统 Union FS。联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统。

每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker镜像中每一层文件系统都是只读的。

构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。

镜像与容器的理解:可以理解为类和对象的关系。镜像相当于我们 java 或者 C++中的类,相当于一个模板,可以很方便的构建出来不同的对象。

下面看看官方给出的Docker 架构,可以结合此图来理解镜像的概念:

为什么需要镜像 ?

Docker镜像的重要性在于它们为软件开发和部署提供了几个关键优势,以下是几个主要原因:

  1. 环境一致性:Docker镜像确保了无论在哪个环境中运行,从开发到测试再到生产,软件的运行环境都是一致的。这消除了由于环境差异导致的问题,即所谓的“在我的机器上工作”现象。
  2. 可移植性:镜像包含了软件运行所需的一切,包括代码、库、环境变量和其他依赖项。这使得镜像可以轻松地在不同的主机和平台上运行,无需担心底层系统差异。
  3. 隔离性:每个Docker容器都有自己的文件系统和网络栈,这意味着容器间不会相互干扰,提供了很好的隔离性,降低了应用程序之间的冲突风险。
  4. 可复现性:一旦创建了Docker镜像,你可以在任何地方启动相同配置的容器。这不仅提高了开发效率,也确保了部署的一致性和可预测性。
  5. 快速启动和停止:基于镜像启动容器通常比启动传统虚拟机更快,因为容器共享宿主机的内核,减少了启动时间和资源消耗。
  6. 资源优化:Docker镜像采用了分层存储机制,这意味着多个容器可以共享相同的镜像层,节省了磁盘空间和网络带宽。
  7. 自动化部署:Docker镜像可以很容易地集成到持续集成/持续部署(CI/CD)管道中,自动化应用的构建、测试和部署流程。
  8. 安全性:镜像可以被扫描以检测潜在的安全漏洞,确保只有无害的镜像才被部署到生产环境中。此外,镜像可以被签名,以验证其来源和完整性。
  9. 版本管理和更新:Docker镜像可以被打上标签,方便跟踪和管理不同版本的应用程序和环境,使更新和回滚变得更加简单。
  10. 服务的可伸缩性:镜像可以用于快速创建多个容器实例,以满足增加的负载需求,这是云原生应用和服务伸缩性的基础。

        总而言之,docker 最大的贡献就是定义了容器镜像的分层的存储格式, docker 镜像技术的基础是联合文件系统(UnionFS),其文件系统是分层的。这样既可以充分利用共享层,又可以减少存储空间占用。docker 镜像提供了一种打包应用程序和预配置服务器环境的便捷方式,可以很方便的将其用于个人用途或与其他 Docker 用户公开共享。

 

镜像命令详解

        前面的文章已经解析过了最常见的images、tag、pull、push、image inspect了,这里不多解析。至于build在理解完后续知识再详细介绍。

docker rm

docker rmi 命令用于从本地删除一个或多个 Docker 镜像。当不再需要某个镜像,或者想要清理磁盘空间时,这个命令就非常有用。下面是对 docker rmi 命令的详细解析:

命令语法

docker rmi [OPTIONS] IMAGE [IMAGE...]
  • OPTIONS 可以是以下选项之一或多个:
    • -f, --force:强制删除正在被容器使用的镜像。通常情况下,如果镜像被正在运行的容器使用,则无法删除。
    • --no-prune:默认情况下,Docker会尝试删除所有未被其他镜像引用的中间镜像层。使用此选项可以阻止这种行为,只删除指定的镜像。
  • IMAGE 是要删除的镜像的名称或ID。可以指定一个或多个镜像,以空格分隔。

注意事项

  • 在删除镜像之前,确保没有容器正在使用这些镜像。如果不希望手动停止容器,可以使用 -f 选项。
  • 如果镜像被多个容器使用,可能需要先使用 docker stopdocker rm 命令停止并删除容器,然后才能删除镜像。

        针对前面两点的例子:通常我们run了一个镜像会生成对应的容器,而这些容器可能会存在很多个,而此时我们如果要删除镜像,则需要先把对应的容器给全部先删除掉才能删除镜像。那你这时又会问了,不是有个-f选项吗?为什么不直接强制删除呢?这种方式是不推荐的,一般的流程则是前面所提到的。

  • 当删除镜像时,Docker 会同时删除所有未被引用的镜像层,除非使用了 --no-prune 选项。

例子

docker save

    docker save 命令用于将一个或多个 Docker 镜像保存为一个 tar 格式的存档文件。这个功能对于需要在不同的 Docker 环境之间迁移镜像,或者备份镜像来说是非常有用的。下面是 docker save 命令的详细解释:

命令语法

docker save [OPTIONS] IMAGE [IMAGE...]
  • -o, --output:用于指定输出的 tar 文件的路径和文件名。如果没有提供这个选项,docker save 命令会将输出重定向到标准输出(stdout),通常这会直接输出到控制台,所以一般在实际使用中会配合 -o 选项使用。
  • IMAGE:你要保存的镜像的名称或 ID。可以指定一个或多个镜像,多个镜像之间用空格分隔。

注意事项

  • 当你使用 docker save 命令保存镜像时,Docker 会递归地保存镜像的所有层,这意味着如果多个镜像共享某些层,那么这些层只会被保存一次,即使它们属于不同的镜像。
  • 保存的 tar 文件包含了镜像的元数据以及所有相关的层数据,因此文件可能会相当大,具体大小取决于镜像的复杂度和包含的文件数量。
  • 保存的 tar 文件可以使用 docker load 命令恢复,将镜像重新加载到 Docker 中。

例子

docker load

    docker load 命令用于从一个 tar 格式的存档文件中恢复 Docker 镜像。这个命令与 docker save 命令是互补的,后者用于将镜像保存为 tar 文件,而前者则是用来将 tar 文件中的镜像数据加载回 Docker 环境中。下面详细介绍 docker load 命令的用法:

命令语法

docker load [OPTIONS]
  • --input, -i:指定要加载的 tar 文件的路径。如果没有提供此选项,docker load 命令会从标准输入(stdin)中读取数据。
  • --quiet, -q:精简输出信息。

注意事项

  • 加载的镜像必须是使用 docker save 命令导出的格式,否则可能无法成功加载。
  • docker load 命令会检查 tar 文件中的镜像数据,并重建镜像的元数据和层。这个过程可能需要一些时间,具体取决于镜像的大小和复杂度。
  • 如果 tar 文件包含多个镜像,docker load 命令会一次性加载所有这些镜像。
  • 加载镜像后,可以通过 docker images 命令查看已加载的镜像列表。

例子

 从 tar 文件加载镜像

docker load --input test.tar

这条命令将从 my_image.tar 文件中加载镜像到当前的 Docker 环境中。

  1. 从标准输入加载镜像:当从远程位置获取镜像数据或者使用管道传递数据时,可以省略 --input 选项,直接使用标准输入:
cat my_image.tar | docker load

或者从远程下载后立即加载:

curl -L https://example.com/my_image.tar | docker load

docker history

    docker history 命令用于显示 Docker 镜像的构建历史,包括每一层的详细信息。这对于理解和调试镜像的构建过程特别有帮助,可以查看每一层是由什么命令创建的,以及各层的大小和其他元数据。下面是关于 docker history 命令的详细说明:

命令语法


docker history [OPTIONS] IMAGE
  • --format:指定输出格式。可以使用 Go 的模板语言来定制输出的格式。
  • --no-trunc:如果设置,命令将不会截断长输出,而是显示完整的值。
  • --quiet, -q:只输出每一层的 ID。
  • IMAGE:要查询历史的镜像的名称或 ID。

输出格式

默认情况下,docker history 命令将输出以下信息:

  • ID:每一层的唯一标识符。
  • CREATED:层创建的时间(以天数表示,后面跟着时间戳)。
  • CREATED BY:创建层的 Dockerfile 指令。
  • SIZE:层的大小(以字节为单位)。
  • COMMENT:附加的注释,通常是父镜像的 ID。

注意事项

  • 镜像历史中的每一层通常对应 Dockerfile 中的一个指令,但某些指令如 RUN 可能会在单个层中执行多个命令。
  • 当使用 --format 选项时,可以使用的字段包括 .ID, .Created, .CreatedBy, .Size, 和 .Comment
  • 有时,镜像的某些层可能看起来没有大小,这是因为它们使用了上一层的缓存,或者是在同一层中做了删除和添加文件的操作,抵消了大小变化。

使用示例

 查看镜像历史

docker history ubuntu:latest

这将列出 ubuntu:latest 镜像的构建历史。

  只显示层 ID

docker history -q ubuntu:latest

这个命令将只输出每一层的 ID,常用于脚本中进一步处理。

 使用自定义格式

docker history --format '{{.ID}} - {{.CreatedBy}}' ubuntu:latest

通过自定义格式,可以按照个人需求调整输出的信息。

docker image prun

    docker image prune 命令用于清理 Docker 环境中不再需要的镜像,特别是那些没有被任何容器引用的“悬空”(dangling)镜像。这有助于释放磁盘空间,保持 Docker 系统的整洁。下面是关于 docker image prune 命令的详细解析:

命令语法

docker image prune [OPTIONS]
  • -a, --all:删除所有未被使用的镜像,而不仅仅是悬空的镜像。悬空镜像是指没有被任何容器关联且没有被赋予任何标签的镜像。
  • --filter, -f:使用过滤器来选择要删除的镜像。例如,--filter until=<timestamp> 可以用来删除在指定时间之前创建的镜像。
  • --force, -f:强制执行操作,不询问确认。
  • --help:显示帮助信息。

注意事项

  • 在执行 docker image prune 命令之前,最好确认哪些镜像是可以安全删除的,尤其是使用 -a 选项时。可以先使用 docker images 命令查看所有镜像的列表。
  • 删除镜像时,Docker 会尝试释放与这些镜像关联的未被引用的镜像层。这有助于进一步节省磁盘空间。
  • 如果有容器正在使用某镜像,即使使用 -a 选项,该镜像也不会被删除。

使用示例

 仅删除悬空镜像

docker image prune

这个命令将删除所有悬空的镜像。

 删除所有未被使用的镜像

docker image prune -a

使用 -a 选项将会删除所有未被任何容器引用的镜像,不仅仅是悬空的。

 强制删除所有未被使用的镜像

docker image prune -a --force

这个命令将不询问确认,直接删除所有未被使用的镜像。

 根据时间过滤并删除镜像

docker image prune -a --filter "until=2023-01-01"

这个命令将删除所有在2023年1月1日之前创建的未被使用的镜像。

docker import

    docker import 命令用于从一个归档文件或远程 URL 创建一个新的 Docker 镜像。这个命令特别有用,当你需要将一个文件系统快照或一个预先构建的文件结构转换成 Docker 镜像时。与 docker build 命令不同,docker import 不使用 Dockerfile,而是直接从提供的文件或目录结构中创建镜像。

命令语法

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
  • file: 本地文件系统上的归档文件路径,可以是一个 .tar 或者压缩过的 .tar.gz, .tgz, .bzip, .tar.xz, 或 .txz 文件。
  • URL: 一个远程 URL,通常指向一个可通过 HTTP(S) 访问的归档文件。
  • -: 表示从标准输入(stdin)读取归档数据,这通常用于管道操作。
  • REPOSITORY[:TAG]: 指定新创建的镜像的仓库名称和可选的标签。如果省略了标签,将使用默认的 latest 标签。
  • -c--change: 用于在创建镜像时应用 Dockerfile 指令,例如改变工作目录、设置环境变量等。这可以通过逗号分隔的列表形式提供,每个项看起来类似于 Dockerfile 的指令,例如 WORKDIR=/path,ENV VAR=value
  • -m--message: 设置提交信息,这将在镜像历史中显示。

注意事项

  • docker import 命令不支持多阶段构建或构建缓存,因为它不使用 Dockerfile。
  • 如果你从一个 URL 导入数据,确保该 URL 可以访问并且提供了一个有效的归档文件。
  • 使用 -c--change 选项时,你应该熟悉 Dockerfile 的语法,因为这里使用的语法非常相似。

通过 docker import,你可以方便地将现有的文件系统快照或归档文件转化为 Docker 镜像,便于后续的部署和分发。

示例

假设你有一个名为 myapp.tar.gz 的归档文件,其中包含了你的应用程序及其依赖,你可以使用以下命令将其转换为 Docker 镜像:

docker import myapp.tar.gz myimage:latest

这将创建一个名为 myimage 并带有 latest 标签的新镜像。

如果你想从一个远程 URL 导入一个归档文件,可以这样做:

docker import https://example.com/downloads/myapp.tar.gz myimage:latest

如果你想要从标准输入读取数据,可以使用管道操作:

cat myapp.tar.gz | docker import - myimage:latest

 


                     感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o! 

                                       

                                                                        给个三连再走嘛~  

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

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

相关文章

linux下安装cutecom串口助手;centos安装cutecom串口助手;rpm安装包安装cutecom串口助手

在支持apt-get的系统下安装 在终端命令行中输入&#xff1a; sudo apt-get install cutecom 安装好后输入 sudo cutecom 就可以了 关于如何使用&#xff0c;可以看这个https://www.cnblogs.com/xingboy/p/14388610.html 如果你的电脑不支持apt-get。 那我们就通过安装包…

7.10号小项目部分说明

总体说明 糖锅小助手 我这次主要对上次糖锅小助手界面添加了一个侧边栏&#xff08;侧边输入框放置了三个按钮&#xff0c;可以跳转到其他ai聊天界面&#xff0c;还可以退出聊天界面回到登录界面&#xff09;和一个日期输入框&#xff08;日期输入框获取时间&#xff0c;根据时…

常见摄像头模块性能对比

摄像头模块在现代电子设备与嵌入式开发中扮演着重要角色&#xff0c;从智能手机到安全监控系统&#xff0c;再到机器人视觉系统&#xff0c;它们无处不在。以下是一些常见的摄像头模块及其特点的对比&#xff1a; OV2640 分辨率&#xff1a;最高可达200万像素&#xff08;1600x…

GPT-4o不香了, Claude3.5 Sonnet来了,直接免费可用

大家好&#xff01;我是YUAN。 刚刚&#xff01; AI领域又迎来了一场新的风暴——Anthropic公司发布了全新的Claude 3.5 Sonnet模型&#xff0c;这一消息如同一颗重磅炸弹&#xff0c;震撼了整个科技界。 Claude 3.5 Sonnet与GPT-4o对比 性能飞跃&#xff1a;超越GPT-4o Cl…

SA8317E单通道 2.7-15.0V 持续电流 2.5A H 桥驱动芯片

描述 SA8317E 是为消费类产品&#xff0c;小家电和其他 低压或者电池供电的运动控制类应用提供 了一个集成的电机驱动器解决方案。此器 件能够驱动一个直流电机&#xff0c;由一个内部电 荷泵生成所需的栅极驱动电压电路和 4 个 功率 NMOS 组成 H 桥驱动&#xff0c;集成了电…

01 企业网站架构部署与优化之Apache配置与应用

目录 3.1 Apache连接保持 3.2 Apache的访问控制 3.2.1 客户机地址限制 3.2.2 用户授权限制 1. 创建用户认证数据文件 2. 添加用户授权配置 3. 验证用户访问授权 3.3 Apache日志分割 1. Apache自带rotatelogs分割工具 2. 使用第三方工具cronolog 3.4 AWStats日志分析 3.4.1 …

ns3学习笔记(四):路由概述

基于官网文档的 Routing Overview 部分详细研究一下ns3中路由是怎么工作的 文档链接16.4. Routing overview — Model Library 一、概述 NS3整体的工作架构如下&#xff1a; 路由部分的工作架构如下&#xff1a; 路由部分目前大多数用到的算法都包含在Ipv4RoutingProtocol部分…

【排序 - 插入排序 和 希尔排序】

插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法&#xff0c;它的工作原理是逐步构建有序序列。在排序过程中&#xff0c;它将未排序的元素逐个插入到已排序的部分中&#xff0c;从而在每次插入时扩展已排序序列的长度。 原理介绍 插入排序的基本思…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验17 开放最短路径优先OSPF

一、实验目的 1.验证OSPF协议的作用&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.验证OSPF协议的作用。 四、实验步骤 1.构建网…

Python办公自动化:增值税发票批量识别和核验

腾讯云免费体验地址: https://console.cloud.tencent.com/api/explorer?Product=ocr&Version=2018-11-19&Action=VatInvoiceVerifyNew 首先进行识别,这里以python为例子 # -*- coding: utf-8 -*- import jsonfrom tencentcloud.common.common_client import Commo…

随身WiFi市场乱象横生,随身WiFi测评最好的格行随身WiFi如何引领变革?

在当今随身WiFi市场乱象频发、内卷严重的背景下&#xff0c;消费者对于产品的性能与商家是否会后台割韭菜依旧存疑&#xff0c;尤其是“随身WiFi到底卡不卡&#xff1f;”的问题&#xff0c;成为了广大消费者关注的重点。然而&#xff0c;在众多品牌中&#xff0c;格行随身WiFi…

视频版权音乐处理☞AI分离人声、音效、背景音乐的需求和进展-2024

随着互联网的普及和短视频的兴起&#xff0c;视频内容的全球各大平台分发越来越普遍。然而&#xff0c;不同国家和地区的音乐版权、不同社媒平台拥有的版权和处理政策都存在差异&#xff0c;因此同一个视频在多渠道分发的时候就会产生版权侵权风险。如何既能满足全球多渠道、多…

类与对象-继承-同名成员处理

同名成员处理 #include<iostream> using namespace std;//继承中同名成员处理方式class Base { public:Base(){m_A 100;}void func(){cout << "Base - func()调用" << endl;}void func(int a){cout << "Base - func(int a)调用"…

springboot中通过jwt令牌校验以及前端token请求头进行登录拦截实战

前言 大家从b站大学学习的项目侧重点好像都在基础功能的实现上&#xff0c;反而一个项目最根本的登录拦截请求接口都不会写&#xff0c;怎么拦截&#xff1f;为什么拦截&#xff1f;只知道用户登录时我后端会返回一个token&#xff0c;这个token是怎么生成的&#xff0c;我把它…

第3章.中央服务器的物联网模式--企业系统集成

为了从物联网实施中获得最大价值&#xff0c;物联网系统需要与企业中的现有软件系统集成。事实上&#xff0c;与外部系统的集成允许网络世界和物理世界之间的交互——代表物理世界的物联网系统和驻留在网络/虚拟世界中的外部系统。用于此模式的符号如下图所示&#xff1a; 图3.…

首批!蚂蚁数科通过中国信通院面向大模型的可信执行环境产品专项测试

2024年6月17日&#xff0c;在中国信息通信研究院&#xff08;以下简称“信通院”&#xff09;组织的首批“面向大模型的增强型可信执行环境基础能力专项测试”中&#xff0c;蚂蚁数科摩斯顺利完成全部测试内容&#xff0c;成为首批完成此项测试的组织。 标准及测试介绍 《面向…

【深度学习】图形模型基础(6):模型优化理论

1.引言 在之前的讨论中&#xff0c;我们构建了一个理论模型来表达最优决策规则&#xff0c;这是建立在我们对数据的概率模型有充分理解的基础上的。相对地&#xff0c;经验风险最小化&#xff08;Empirical Risk Minimization, ERM&#xff09;策略则在缺乏精确概率模型的情况…

MVC之 Controller 》》 ModelState ValidationMessageFor ValidationSummary

ModelState是Controller的一个属性&#xff0c;可以被继承自System.Web.Mvc.Controller的那些类访问。它表示在一次POST提交中被提交到服务器的 键值对集合&#xff0c;每个记录到ModelState内的值都有一个错误信息集。尽管ModelState的名字中含有“Model”&#xff0c;但它只有…

医疗器械FDA |FDA网络安全测试具体内容

医疗器械FDA网络安全测试的具体内容涵盖了多个方面&#xff0c;以确保医疗器械在网络环境中的安全性和合规性。以下是根据权威来源归纳的FDA网络安全测试的具体内容&#xff1a; 一、技术文件审查 网络安全计划&#xff1a;制造商需要提交网络安全计划&#xff0c;详细描述产…

FLinkCDC引起的生产事故(二)

背景&#xff1a; 最近在做实时数据的抽取工作&#xff0c;利用FLinkCDC实时抽取目标库Oracle的数据到Doris中&#xff0c;但是在抽取的过程中&#xff0c;会导致目标库的生产库数据库非常卡顿&#xff0c;为了避免对生产环境的数据库造成影响&#xff0c;对生产环境的数据库利…