8.2. 构建一个简单容器
您对应用程序有了一个想法,想要对其进行容器化。
首先,您需要一个用于构建容器的工具,如 buildah 或 docker,还需要一个描述容器中内容的文件,通常是 Dockerfile。
接下来,您需要一个位置来推送生成的容器镜像,以便可以将它拉取到您想要它运行的位置。这个位置就是容器 registry。
大多数 Linux 操作系统上都会默认安装各个组件的一些示例,但 Dockerfile 除外,需要您自己提供。
下图显示了构建和推送镜像的流程:
图 8.1. 创建简单容器化应用程序并将其推送到 registry
如果您使用运行 Red Hat Enterprise Linux (RHEL) 作为操作系统的计算机,则容器化应用程序创建过程需要以下几个步骤:
- 安装容器构建工具:RHEL 包含一组工具,其中包括用于构建和管理容器的 podman、buildah 和 skopeo。
-
创建一个 Dockerfile 来组合基础镜像和软件:有关构建容器的信息存放在名为
Dockerfile
的文件中。在这个文件中,您要标识从中构建的基本镜像、要安装的软件包,以及要复制到容器中的软件。您还要标识参数值,如公开到容器外部的网络端口和挂载到容器内的卷。将您的 Dockerfile 和您要容器化的软件放到 RHEL 系统上的目录中。 -
运行 buildah 或 docker 构建:运行
buildah build-using-dockerfile
或docker build
命令,将您选择的基础镜像拉取到本地系统,再创建一个存储在本地的容器镜像。 您还可以使用 buildah,在不用 Dockerfile 的前提下构建容器镜像。 -
标记(tag)并推送到 registry:向新容器镜像添加标签 (tag),以标识要在其中存储和共享容器的 registry 位置。然后,通过运行
podman push
或docker push
命令将该镜像推送到 registry。 -
拉取并运行镜像:从具有 podman 或 docker 等容器客户端工具的任何系统,运行用于标识新镜像的命令。例如,运行
podman run <image_name>
或docker run <image_name>
命令。其中,<image_name>
是新容器镜像的名称,类似于quay.io/myrepo/myapp:latest
。registry 可能需要凭证才能推送和拉取镜像。
如需更多有关构建容器镜像、将其推送到 registry 并运行它们的过程的详细信息,请参阅使用 Buildah 自定义镜像构建。
8.2.1. 容器构建工具选项
使用 buildah、podman 和 skopeo 构建和管理容器会导致行业标准容器镜像中包含专门为在 OpenShift Container Platform 或其他 Kubernetes 环境中部署容器而调整的功能。这些工具是无守护进程的,可在没有 root 权限的情况下运行,运行它们所需的开销更少。
Kubernetes 1.20 中弃用了对 Docker Container Engine 作为容器运行时的支持,并将在以后的发行版本中删除。但是,Docker 生成的镜像将继续在集群中使用所有运行时,包括 CRI-O。如需更多信息,请参阅 Kubernetes 博客公告。
最终在 OpenShift Container Platform 中运行容器时,您要使用 CRI-O 容器引擎。CRI-O 在 OpenShift Container Platform 集群中的每一 worker 和 control plane 机器上运行,但 CRI-O 尚不支持作为 OpenShift Container Platform 外的独立运行时。
8.2.2. 基础镜像选项
选择用来构建应用程序的基础镜像包含一组软件,这些软件为应用程序提供一个 Linux 系统。在您构建自己的镜像时,您的软件将放置到该文件系统中,可以像对待操作系统一样看待该文件系统。基础镜像的选择会对容器未来的安全性、效率和可升级性产生重大影响。
红帽提供了一组新的基础镜像,称为红帽通用基础镜像 (UBI)。这些镜像基于 Red Hat Enterprise Linux,与红帽过去提供的基础镜像相似,但有一个主要区别:无需红帽订阅就能自由重新分发。因此,您可以在 UBI 镜像上构建应用程序,不必担心如何共享它们或需要为不同的环境创建不同的镜像。
这些 UBI 镜像具有标准、初始和最低版本。您还可以将 Red Hat Software Collections 镜像用作依赖特定运行时环境(如 Node.js、Perl 或 Python)的应用程序的基础。其中一些运行时基础镜像的特殊版本称为 Source-to-Image (S2I) 镜像。使用 S2I 镜像时,您可以将代码插入到可随时运行该代码的基础镜像环境中。
S2I 镜像可用于直接从 OpenShift Container Platform Web UI 中使用。在 Developer 视角中,进入到 +Add 视图,并在 Developer Catalog 标题中查看 Developer Catalog 中的所有可用服务。
图 8.2. 为需要特定运行时的应用选择 S2I 基础镜像
8.2.3. Registry 选项
容器镜像仓库(registry)是存储容器镜像的位置,以便您可以与他人共享,并将它们提供给最终运行的平台。您可以选择提供免费帐户的大型公共容器 registry,也可选择提供更多存储和特殊功能的高级版本。您还可以安装自己的 registry,供您的组织专用或有选择地共享给他人。
要获取红帽和认证合作伙伴提供的镜像,您可以从 Red Hat Registry 中提取。Red Hat Registry 存在于两个位置:registry.access.redhat.com
(无需身份验证,但已弃用)和 registry.redhat.io
(需要身份验证)。您可以在红帽生态系统目录的容器镜像部分了解 Red Hat Registry 中的红帽及合作伙伴的镜像。除了列出红帽容器镜像外,它还显示有关这些镜像的内容和质量的广泛信息,包括基于已应用安全更新的健康分数。
大型公共 registry 包括 Docker Hub 和 Quay.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 在整个集群范围内提供的,另一些凭证则可以分配给个人。