Docker镜像


Docker镜像

简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker 技术的三大核心概念,分别是:镜像Image,容器Container,仓库Repository。Images(镜像):是一个只读模板,含创建Docker容器的说明,它与操作系统的安装光盘有点像。这是一种很通俗的说法,也很容易理解。

详解

  • 镜像与容器的关系
    我们通常使用docker container rundocker service create命令从某个镜像启动一个或多个容器。一旦容器从镜像启动后,二者之间就变成了互相依赖的关系,并且在镜像上启动的容器全部停止之前,镜像是无法被删除的。
  • 镜像通常比较小
    容器目的就是运行应用或者服务,这意味着容器的镜像中必须包含应用/服务运行所必需的操作系统和应用文件。但是,容器又追求快速和小巧,这意味着构建镜像的时候通常需要裁剪掉不必要的部分,保持较小的体积。
  • 拉取镜像
    Docker主机安装之后,本地并没有镜像。Linux Docker主机本地镜像仓库通常位于/var/lib/docker/,可以使用docker images ls检查本地有没有docker镜像。

    将镜像取到Docker主机本地的操作是拉取。所以,如果想在Docker主机使用最新的Ubuntu镜像,需要拉取它。使用docker image pull ubuntu:latest命令来拉取它。
  • 镜像仓库服务
    Docker镜像存储在镜像仓库服务(Image Registry)当中。Docker客户端的镜像仓库服务是可配置的,默认使用Docker Hub。镜像仓库服务包含多个镜像仓库(Image Repository)。同样,一个镜像仓库中可以包含多个镜像。Docker Hub也分为官方仓库(Official Repository)和非官方仓库(Unofficial Repository)。官方仓库中的镜像是由Docker公司审查的。这意味着其中的镜像会及时更新,由高质量的代码构成,这些代码是安全的,有完善的文档。
  • 镜像命名和标签
    给出镜像的名字和标签,就能在官方仓库中定位一个镜像(采用“:”分隔)。从官方仓库拉取镜像时,docker image pull命令的格式如下。docker image pull <repository>:<tag>

    此条命令显示了如何从ubuntu仓库拉取了标有“latest”标签的镜像。

    • 首先,如果没有在仓库名称后指定具体的镜像标签,则Docker会假设用户希望拉取标签为latest的镜像。
    • 其次,latest是一个非强制标签,不保证指向仓库中最新的镜像。
    • 从非官方仓库拉取镜像时,只需要在仓库名称面前加上Docker Hub的用户名或者组织名称。
  • 镜像可以有多个标签
    不同的标签可以指向相同的镜像,一个镜像可以有多个标签
  • 过滤docker image ls的输出内容
    Docker提供--filter参数来过滤docker image ls命令返回的镜像列表内容。参考docker image ls --filter dangling=true。Docker目前支持如下的过滤器。

    • dangling:可以指定true或者false,仅返回悬虚镜像(true),或者非悬虚镜像(false)。悬虚(dangling)镜像:没有标签的镜像被称为悬虚镜像,在列表中展示为<none>:<none>。通常出现这种情况,是因为构建了一个新镜像,然后为该镜像打了一个已经存在的标签。当此情况出现,Docker会构建新的镜像,然后发现已经有镜像包含相同的标签,接着Docker会移除旧镜像上面的标签,将该标签标在新的镜像之上。可以通过docker image prune命令移除全部的悬虚镜像。如果添加了-a参数,Docker会额外移除没有被使用的镜像(那些没有被任何容器使用的镜像)。
    • before:需要镜像名称或者ID作为参数,返回在指定镜像之前被创建的全部镜像。
    • since:与before类似,不过返回的是指定镜像之后创建的全部镜像。
    • label:根据标注(label)的名称或者值,对镜像进行过滤。docker image ls命令输出中不显示标注内容。
    • 其他的过滤方式可以使用reference,使用reference完成过滤并且仅显示标签为latest的示例:docker image ls --filter reference="*:latest"
  • 搜索Docker Hub
    简单模式下,该命令会搜索所有“NAME”字段中包含特定字符串的仓库。“NAME”字段是仓库名称,包含了Docker ID,或者非官方仓库的组织名称。

    • 上面返回的镜像中既有官方的也有非官方的。可以使用--filter "is-official=true",使命令返回内容只显示官方镜像。
    • 默认情况下,Docker只返回25行结果。但是,读者可以指定--limit参数来增加返回内容行数,最多为100行。
  • 镜像和分层
    Docker镜像由一些松耦合的只读镜像层组成。Docker负责堆叠这些镜像层,并且将它们表示为单个统一的对象。

    在上面输出内容中,以Pull complete结尾的每一行都代表了镜像中某个被拉取的镜像层。另一种查看镜像分层的方式是通过docker image inspect命令。

    所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合。
  • 共享镜像层
    Docker可以识别出要拉取的镜像中,哪几层已经在本地存在。
  • 镜像散列值(摘要)
    镜像层是实际数据存储的地方(比如文件等,镜像层之间是完全独立的,并没有从属于某个镜像集合的概念)。镜像的唯一标识是一个加密ID,即配置对象本身的散列值。每个镜像层也由一个加密ID区分,其值为镜像层本身内容的散列值。这意味着修改镜像的内容或其中任意的镜像层,都会导致加密散列值的变化。所以,镜像和其镜像层都是不可变的,任何改动都能很轻松地被辨别。这就是所谓的内容散列(Content Hash)。在推送和拉取镜像的时候,都会对镜像层进行压缩来节省网络带宽以及仓库二进制存储空间。但是压缩会改变镜像内容,这意味着镜像的内容散列值在推送或者拉取操作之后,会与镜像内容不相符。Docker Hub会根据镜像层重新计算散列值每个镜像层同时会包含一个分发散列值(Distribution Hash)。这是一个压缩版镜像的散列值,当从镜像仓库服务拉取或者推送镜像的时候,其中就包含了分发散列值,该散列值会用于校验拉取的镜像是否被篡改过。

声明:Hello World|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - Docker镜像


我的朋友,理论是灰色的,而生活之树是常青的!