镜像概述

理解容器和镜像

当你着手创建和管理容器化软件时,理解容器和镜像这两个重要概念非常关键。镜像包含一组可直接运行的软件,而容器则是容器镜像的一个运行中实例。同一个镜像名称下的不同版本通过不同的 tag 表示。

镜像

中的容器基于 OCI 格式的容器镜像。镜像是一种二进制文件,其中包含运行单个容器所需的全部内容,以及描述其需求和能力的元数据。

你可以将其视为一种打包技术。除非在创建时授予额外访问权限,否则容器只能访问镜像中定义的资源。通过在多个主机上的多个容器中部署同一个镜像,并在它们之间进行负载均衡, 可以为封装在镜像中的服务提供冗余和水平扩展能力。

你可以直接使用 nerdctlcontainer CLI 来构建镜像,但 也提供了 builder images,可通过向现有镜像中添加你的代码或配置来协助创建新镜像。

由于应用会随着时间不断演进,同一个镜像名称实际上可能指向同一镜像的多个不同版本。每个不同的镜像都通过其 hash 唯一标识,即一个很长的十六进制数,例如 fd44297e2ddb050ec4f…,通常会缩短为 12 个字符,例如 fd44297e2ddb。

镜像 registry

镜像 registry 是一种内容服务器,可用于存储和提供容器镜像。例如:

registry 包含一个或多个镜像 repository 的集合,每个 repository 又包含一个或多个带标签的镜像。 可以提供自己的镜像 registry,用于管理自定义容器镜像。

镜像 repository

镜像 repository 是相关容器镜像及其标识 tag 的集合。例如, Jenkins 镜像位于以下 repository 中:

jenkins-2-centos7

镜像 tag

镜像 tag 是应用于 repository 中容器镜像的标签,用于将特定镜像与 image stream 中的其他镜像区分开来。通常,tag 表示某种版本号。例如,下面的 :v3 .11.59-2 就是 tag:

jenkins-2-centos7:v3.11.59-2

你可以为镜像添加额外的 tag。例如,一个镜像可能被分配 :v3 .11.59-2 和 :latest 这两个 tag。

镜像 ID

镜像 ID 是一个 SHA(Secure Hash Algorithm)代码,可用于拉取镜像。SHA 镜像 ID 不能更改。特定的 SHA 标识符始终引用完全相同的容器镜像内容。例如:

jenkins-2-centos7@sha256:ab312bda324

容器

应用的基本单元称为容器。Linux 容器技术是一种轻量级机制,用于隔离运行中的进程,使其仅能与指定资源交互。container 这个词被定义为容器镜像的一个特定运行中或暂停中的实例。

在单个主机上,可以同时运行许多应用实例,这些实例彼此之间无法访问对方的进程、文件、网络等。通常,每个容器提供单一服务,通常称为微服务,例如 Web server 或 database,不过容器也可用于任意工作负载。

多年来,Linux kernel 一直在为容器技术逐步加入相关能力。早期的容器 runtime 项目引入了便于在主机上运行隔离应用的管理界面。近年来,Open Container Initiative 已为容器格式和容器 runtime 制定了开放标准。 和 Kubernetes 增加了在多主机部署之间编排 OCI 格式容器的能力。

尽管在使用 时你不会直接与容器 runtime 交互,但了解它们的能力和术语,对于理解它们在 中的作用,以及你的应用如何在容器内部运行,仍然很重要。