×

理解容器、镜像和镜像流

在创建和管理容器化软件时,理解容器、镜像和镜像流这些概念非常重要。镜像包含一组可运行的软件,而容器是容器镜像的运行实例。镜像流提供了一种存储相同基本镜像的不同版本的方式。这些不同的版本由相同镜像名称上的不同标签表示。

镜像

OpenShift Dedicated 中的容器基于 OCI 或 Docker 格式的容器镜像。镜像是一个二进制文件,其中包含运行单个容器所需的所有要求,以及描述其需求和功能的元数据。

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

您可以直接使用podmandocker CLI 来构建镜像,但 OpenShift Dedicated 还提供构建器镜像,通过将您的代码或配置添加到现有镜像来帮助创建新镜像。

由于应用程序会随着时间推移而发展,单个镜像名称实际上可以指代相同镜像的许多不同版本。每个不同的镜像都由其哈希值唯一标识,这是一个很长的十六进制数字,例如fd44297e2ddb050ec4f…​,通常缩短为 12 个字符,例如fd44297e2ddb

您可以创建管理容器镜像。

镜像仓库

镜像仓库是一个内容服务器,可以存储和提供容器镜像。例如

registry.redhat.io

一个仓库包含一个或多个镜像库的集合,这些库包含一个或多个标记的镜像。Red Hat 为订阅者提供位于registry.redhat.io的仓库。OpenShift Dedicated 也可以提供它自己的 OpenShift 镜像仓库来管理自定义容器镜像。

镜像库

镜像库是相关容器镜像和标识它们的标签的集合。例如,OpenShift Dedicated Jenkins 镜像位于仓库

docker.io/openshift/jenkins-2-centos7

镜像标签

镜像标签是应用于仓库中容器镜像的标签,用于区分镜像流中特定镜像与其他镜像。通常,标签代表某种版本号。例如,这里:v3.11.59-2是标签

registry.access.redhat.com/openshift3/jenkins-2-rhel7:v3.11.59-2

您可以向镜像添加其他标签。例如,一个镜像可能被分配标签:v3.11.59-2:latest

OpenShift Dedicated 提供oc tag命令,它类似于docker tag命令,但操作的是镜像流而不是直接操作镜像。

镜像 ID

镜像 ID 是一个 SHA(安全哈希算法)代码,可用于拉取镜像。SHA 镜像 ID 不会改变。特定的 SHA 标识符始终引用完全相同的容器镜像内容。例如

docker.io/openshift/jenkins-2-centos7@sha256:ab312bda324

容器

OpenShift Dedicated 应用程序的基本单元称为容器。Linux 容器技术是隔离运行进程的轻量级机制,以便它们仅限于与其指定资源交互。容器一词被定义为容器镜像的特定运行或暂停实例。

许多应用程序实例可以在单个主机上的容器中运行,而不会看到彼此的进程、文件、网络等等。通常,每个容器提供一项服务,通常称为微服务,例如 Web 服务器或数据库,尽管容器可用于任意工作负载。

多年来,Linux 内核一直在整合容器技术的功能。Docker 项目为主机上的 Linux 容器开发了一个方便的管理界面。最近,开放容器倡议 (Open Container Initiative) 制定了容器格式和容器运行时的开放标准。OpenShift Dedicated 和 Kubernetes 增加了在多主机安装中编排 OCI 和 Docker 格式容器的能力。

虽然使用 OpenShift Dedicated 时您不会直接与容器运行时交互,但了解其功能和术语对于理解它们在 OpenShift Dedicated 中的作用以及您的应用程序如何在容器内运行非常重要。

诸如 podman 之类的工具可以用来替换docker命令行工具,直接运行和管理容器。使用podman,您可以单独试验容器,而无需依赖 OpenShift Dedicated。

为什么要使用镜像流 (imagestreams)

镜像流及其关联的标签为在 OpenShift Dedicated 中引用容器镜像提供了一种抽象。镜像流及其标签允许您查看可用的镜像,并确保您正在使用所需的特定镜像,即使存储库中的镜像发生更改。

镜像流不包含实际的镜像数据,而是呈现相关镜像的单个虚拟视图,类似于镜像仓库。

您可以配置构建和部署以监视镜像流,并在添加新镜像时接收通知,并通过执行构建或部署来做出反应。

例如,如果部署使用某个镜像,并且创建了该镜像的新版本,则可以自动执行部署以获取该镜像的新版本。

但是,如果部署或构建使用的镜像流标签未更新,即使容器镜像注册表中的容器镜像已更新,构建或部署也会继续使用以前的(大概已知良好的)镜像。

源镜像可以存储在以下任何位置:

  • OpenShift Dedicated 集成的注册表。

  • 外部注册表,例如 registry.redhat.io 或 quay.io。

  • OpenShift Dedicated 集群中的其他镜像流。

当您定义引用镜像流标签的对象(例如构建或部署配置)时,您指向的是镜像流标签,而不是存储库。当您构建或部署应用程序时,OpenShift Dedicated 使用镜像流标签查询存储库以查找镜像的关联 ID,并使用该确切的镜像。

镜像流元数据与其他集群信息一起存储在 etcd 实例中。

使用镜像流具有几个显著的优点:

  • 您可以标记、回滚标签并快速处理镜像,无需使用命令行重新推送。

  • 当将新镜像推送到注册表时,您可以触发构建和部署。此外,OpenShift Dedicated 为其他资源(例如 Kubernetes 对象)提供通用触发器。

  • 您可以标记某个标签以进行定期重新导入。如果源镜像已更改,则会拾取该更改并将其反映在镜像流中,这将根据构建或部署配置触发构建或部署流程。

  • 您可以使用细粒度的访问控制共享镜像,并快速在团队之间分发镜像。

  • 如果源镜像更改,镜像流标签仍然指向镜像的已知良好版本,确保您的应用程序不会意外中断。

  • 您可以通过镜像流对象的权限配置有关谁可以查看和使用镜像的安全设置。

  • 缺乏在集群级别读取或列出镜像权限的用户仍然可以使用镜像流检索项目中标记的镜像。

镜像流标签 (Image stream tags)

镜像流标签是指向镜像流中镜像的命名指针。镜像流标签类似于容器镜像标签。

镜像流镜像 (Image stream images)

镜像流镜像允许您从标记了特定镜像的特定镜像流中检索特定的容器镜像。镜像流镜像是一个 API 资源对象,它汇集了关于特定镜像 SHA 标识符的一些元数据。

镜像流触发器 (Image stream triggers)

当镜像流标签更改时,镜像流触发器会触发特定操作。例如,导入会导致标签的值更改,这会导致触发器在有部署、构建或其他侦听这些事件的资源时触发。

如何使用集群示例运算符 (Cluster Samples Operator)

在初始启动期间,运算符会创建默认的示例资源以启动镜像流和模板的创建。您可以使用集群示例运算符来管理存储在openshift命名空间中的示例镜像流和模板。

作为集群管理员,您可以使用集群示例运算符来:

关于模板

模板是要复制的对象的定义。您可以使用模板来构建和部署配置。

如何使用 Ruby on Rails

作为开发人员,您可以使用Ruby on Rails来:

  • 编写您的应用程序

    • 设置数据库。

    • 创建欢迎页面。

    • 为 OpenShift Dedicated 配置您的应用程序。

    • 将您的应用程序存储在 Git 中。

  • 在 OpenShift Dedicated 中部署您的应用程序

    • 创建数据库服务。

    • 创建前端服务。

    • 为您的应用程序创建路由。