在 Oracle Linux 上使用 Podman 构建多平台容器映像
简介
此演示展示了如何使用 Podman 在 Oracle Linux 上创建多平台容器映像。
目标
在本教程中,您将学习如何:
- 配置 Podman 以实现远程连接
- 连接到远程 Podman 实例
- 从单个容器文件构建特定于平台的映像
- 将特定于平台的映像推送到 Oracle Cloud Infrastructure Registry (OCIR)
- 创建包含两个特定于平台的映像的清单列表
- 将清单列表推送到 OCIR
- 检查 OCIR 托管的清单列表以查看可用平台
- 拉取并运行映像
先决条件
- 访问 Oracle Cloud Infrastructure (OCI) 租户
- Oracle Linux x86_64 实例
- Oracle Cloud Developer aarch_64 实例
- 访问 Oracle Cloud Infrastructure Registry
部署 Podman 服务器
-
创建 Oracle Linux 计算实例。
如果配置使用 x86_64 体系结构,则可以使用默认映像和配置。选择或创建公共子网并分配 IPv4 地址。
此步骤支持使用“始终免费”层中提供的微型配置。
-
实例运行时,请登录到实例。
ssh -i <SSH_KEY> opc@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
其中:
<SSH_KEY>
是预配计算实例时使用的 SSH 密钥的专用部分。示例:~/.ssh/id_rsa
<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
是计算实例的公共 IP 地址。
安装和配置 Podman 以进行远程访问
您可以将这些命令作为计算实例上的默认 opc
用户帐户或具有 sudo
访问权限的任何用户运行。
-
使用最新的安全修复程序和勘误表更新系统。
sudo dnf -y update
-
安装 Podman 软件包或模块。
Oracle Linux 8:
sudo dnf module install -y container-tools:ol8
Oracle Linux 9 和 Oracle Linux 10:
sudo dnf install -y container-tools
container-tools 模块或软件包安装 podman 和其他容器工具,包括 skopeo 和 buildah。一个基本软件包是 container-selinux ,它允许以非 root 用户身份在启用了 SELinux 的系统上运行
podman
,默认情况下 Oracle Linux 启用该系统。 -
启用 Podman 套接字。
systemd 将侦听套接字并在远程客户机激活 Podman 实例时触发该实例。当连接关闭时,systemd 将关闭 Podman 实例。
注:可以在无根模式下配置远程 Podman 访问,但这超出了本教程的范围。
sudo systemctl enable --now podman.socket
-
检验套接字的路径。
sudo systemctl status podman.socket
输出显示套接字正在监听,其位置位于
/run/podman/podman.sock
。就是这样,但请继续登录 Podman 服务器实例,以便在本教程后面执行 SSH 无密码配置。
部署 Oracle Cloud Developer 实例
Oracle Ampere A1 Compute 是一个结合了 Oracle Cloud Infrastructure (OCI) 和 Ampere Altra Arm 处理器的高性能平台。它提供了确定性的性能、经过验证的安全性以及广泛的开发人员生态系统,其中包括常用的工具和环境(OS、Kubernetes - OKE、SDK 和 CLI)。
OCI 将 Oracle Cloud Developer Image 列为平台映像,并安装了所有常用的开发人员工具,包括 Git、Node.js、Java 和 GraalVM。
-
创建 Oracle Cloud Developer 计算实例。
选择 Oracle Cloud Developer 映像和 Ampere 配置。选择与 Podman 服务器实例相同的公共子网并分配 IPv4 地址。
-
决定使用 Ingress Rules 或 SSH 端口转发。
您可以通过两种方式访问我们将创建的演示 Web 应用程序。虽然您可以同时启用两者,但您只需挑选一个或另一个。
(可选)创建入站规则
使用入站规则是一个两步过程。此选项用于打开从 Internet 访问子网的权限,并且即使在重新引导后仍会继续授予对指定端口上实例的访问权限。您必须先在 OCI 中创建规则,然后在 Oracle Linux 实例上的 firewalld 中打开端口。
-
将入站规则添加到公共子网。
该规则应允许来自
0.0.0.0/0
的端口5808/tcp
上的入站流量。该规则在创建后立即生效。 -
打开新终端并通过 SSH 连接到 Oracle Cloud Developer 实例。
ssh -i <SSH_KEY> opc@<IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>
-
添加对演示 Web 应用程序的访问权限。
sudo firewall-cmd --permanent --add-port=5808/tcp sudo firewall-cmd --reload
-
确认对防火墙所做的更改。
sudo firewall-cmd --list-all
输出显示
ports: 5808/tcp
可用。
使用 SSH 端口转发
-
打开终端并通过 SSH 连接到 Oracle Cloud Developer 实例。
-L
选项启用本地转发,这将打开本地端口,以通过 SSH 隧道连接到远程演示 Web 应用程序。ssh -L 5808:localhost:5808 -i <SSH_KEY> opc@<IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>
为 Web 应用程序创建容器映像并本地运行
-
克隆演示应用程序的 Git 资料档案库。
在本教程中,您将部署基于 Node.js 的服务器监视 Web 应用程序 RasDash 。
git clone https://github.com/sykeben/RasDash.git
-
转到源代码目录。
cd ~/RasDash
-
创建 Containerfile 以构建和服务 Web 应用程序。
cat << EOF > Containerfile FROM ghcr.io/oracle/oraclelinux8-nodejs:14 COPY . /app WORKDIR /app RUN npm install && \ npm test CMD ["/usr/bin/node", "app.js", "service"] EOF
-
在本地实例上构建和运行映像。
使用
podman
在本地构建容器映像,并使用应用版本和平台的体系结构标记映像。以后,将每个平台映像推送到 Oracle Cloud Infrastructure Registry (OCIR) 以及创建两个平台映像的清单时,此信息将很有帮助。sudo podman build --format docker --tag rasdash:0.3.4-arm64 .
最后一行对于您的应用程序构建是唯一的。
-
使用映像运行容器。
sudo podman run --rm --init -detach --name rasdash --publish 5808:5808 localhost/rasdash:0.3.4-arm64
Podman 返回的摘要对于每个容器实例都是唯一的。
-
查看正在运行的容器。
sudo podman ps
输出将容器显示为
Up
并正在运行。 -
查看容器日志。
sudo podman logs rasdash
输出显示
[STATE] Server started
。 -
查看 Web 应用程序。
在本地计算机上打开浏览器并导航到
http://localhost:5808
。如果您创建了入站和防火墙规则,则可以使用 Oracle Cloud Developer 实例的公共 IP 地址,而不是localhost
。注: CPU 温度度量将显示
-1
,因为 OCI 中的虚拟实例无法访问物理硬件数据。 -
停止正在运行的容器。
sudo podman stop rasdash
在实例之间配置无密码 SSH
Podman 使用 SSH 在实例之间进行通信以实现安全目的。要获得更无缝的体验,请在云开发人员实例上创建公钥/私钥对,并将其复制到 Podman 远程服务器,以便您可以从开发人员实例通过 SSH,而不会收到密码提示。
-
在 Oracle Cloud Developer 实例上生成公钥/私钥对。
ssh-keygen -b 4096 -f ~/.ssh/id_rsa -q -N ""
-
复制公钥文件的内容。
cat ~/.ssh/id_rsa.pub
从
cat
命令中选择输出并将其复制。 -
切换到 Podman 服务器实例。
-
在 vi 中打开文件。
vi ~/.ssh/authorized_keys
将公钥内容粘贴到授权密钥文件中。
保存并关闭该文件。
-
确保对 SSH 目录和文件应用正确的文件系统权限。
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
-
切换到云开发人员实例。
-
测试是否可以以
opc
用户身份通过 SSH 访问 Podman 服务器,而无需口令。注意:如果您有任何问题,请参阅以下文档:
ssh opc@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
验证是否可以连接而无需密码后,请确保
exit
Oracle Cloud Developer 实例与 Podman 服务器之间的 SSH 会话。 -
切换到 Podman 服务器实例。
-
替换 root 用户的授权密钥文件。
cat /home/opc/.ssh/authorized_keys | sudo tee /root/.ssh/authorized_keys
-
切换到云开发人员实例。
-
测试是否可以将云开发人员实例上的
opc
用户通过 SSH 连接到 Podman 服务器上的root
用户。ssh root@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
以 root 用户身份成功测试到 Podman 服务器的 SSH 连接后,可以
exit
会话。
创建与 Podman 服务器的系统连接
-
在 Oracle Cloud Developer 实例与 Podman 服务器上运行的 Podman 服务之间创建 Podman 系统连接。
sudo podman system connection add --identity ~/.ssh/id_rsa amd64 ssh://root@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>/run/podman/podman.sock
在上面的命令中,确保将
<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
替换为 Podman 服务器的 IP 地址或主机名。 -
验证您是否已成功添加连接。
sudo podman system connection list
输出显示
amd64
连接,并将Default
值设置为true
。如果系统配置了多个连接,Podman 将使用此连接。
在远程 Podman 服务器上构建映像
现在,您应该能够使用 podman --remote
将命令从 Oracle Cloud Developer 实例发送到远程 Podman 服务器实例。
-
通过获取 Podman 服务器的详细信息进行测试。
sudo podman --remote info
体系结构应报告为
arm64
。 -
构建远程映像。
Podman 会自动将整个上下文复制到远程实例。
cd ~/RasDash sudo podman --remote build --format docker --tag rasdash:0.3.4-amd64 .
-
验证远程 Podman 服务器上是否存在该映像。
注意: Podman 不会将其创建的图像复制回客户端计算机,因此,如果运行
sudo podman images
,则不会列出该图像。但是,它可以在远程计算机上使用。sudo podman --remote images
输出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE localhost/rasdash 0.3.4-amd64 3a1b9755ebdd 8 seconds ago 439 MB ...
-
验证本地映像体系结构。
验证为特定平台和体系结构构建的每个映像的最终方法使用
jq
提取每个映像清单中Architecture
字段的值。sudo podman inspect rasdash:0.3.4-arm64 | jq -r '.[] | .Architecture'
本地映像将其体系结构报告为
arm64
。 -
检查远程映像。
sudo podman --remote inspect rasdash:0.3.4-amd64 | jq -r '.[] | .Architecture'
远程映像报告为
amd64
。
创建容器注册表资料档案库
在 Oracle Cloud Infrastructure 控制台中,导航到 Container Registry 部分并创建一个存储库来存储多平台应用程序。
有关更多详细信息,请参阅 Oracle Cloud Infrastructure 文档中的创建资料档案库。
-
创建专用
demo/rasdash
系统信息库。 -
查看新系统信息库的详细信息。
收集容器注册表资料档案库身份证明
下表提供了本教程后续步骤中使用的示例值。iad
示例是美国东部(阿什本)区域的区域关键字。如果您的地区是德国中部(法兰克福),则区域关键字为 fra
。有关列出可用区域密钥的完整表,请参阅 Regions and Availability Domains(区域和可用性域)文档。
注册表数据 | 教程占位符 | 说明 |
---|---|---|
REGISTRY_NAMESPACE | gse00015915 |
在系统信息库信息面板中显示为“名称空间” |
REPOSITORY_NAME | demo/rasdash |
显示在区间名称下 |
OCIR_INSTANCE | iad.ocir.io |
使用 <region>.ocir.io |
如果需要,请参见 Pushing Images Using the Docker CLI 。此过程介绍了使用 CLI 将映像推送到容器注册表所需的登录过程。
-
获取您的用户名。
您需要用户名和验证令牌才能登录到容器注册表。要获取用户名,请在 Oracle Cloud Infrastructure 控制台的右上角,打开概要信息菜单(用户菜单图标),然后单击我的概要信息以查看详细信息。
复制并保存用户名,包括控制台中显示的
tenancy-namespace
。 -
生成验证令牌。
在控制台中向下滚动 My profile(我的配置文件)页,然后选择 Resources(资源)下的 Auth Tokens(授权令牌)。
选择生成令牌按钮,并为新令牌提供
demo
的说明。生成令牌后,务必复制并保存令牌。
登录到容器注册表资料档案库
下表提供了本教程后续步骤中使用的示例值。
用户名 | 教程占位符 |
---|---|
REGISTRY_NAMESPACE | gse00015915 |
USERNAME | luna.user@e1ab5742-7e30-463a-9017-0b48fa54197e |
令牌 | ]y#W_iS9GKC}4l1Gq9Fn |
OCIR_INSTANCE | iad.ocir.io |
-
创建要在
podman login
命令中使用的环境变量。使用您的用户名和令牌创建
USER
和TOKEN
环境变量。确保将<REGISTRY_NAMESPACE>
作为用户名的一部分。export OCIR_INSTANCE="iad.ocir.io" export OCIR_NAMESPACE="gse00015915" export OCI_USERNAME="luna.user@e1ab5742-7e30-463a-9017-0b48fa54197e" export OCIR_USERNAME="$OCIR_NAMESPACE/$OCI_USERNAME" export OCI_USER_TOKEN="]y#W_iS9GKC}4l1Gq9Fn"
-
登录到容器注册表。
sudo -E podman login -u $OCIR_USERNAME -p $OCIR_USER_TOKEN $OCIR_INSTANCE
远程实例将自动从客户端实例继承验证身份证明。
推送平台映像
在此示例中,具有特定于平台的标记的最终系统信息库 URI 为:
docker://iad.ocir.io/gse00015915/demo/rasdash:0.3.4-arm64
docker://iad.ocir.io/gse00015915/demo/rasdash:0.3.4-amd64
Podman 可以将本地映像推送到远程注册表,而无需事先标记映像。
-
推送本地
rasdash/0.3.4-arm64
映像。sudo -E podman push rasdash:0.3.4-arm64 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4-arm64
-
推送远程
rasdash:0.3.4-amd64
映像。sudo -E podman --remote push rasdash:0.3.4-amd64 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4-amd64
-
检查容器注册表控制台。
注:推送远程映像不会生成本地输出。查看
rasdash:0.3.4-amd64
标记的容器注册表控制台,以检查是否已成功推送映像。您应该在容器注册表控制台中看到两个映像。
0.3.4-amd64
映像:0.3.4-arm64
映像:
创建清单列表并将其推送到容器注册表
现在,您有两个平台映像,是时候创建一个清单列表,使容器运行时能够为其平台选择合适的映像,该映像是操作系统和体系结构的组合。
由于大多数容器映像都是基于 Linux 的,因此用户通常将多平台映像称为多归档映像。但是,也可以将可以在 Windows、macOS 和 Linux 上运行的映像组合到单个清单中。
-
创建并填充清单。
在 Cloud Developer 实例上仅使用标记中的应用程序版本创建本地清单列表。
sudo podman manifest create rasdash:0.3.4
与以前一样,校验和输出对于您创建的清单是唯一的,并且与上面的清单不匹配。
-
检查清单列表以显示正在使用的
mediaType
及其成员映像。sudo podman manifest inspect rasdash:0.3.4
-
将两个特定于平台的映像添加到列表中。
sudo -E podman manifest add rasdash:0.3.4 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4-arm64
sudo -E podman manifest add rasdash:0.3.4 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4-amd64
-
检查清单列表。
sudo podman manifest inspect rasdash:0.3.4
添加图像后,输出更有趣。
为了实现最大兼容性,您向每个构建命令添加了
--format docker
参数,该参数指示 Podman 使用 Docker Image Manifest V2,Schema 2 (v2s2
) specification (而非 Open Container Initiative Image Manifest Specification (Podman 默认情况下将使用该规范)来创建映像。由于清单使用的是
v2s2
规范,因此 Podman 使用关联的v2s2
Manifest List 规范,而不是 Open Container Initiative Image Index Specification 。基于云的托管 Kubernetes 服务(包括 Oracle Engine for Kubernetes (OKE) 和内部部署自托管 Kubernetes 分发)使用的默认容器运行时与这两种规范都兼容。
-
将清单列表推送到容器注册表。
现在,您已创建清单列表,可以将其推送到存储特定于平台的映像的容器注册表系统信息库。
sudo -E podman manifest push --all rasdash:0.3.4 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4
此操作是一项快速操作,因为您提前推送了特定于平台的映像。容器注册表仅将清单列表链接到现有映像。
-
在本地创建和运行映像。
现在,您可以使用清单列表标记(而不是特定于平台的标记)在本地和远程运行映像实例。
sudo -E podman run --rm --detach --init --publish 5808:5808 $OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4
-
远程创建和运行映像。
sudo -E podman --remote run --rm --detach --init --publish 5808:5808 $OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4
使用浏览器测试图像
假设您已为实例创建了必要的入站规则和防火墙规则。在这种情况下,您应该能够打开浏览器并导航到 http://<PUBLIC_IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>:5808
和 http://<PUBLIC_IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>:5808
以打开在每个实例上运行的 RasDash Web 应用程序。
否则,您可以像以前一样通过从本地计算机创建两个隧道来使用 SSH 端口转发。
-
打开到 Oracle Cloud Developer 实例的 SSH 隧道。
ssh -L 5808:localhost:5808 -i <SSH_KEY> opc@<IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>
在本地计算机上打开浏览器并导航到
http://localhost:5808
以在云开发实例上查看基于 arm64 的 Web 应用程序。 -
退出 SSH 隧道会话。
-
打开 Podman 服务器实例的 SSH 隧道。
ssh -L 5808:localhost:5808 -i <SSH_KEY> opc@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
刷新本地计算机中指向
http://localhost:5808
的浏览器,以查看 Podman 服务器实例上基于 amd64 的 Web 应用程序。
后续步骤
完成本教程后,您现在应了解如何创建可从专用和公共 OCIR 存储库部署的映像。您可以在多个位置使用这些映像,例如 Oracle Engine for Kubernetes (OKE) 或 Oracle Cloud Native Environment。将映像部署到 Oracle Cloud Infrastructure 外部的主机(包括适用于 Mac 的 Podman Desktop 或 Windows)时,应确保资料档案库是公共的。
相关链接
更多学习资源
通过 docs.oracle.com/learn 浏览其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Build Multi-Platform Container Images Using Podman on Oracle Linux
F50001-04