docker第五篇之docker镜像详解

①Docker镜像简介

    如果你熟悉VM,可以把Docker镜像理解为VM模板,VM模板就像停止运行的VM,而Docker镜像就像停止运行的容器。常见的镜像仓库服务是Docker Hub,但也存在其他镜像仓库服务。镜像由多隔层组成,每层叠加之后,从外部看来就像一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含了应用运行所必需的文件和依赖。

②Docker镜像----详解

    前面提到镜像就像停止运行的容器,实际上,可以停止某个容器的运行,并从中创建新的镜像。在该前提下,镜像可以理解为一种构建时结构,而容器可以理解为运行时结构。

  (1)镜像和容器

            一旦容器从镜像启动后,二者就变成了互相依赖的关系,并且在镜像上启动的容器全部停止之前,镜像是无法被删除的。

  (2)镜像通常比较小

            容器的目的就是运行应用或者服务,这意味着容器的镜像中必须包含应用/服务运行所必须的操作系统和应用文件。但是,容器又追求快速和小巧,这意味着构建镜像的时候通常需要剪裁掉不必要的部分,保持较小的体积。

  (3)镜像仓库服务

             Docker镜像存储在镜像仓库服务中,Docker客户端的镜像仓库服务是可以配置的,默认使用Docker Hub。其分为官方仓库(Official Repository)和非官方仓库(Unofficial Repository)

  (4)镜像命名和标签

             只需要给出镜像的名字和标签,就能在官方仓库中定位一个镜像(采用“:”分隔),从官方仓库拉取镜像时,命令格式如下:

docker image pull <repository> : <tag>

             如果没有在仓库名称后指定具体的镜像标签,则Docker会假设用户希望拉取标签为latest的镜像。注意:标有latest标签的镜像不保证这是仓库中最新的镜像,所以使用latest标签时要谨慎! 

             从非官方仓库拉取镜像时,需要在仓库名称前加上Docker Hub的用户名或者组织名称。如下:

docker image pull "用户名"/<repository>:<tag>

             从第三方镜像仓库服务获取镜像(非Docker Hub),则需要在镜像仓库名称前加上第三方镜像仓库服务的DNS名称(需要注意的是可能需要有第三方镜像仓库服务的账户,在拉取镜像前完成登录),如下:

docker image pull "DNS"/<repository>:<tag>

   (5)为镜像打多个标签

            一个镜像可以根据用户需要设置多个标签,这是因为标签是存放在镜像元数据中的任意数字或者字符串。在docker image pull命令中指定-a参数可以拉取仓库中的全部镜像(就不能指定tag了),语法如下:

docker image pull -a <repository>

   (6)过滤 docker image ls的输出内容

         docker 通过--filter参数来果过滤docker image ls命令返回的镜像列表的内容,语法如下:

docker image ls --filter="过滤器名称"="对应过滤器可以使用的参数"

         这里介绍一下“悬虚镜像”,就是那些没有标签的镜像被称为悬虚镜像,出现这种情况是因为构建了一个新的镜像,然后为该镜像打了一个已经存在标签,此时,docker发现已经有镜像包含相同的标签,接着Docker会移除旧镜像上的标签,将该标签标在新的镜像之上,那么旧镜像就变成了悬虚镜像。可以通过以下命令删除全部的悬虚镜像

docker image prune

         docker目前支持的过滤器如下:

             dangling:可以指定true或者false,仅返回悬虚镜像(true),或者返回非悬虚镜像(false)

             before:需要使用镜像名称或者ID作为参数,返回在之前被创建的全部镜像列表

             since:与before类似,不过返回的是指定镜像之后创建的全部镜像

             lable:根据标注(lable)的的名称或值,对镜像进行过滤,docker image ls命令输出中不显示标注内容

             其他的过滤方式可以使用reference,下面是使用reference完成过滤并且仅显示标签为latest的实例 

docker image ls --filter=reference="*:latest"

  (7)镜像和分层

           Docker 镜像由一些松耦合的只读镜像层组成,Docker负责堆叠这些镜像层,并且将它们表示为单个同一的对象。有多种方式可以查看和检查构成某个镜像的分层,第一种:就是我们在pull镜像时,命名输出内容中,以pull complete结尾的每一行都代表了镜像中某个被拉取的镜像层。第二种:docker image inspect,在输出内容中的“Layers”对应的列表中就是该镜像的镜像层。

 (8)共享镜像层

            多个镜像之间可以并且确实会共享镜像层,这样可以有效节省空间并提升性能。那么我们怎么知道是否镜像之间共享了镜像层呢,这个可以在pull镜像时指定-a参数,拉取某个镜像的所有镜像,注意那些Already exists结尾的行,可以说明镜像层是可以共享的。

  (9)根据摘要拉取镜像

            我们之前都是通过标签(tag)来拉取镜像的,但是tag是可变的,这意味着如果给镜像打错标签,或者给镜像打一个已经存在标签,都可能导致问题。那么什么是摘要,每一个镜像都存在一个基于内容的密码散列值,摘要就是指这个散列值。每次我们在拉取镜像后,摘要都会作为返回代码的一部分,可以使用docker image ls 命令之后添加--digests参数查看镜像摘要。

通过摘要拉取镜像的方式和通过tag拉取镜像的方式稍微有点区别,如下:

语法:
docker image pull <repository>@"摘要值"

例:
docker image pull centos@sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd

(10) 删除docker主机上全部镜像的快捷方式:

docker image rm $(docker image ls -q) -f

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值