①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>

注意:标有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)根据摘要拉取镜像

docker import镜像长时间没反应 docker中的镜像_docker

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

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

例:
docker image pull centos@sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd

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

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