4.2. 构建一个简单容器

您对应用程序有了一个想法,想要对其进行容器化。

首先,您需要一个用于构建容器的工具,如 buildah 或 docker,还需要一个描述容器中内容的文件,通常是 Dockerfile

接下来,您需要一个位置来推送生成的容器镜像,以便可以将它拉取到您想要它运行的位置。这个位置就是容器 registry。

大多数 Linux 操作系统上都会默认安装各个组件的一些示例,但 Dockerfile 除外,需要您自己提供。

下图显示了构建和推送镜像的流程:

图 4.1. 创建简单容器化应用程序并将其推送到 registry

创建并推送容器化应用程序

如果您使用运行 Red Hat Enterprise Linux (RHEL) 作为操作系统的计算机,则容器化应用程序创建过程需要以下几个步骤:

  1. 安装容器构建工具:RHEL 包含一组工具,其中包括用于构建和管理容器的 podman、buildah 和 skopeo。
  2. 创建一个 Dockerfile 来组合基础镜像和软件:有关构建容器的信息存放在名为 Dockerfile 的文件中。在这个文件中,您要标识从中构建的基本镜像、要安装的软件包,以及要复制到容器中的软件。您还要标识参数值,如公开到容器外部的网络端口和挂载到容器内的卷。将您的 Dockerfile 和要容器化的软件放在 RHEL 系统上的某一目录中。
  3. 运行 buildah 或 docker 构建:运行 buildah build-using-dockerfiledocker build 命令,将您选择的基础镜像拉取到本地系统,再创建一个存储在本地的容器镜像。 您还可以使用 buildah,在不用 Dockerfile 的前提下构建容器。
  4. 标记(tag)并推送到 registry:向新容器镜像添加标签 (tag),以标识要在其中存储和共享容器的 registry 位置。然后,通过运行 podman pushdocker push 命令将该镜像推送到 registry。
  5. 拉取并运行镜像:从具有 podman 或 docker 等容器客户端工具的任何系统,运行用于标识新镜像的命令。例如,运行 podman run <image_name>docker run <image_name> 命令。其中,<image_name> 是新容器镜像的名称,类似于 quay.io/myrepo/myapp:latest。registry 可能需要凭证才能推送和拉取镜像。

如需有关如何构建容器镜像、将其推送到 registry 并运行它们的过程的更多详细信息,请参阅使用 Buildah 自定义镜像构建

4.2.1. 容器构建工具选项

尽管 Docker Container Engine 和 docker 命令是操作容器的常用工具,但在 RHEL 和许多其他 Linux 系统上,您也可以选择另一组容器工具,包括 podman、skopeo 和 buildah 等。您仍然可以使用 Docker Container Engine 来创建容器,这些容器将在 OpenShift Container Platform 和任何其他容器平台中运行。

使用 buildah、podman 和 skopeo 构建和管理容器会生成行业标准的容器镜像,其包含经过专门调优的功能,以便于这些容器最终部署到 OpenShift Container Platform 或其他 Kubernetes 环境中。这些工具不是作为守护进程运行的,可在没有 root 权限的情况下运行,因此运行它们的开销比较小。

最终在 OpenShift Container Platform 中运行容器时,您要使用 CRI-O 容器引擎。CRI-O 在 OpenShift Container Platform 集群中的每台 worker 机器和 master 机器上运行,但 CRI-O 尚不支持作为 OpenShift Container Platform 外的独立运行时。

4.2.2. 基础镜像选项

选择用来构建应用程序的基础镜像包含一组软件,这些软件为应用程序提供一个 Linux 系统。在您构建自己的镜像时,您的软件将放置到该文件系统中,可以像对待操作系统一样看待该文件系统。基础镜像的选择会对容器未来的安全性、效率和可升级性产生重大影响。

红帽提供了一组新的基础镜像,称为红帽通用基础镜像 (UBI)。这些镜像基于 Red Hat Enterprise Linux,与红帽过去提供的基础镜像相似,但有一个主要区别:无需红帽订阅就能自由重新分发。因此,您可以在 UBI 镜像上构建应用程序,不必担心如何共享它们或需要为不同的环境创建不同的镜像。

这些 UBI 镜像具有标准、初始和最低版本。您还可以将 Red Hat Software Collections 镜像用作依赖特定运行时环境(如 Node.js、Perl 或 Python)的应用程序的基础。其中一些运行时基础镜像的特殊版本称为 Source-to-Image (S2I) 镜像。使用 S2I 镜像时,您可以将代码插入到可随时运行该代码的基础镜像环境中。

您可以直接从 OpenShift Container Platform Web UI 中使用 S2I 镜像,只需选择 CatalogDeveloper Catalog 便可,如下图中所示:

图 4.2. 为需要特定运行时的应用选择 S2I 基础镜像

OpenShift Container Platform 开发者目录

4.2.3. Registry 选项

容器镜像仓库(registry)是存储容器镜像的位置,以便您可以与他人共享,并将它们提供给最终运行的平台。您可以选择提供免费帐户的大型公共容器 registry,也可选择提供更多存储和特殊功能的高级版本。您还可以安装自己的 registry,供您的组织专用或有选择地共享给他人。

要获取红帽和认证合作伙伴提供的镜像,您可以从 Red Hat Registry 中提取。Red Hat Registry 存在于两个位置:registry.access.redhat.com(无需身份验证,但已弃用)和 registry.redhat.io(需要身份验证)。您可从 Red Hat Container Catalog 了解 Red Hat Registry 中由红帽和合作伙伴提供的镜像。除了列出红帽容器镜像外,它还显示有关这些镜像的内容和质量的广泛信息,包括基于已应用安全更新的健康分数。

大型公共 registry 包括 Docker HubQuay.io。Quay.io registry由红帽所有和管理。OpenShift Container Platform 中使用的许多组件都存储在 Quay.io 中,包括用于部署 OpenShift Container Platform 本身的容器镜像和 Operator。Quay.io 还提供了存储其他类型内容的方法,包括 Helm Charts。

如果需要私有容器 registry,OpenShift Container Platform 本身包括一个私有容器 registry,随 OpenShift Container Platform 一起安装并在其集群上运行。红帽也提供 Quay.io registry 的私有版本,称为 Red Hat Quay。Red Hat Quay 包括跨地域复制、Git 构建触发器、Clair 镜像扫描和许多其他功能。

此处提到的所有 registry 都可能需要凭证才能从中下载镜像。这些凭证中有些是通过 OpenShift Container Platform 在整个集群范围内提供的,另一些凭证则可以分配给个人。