docker镜像详解

文章目录

一、什么是docker镜像

 二、为什么需要镜像

三、镜像相关命令详解

3、1 命令清单

3、2 命令详解

四、镜像实战

4、1 镜像操作案例

4、2 离线迁移镜像

4、3 镜像存储的压缩与共享


🙋‍♂️ 作者:@Ggggggtm 🙋‍♂️

👀 专栏:Docker 👀

💥 标题:docker镜像 💥

 ❣️ 寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景 ❣️

一、什么是docker镜像

  我们一直说docker镜像,那么docker镜像到底是什么呢?

  • Docker image 本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。
  • 我们可以把 Docker image 理解成一个模板, 可以通过这个模板实例化出来很多容器。
  • image 里面是一层层文件系统 Union FS。联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统。
  • 每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker镜像中每一层文件系统都是只读的。
  • 构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。

  通俗理解,Docker镜像是用于创建和运行容器的轻量级、可执行的独立软件包。它是一个包含了应用程序的文件系统,其中包括了运行该应用程序所需的所有内容:代码、运行时环境、系统工具、系统库以及依赖的软件。镜像是用于创建容器的模板,并且可以被共享和重复使用。

 二、为什么需要镜像

  在部署应用时,通过手工或写一些脚本的方式进行部署。这样部署面临问题就是云端和本地环境一致问题。用户为每个应用打包过程比较繁琐,需要配置和给中修改等操作,非常费劲。
  然而, Docker 镜像就是为了解决这个小小的打包功能,突然一夜之间成名。那么,你可能说 Docker 镜像就是个压缩包,是的,你猜对了,它就像一个压缩包文件。它是如何解决 Paas 时代所面临的云端和本地一致性问题?很简单,它是把一个镜像制作成一个完整的操作系统所有文件和对应的目录结构,这样的压缩包是跟你本地和测试环境用的操作系统一摸一样。
  docker 最大的贡献就是定义了容器镜像的分层的存储格式, docker 镜像技术的基础是联合文件系统(UnionFS),其文件系统是分层的。这样既可以充分利用共享层,又可以减少存储空间占用。
  docker 镜像提供了一种打包应用程序和预配置服务器环境的便捷方式,可以很方便的将其用于个人用途或与其他 Docker 用户公开共享。

  ps:通常在虚拟机中的 OS 基本上都是以G为单位的,为什么在 Docker 镜像中才100M左右? 

  其实是因为,对于一个精简版的操作系统,rootfs 可以非常小,只需要包含基本的命令、工具和程序库即可,因为底层直接使用宿主机的 kernel,自己只需要提供 rootfs 便可。此外,即使存在不同的 Linux 发行版本,但是 bootfs 基本都是一致的,可以公用 bootfs。

三、镜像相关命令详解

3、1 命令清单

  docker镜像命令清单及简单解释:

3、2 命令详解

  有一部分命令是在前面的文章中有详解,所以在这里就简单解释。新的一些命令会详细解释,并且解释实际举例子! 

  docker images:查看本地镜像

  我们知道当我们从docker远端仓库拉取镜像后,都过存储到我们本地的主机上。可以通过docker images 来查看本地主机上的镜像都有哪些。如下图:

 docker images还有一些常用的选项:

  • -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
  • --digests :显示镜像的摘要信息;
  • -f :显示满足条件的镜像;
  • --format :指定返回值的模板文件;
  • --no-trunc :显示完整的镜像信息;
  • -q :只显示镜像 ID。

  一些常用选项举例如下图:

  docker tag :给镜像打标签

  在Docker中,docker tag命令用于为一个已存在的镜像创建一个新的标签。它可以为镜像指定一个更友好或更具描述性的名称,也可以用于创建镜像的不同版本。以下是docker tag命令的详细解释: 

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

  我们再来结合之前的例子来理解一下,如下图:

  简单理解,docker tag就是给镜像重命名,但是不仅仅是对镜像名称重命名,还可以对其tag标签重命名。一般docker tag都是与docker push一起用,也就是对镜像创建一个新的标签后,可以推送到远端仓库。

  docker pull、docker push参看上一篇文章! 

  docker rmi:删除镜像

  本地镜像可是需要占用磁盘空间的。当我们不再使用该镜像时,可以直接将镜像删除。它还有一些常用选项:

  • -f :强制删除;
  • --no-prune :不移除该镜像的过程镜像,默认移除;

  先查看一下本地镜像,如下图:

   我们现在想要删除Ubuntu镜像。具体如下图:

  通过上图我们发现,该镜像被一个容器正在使用。我们通过docker ps -a来查看一下。如下图:

  我们发现该容器已经停止运行了,所以可以通过docker rm 将该容器进行删除。如下图:

  但是我们删除该容器后,发现依旧删除不了该镜像,是因为任然有容器在使用该镜像。我们再次对容器进行删除。直到没有容器使用该镜像时,就可以删除该镜像了。但是我们发现删除容器也是很麻烦的一个过程,同时我们又确定了该镜像不再使用,就可以加上-f选项,就是强制删除!如下图:

 docker save:将指定镜像保存成 tar 归档文件

  docker save是用于将Docker镜像保存成本地文件的命令。它将指定的镜像及其所有依赖的层和元数据打包成一个.tar文件。这个文件可以在离线环境或其他Docker主机上传输,并通过docker load命令重新加载为可用的镜像。

  使用docker save命令需要提供镜像的名称或ID,并可以选择指定输出文件的路径和文件名。例如,以下是docker save命令的基本语法:

docker save [OPTIONS] IMAGE [IMAGE...]

  有一个常用的关键选项:-o :输出到的文件。下面我们来结合一个例子来理解一下。

  先查看一下本地镜像,如下图:

  现在我们想要把所有的nginx镜像打包一下,如下图:

  我们也能看到形成了一个mynginx.tar的文件。下面我们结合docker load命令再次理解docker save。

  docker load:导入使用docker save命令导出的镜像

  docker load命令用于从本地文件加载Docker镜像。它可以将通过docker save命令保存的镜像文件重新加载为可用的镜像,并添加到本地的Docker镜像库中。

  使用docker load命令需要提供从docker save命令获取的.tar文件的路径。以下是docker load命令的基本语法:

docker load [OPTIONS]

关键参数

  • --input , -i : 指定导入的文件,代替 STDIN。
  • --quiet , -q : 精简输出信息。

  我们在讲解docker save时,已经形成了自己的nginx的tar包。我们先来查看一下本地镜像。如下:

  为了更加突出实验现象,我们可以先把nginx的镜像进行删除。然后在加载我们的tar包。如下图:

  我们再次加载一下我们刚刚形成的tar包。如下图:

  可以看到我们删除的镜像,通过加载tar包后再次出现了。

  docker image inspect:查看镜像详细信息。参考上篇文章。 

  docker history:显示镜像历史

  docker history命令是Docker提供的一个用于查看镜像创建历史的工具。它显示了构建一个镜像所用到的各个层次以及每个层次对应的命令。

  使用docker history命令的语法如下:

docker history [OPTIONS] IMAGE

  一些关键参数如下:

  • -H , --human :大小和日期采用人容易读的格式展现
  • --no-trunc :显示全部信息,不要隔断;
  • -q, --quiet: 只显示镜像 id 信息;

  下面我们看一个实际例子:

  默认情况下就是带着 -H 选项的,其意思就是把SIZE变成带有单位的,而不是字节。

  docker import 和 docker build会在后续文章中详细解释。

  docker image prune:删除不使用的镜像

  docker image prune 是用于清理未使用的 Docker 镜像。当你在使用 Docker 运行容器时,可能会生成许多不再需要的镜像,这些镜像占据了硬盘空间。docker image prune 命令可以帮助你清理这些不再使用的镜像,释放出宝贵的存储空间。

  当你执行 docker image prune 命令时,Docker 会自动检查你的系统,找到那些没有被任何容器所使用的镜像,并将其标记为"未使用"。然后,你将被提示确认是否删除这些未使用的镜像。如果你确认删除,Docker 将会删除这些镜像文件,并从你的硬盘上释放空间。

执行 docker image prune 命令时,你可以使用一些额外的参数来定制清理过程。例如,你可以使用 -a 参数清理所有未使用的镜像,包括那些被没有处于运行状态的容器所引用的镜像。使用 --filter 参数可以根据特定的条件过滤要清理的镜像。使用-f参数可以跳过确认步骤,直接删除所有未使用的镜像。

  需要注意的是,执行 docker image prune 命令会永久删除你的镜像文件,一旦删除将无法恢复。因此,在执行此命令之前,请务必确认你不再需要这些镜像,并且备份重要的镜像文件。

  • -a , --all : 删除全部不使用的镜像;
  • --filter filter:指定过滤条件;
  • -f, --force :不提示是否删除;

  我们先来看一如下实例:

  通过上图我们看到,正常情况下还会进行提示,加上-f选项就不会再提示了。如下图:

  我们再来看一下-a选项,如下图:

四、镜像实战

4、1 镜像操作案例

  首先我们查找一下想要拉取的镜像,如下图:

   但是我们发现有很多不想要的结果,可以通过加上一些选项来筛选一下,如下图:

  当你运行docker search -f stars=10 --limit 3 busybox命令时,它会搜索Docker Hub上与busybox相关的镜像。下面是对该命令的详细解释:

  • docker search: 这是Docker命令行工具提供的一个命令,用于在Docker Hub上搜索镜像。
  • -f stars=10: 这是搜索选项之一,用于指定筛选条件。在这里,我们使用 stars=10来筛选出启动数为10的镜像。"stars"指的是在Docker Hub上该镜像所拥有的星标数量。
  • --limit 3: 这是另一个搜索选项,用于限制结果的数量。在这里,我们指定只返回前三个匹配的镜像。
  • busybox: 这是我们要搜索的关键词,代表了一个非常轻量级的Linux发行版镜像。

  当我们找到有相关的镜像后,就可以进行拉取下载了。具体如下图:

  当我们下载完成后,先来查看一下镜像仓库在本地的存储信息。默认的路径是:/var/lib/docker/。但是我这里修改过,但是存储信息都是一样的。具体如下图:

  然后再次查看 overlay2/repositories.json 文件,该文件记录已拉取镜像文件的信息。如下图:
  通过查看本地镜像, 发现和 repositories.json 文件记录的信息是相同的。知道镜像在本地的存储信息后,我们还可以查看镜像的分层和一些详细信息。如下:

  现在我们想要把本地的nginx镜像推送到远端的仓库中。如下图:

  我们需要先对镜像打标签。所谓的打标签,也就是相当于重命名。目的是为了更好的找到我们的远端仓库。具体操作如下:

  现在我们就可以直接将打过标签的镜像推送到远端镜像了。需要注意的是,推送镜像需要先登录相关的账号。如下图:

  然后可以运行相关镜像,如下图:

  最后我们可以删除镜像。可以根据 id 和名字删除,对于使用的镜像需要先清理容器再删除镜像。如下图:

  当我们在删除有标签的镜像时,默认都是先去标签,并不是真正的删除了镜像。当只剩下最后一个标签时,才会真正的删除该镜像。具体如下图:

4、2 离线迁移镜像

  首先,我们需要将服务器 1 上镜像保存为 tar 文件,如操作系统为 ubuntu。具体如下图:

  然后可以通过scp命令 或者只用使用可视化工具拷贝镜像到第二台服务器上。由于这里没有第二台服务器,就不再演示。命令是scp mytest.tar root@IP:/root/data,每个参数的作用如下解释:

  • scp: 是一个用于安全地在网络上进行文件复制的命令。它使用SSH协议来保证传输的安全性。

  • mytest.tar: 这是要复制的文件的名称。在这个例子中,它是名为"mytest.tar"的文件。确保该文件位于当前工作目录下,或者你可以提供完整的文件路径。

  • root@IP:/root/data: 这是远程服务器的地址和目标位置。

    • root:是远程服务器的用户名。如果你与远程服务器使用不同的用户名,请相应地更改该值。
    • IP:是远程服务器的IP地址。确保将其替换为实际的IP地址。
    • :/root/data:这是远程服务器上的目标目录。在这个例子中,它是/root/data目录。

  此命令将会把本地的"mytest.tar"文件复制到远程服务器上的/root/data目录中。请确保你具有对远程服务器的访问权限,并且输入正确的用户名和IP地址。

  当tar包拷贝到第二台服务器上后,就可以将其镜像从tar包中恢复出来。然后再次运行该镜像也是可以的。即便是两台服务器的配置不相同,也是可以的。 

4、3 镜像存储的压缩与共享

  拉取 nginx 镜像,如果本地没有,镜像是从仓库拉取,如果有会提示镜像已经存在,并且是最新的。 

  Docker images 查看本地镜像,可以看到该镜像为 142Mb。

  从上面看到 nginx 为 1.21.1 的大小是 140 多 MB,但是我们从 docker hub 上查看可以看到镜像是 50 多 MB,说明发生了压缩,因为仓库到本地需要走网络,所以文件越小越好。这也就意味着在拉取到本地后,也会对其进行解压。

  在Docker中,digest是一个唯一标识符,用于表示镜像的内容的哈希值。它由SHA256算法生成,并且可以用来确定镜像文件的一致性和完整性,以及作为镜像的唯一标识。

当你下载或推送一个镜像时,容器运行时会使用digest来验证该镜像的完整性,以确保它与远程仓库上的镜像一致。如果digest匹配,则说明镜像未被更改;如果不匹配,则可能意味着镜像已经被篡改或损坏。

Docker使用digest的好处是,无论镜像标签如何变化(因为标签可以重新指向不同的镜像),digest都是唯一的,因此可以确保使用特定的digest始终获取相同的镜像。

你可以使用docker image inspect <image>命令来查看镜像的digest信息。在返回的JSON输出中,你可以找到RepoDigests字段,其中包含了该镜像的digest值。

  把一个镜像打多个 tag,然后同时推送仓库,可以看到是说层已经存在,不会重复存储。 

  添加一个新的镜像到我们的仓库的时候,如果 docker hub 发现已经有了是 mount的,不是从本地推上去的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

西瓜书学习笔记——密度聚类(公式推导+举例应用)

文章目录 算法介绍实验分析 算法介绍 密度聚类是一种无监督学习的聚类方法&#xff0c;其目标是根据数据点的密度分布将它们分组成不同的簇。与传统的基于距离的聚类方法&#xff08;如K均值&#xff09;不同&#xff0c;密度聚类方法不需要预先指定簇的数量&#xff0c;而是通…

MGRE实验报告二

实验要求&#xff1a; 实验预览图&#xff1a; 实验分析&#xff1a; 1、对R1-R5配置IP地址&#xff0c;同时R1-R5每个路由器各有一个环回 2.1、对R1、R3、R4路由器开启虚拟接口1&#xff0c;分别配置隧道IP、接口封装协议&#xff0c;接口类型、定义封装源、开启伪广播功能&…

Mysql 删除数据

从数据表中删除数据使用DELETE语句&#xff0c;DELETE语句允许WHERE子句指定删除条件。DELETE语句基本语法格式如下&#xff1a; DELETE FROM table_name [WHERE <condition>]; table_name指定要执行删除操作的表&#xff1b;“[WHERE <condition>]”为可选参数&a…

Nginx 1.25配置QUIC和HTTP3

Nginx 1.25配置QUIC和HTTP/3 Nginx在编译时需要配置相应的SSL库&#xff0c;以确保能够支持HTTP3.0和HTTP2.0等基于HTTPS的协议。这些加密算法主要由OpenSSL提供。另外&#xff0c;BoringSSL是谷歌创建的OpenSSL分支&#xff0c;专门用于支持TLS 1.3的UDP协议的0-RTT数据传输加…

从C向C++6——运算符重载

本文的主要知识点是C中的运算符重载。 1.运算符重载 所谓重载&#xff0c;就是赋予新的含义。函数重载&#xff08;Function Overloading&#xff09;可以让一个函数名有多种功能&#xff0c;在不同情况下进行不同的操作。**运算符重载&#xff08;Operator Overloading&#…

【VS Code+Verilog+Vivado使用】(1)常用插件

文章目录 1 常用插件1.1 Chinese Language Pack1.2 Verilog-HDL/SV/BSV1.2.1 语法高亮1.2.2 代码片段1.2.3 代码检查1.2.4 Ctags1.2.4.1 自动补全设置1设置2 1.2.4.2 悬停显示1.2.4.3 转到定义1.2.4.4 查看定义1.2.4.5 模块例化设置1 1.3 vscode-icons1.4 Hex Editor1.5 Error …

Web开发8:前后端分离开发

在现代的 Web 开发中&#xff0c;前后端分离开发已经成为了一种常见的架构模式。它的优势在于前端和后端可以独立开发&#xff0c;互不干扰&#xff0c;同时也提供了更好的可扩展性和灵活性。本篇博客将介绍前后端分离开发的概念、优势以及如何实现。 什么是前后端分离开发&am…

国考省考行测:逻辑判断,分析推理,排除法,假设法

国考省考行测&#xff1a;逻辑判断&#xff0c;分析推理 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国考省考最重要的还是申论和行测&#xff0c;所以大家认真准备吧&#xff0c;我讲一起屡屡申论和…

【数据结构与算法】之哈希表系列-20240129

这里写目录标题 一、217. 存在重复元素二、219. 存在重复元素 II三、242. 有效的字母异位词四、268. 丢失的数字五、290. 单词规律六、349. 两个数组的交集七、350. 两个数组的交集 II 一、217. 存在重复元素 简单 给你一个整数数组 nums 。如果任一值在数组中出现至少两次 &a…

Java 面试题之 IO(二)

字符流 文章目录 字符流Reader&#xff08;字符输入流&#xff09;Writer&#xff08;字符输出流&#xff09; 文章来自Java Guide 用于学习如有侵权&#xff0c;立即删除 不管是文件读写还是网络发送接收&#xff0c;信息的最小存储单元都是字节。 那为什么 I/O 流操作要分为字…

【linux】-linux操作系统分支及包管理系统

一、Linux主要版本分支 免费的&#xff1a;ubuntu、centos&#xff0c;分属红帽、大便分支。 centos渐渐退出&#xff0c;CentOS 之父创造的 Rocky Linux&#xff08;再见 CentOS! Rocky Linux 要来了&#xff09; 二、Rocky Linux 官方地址&#xff1a;https://rockylinux.…

【大数据】Flink 架构(三):事件时间处理

《Flink 架构》系列&#xff08;已完结&#xff09;&#xff0c;共包含以下 6 篇文章&#xff1a; Flink 架构&#xff08;一&#xff09;&#xff1a;系统架构Flink 架构&#xff08;二&#xff09;&#xff1a;数据传输Flink 架构&#xff08;三&#xff09;&#xff1a;事件…

【Python笔记-设计模式】建造者模式

一、说明 又称生成器&#xff0c;是一种创建型设计模式&#xff0c;使其能够分步骤创建复杂对象。允许使用相同的创建代码生成不同类型和形式的对象。 (一) 解决问题 对象的创建问题&#xff1a;当一个对象的构建过程复杂&#xff0c;且部分构建过程相互独立时&#xff0c;可…

吉利汽车:S-SDLC融入开发体系,推动智能汽车安全发展

吉利汽车是中国汽车行业的知名品牌&#xff0c;是一家具有国际化视野的汽车企业&#xff0c;在中国汽车市场自主品牌中占据领军地位。吉利汽车集团数字化中心利用数字化技术优势赋能业务升级&#xff0c;推动研发效率提升和产品安全能力拓展&#xff0c;进行整体数字化转型。 在…

键盘上Ins键的作用

前几天编写文档时&#xff0c;发现一个问题&#xff1a;插入内容时&#xff0c;输入的字符将会覆盖光标位置后的字符。原来是按到了键盘上的 Ins键&#xff0c;解决方法是&#xff1a;再按一次 Ins键&#xff08;Ins键如果独立作为一键时&#xff0c;否则使用 “Fn Ins”组合键…

C++ —— 智能指针

C —— 智能指针 文章目录 C —— 智能指针一、为什么需要使用智能指针&#xff1f;二、内存泄漏什么是内存泄漏&#xff1f;内存泄漏的危害&#xff1f;内存泄漏分类 三、智能指针的使用及原理1. RAII2. 智能指针的原理 三、智能指针的缺陷及其发展3.1 std::auto_ptr3.2 std::…

华为笔记本matebook pro X如何扩容 C 盘空间

一、前提条件 磁盘扩展与合并必须是相邻分区空间&#xff0c;且两个磁盘类型需要相同。以磁盘分区为 C 盘和 D 盘为例&#xff0c;如果您希望增加 C 盘容量&#xff0c;可以先将 D 盘合并到 C 盘&#xff0c;然后重新创建磁盘分区&#xff0c;分配 C 盘和 D 盘的空间大小。 访…

Element ui 的组件弹窗 el-dialog点击的时候全屏变灰问题解决

最近在使用Element UI 的弹窗组件的时候发现这个组件各种的应用都没有问题&#xff0c;数据和元素的应用都是正确的但是在点击显示这个弹窗的时候全屏幕都会变灰。 这也不是因为增加了modal 遮挡幕的问题&#xff0c;在经过不断的排查代码的时候基本排除了代码的问题&#xf…

利用外卖系统源码构建高效的在线订餐平台

在当今数字化时代&#xff0c;外卖服务已成为人们日常生活中不可或缺的一部分。为了满足用户需求&#xff0c;许多创业者和企业都希望搭建自己的在线订餐平台。利用现有的外卖系统源码&#xff0c;可以快速构建一个高效、安全的在线订餐平台。本文将介绍如何利用外卖系统源码来…

Qt SQLite3数据库加密 QtCipherSqlitePlugin

在客户端软件开发过程中&#xff0c;基本都会涉及到数据库的开发。QT支持的数据库也有好几种&#xff08;QSQLITE, QODBC, QODBC3, QPSQL, QPSQL7&#xff09;&#xff0c;SQLite就是其中之一&#xff0c;但这个 SQLite 是官方提供的开源版本&#xff0c;没有加密功能的。如果对…