在 Oracle Linux 上使用 Podman 构建多平台容器映像

简介

此演示展示了如何使用 Podman 在 Oracle Linux 上创建多平台容器映像。

目标

在本教程中,您将学习如何:

先决条件

部署 Podman 服务器

  1. 创建 Oracle Linux 计算实例。

    如果配置使用 x86_64 体系结构,则可以使用默认映像和配置。选择或创建公共子网并分配 IPv4 地址。

    此步骤支持使用“始终免费”层中提供的微型配置。

  2. 实例运行时,请登录到实例。

    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 访问权限的任何用户运行。

  1. 使用最新的安全修复程序和勘误表更新系统。

    sudo dnf -y update
    
  2. 安装 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 启用该系统。

  3. 启用 Podman 套接字。

    systemd 将侦听套接字并在远程客户机激活 Podman 实例时触发该实例。当连接关闭时,systemd 将关闭 Podman 实例。

    注:可以在无根模式下配置远程 Podman 访问,但这超出了本教程的范围。

    sudo systemctl enable --now podman.socket
    
  4. 检验套接字的路径。

    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。

  1. 创建 Oracle Cloud Developer 计算实例。

    选择 Oracle Cloud Developer 映像和 Ampere 配置。选择与 Podman 服务器实例相同的公共子网并分配 IPv4 地址。

  2. 决定使用 Ingress Rules 或 SSH 端口转发。

    您可以通过两种方式访问我们将创建的演示 Web 应用程序。虽然您可以同时启用两者,但您只需挑选一个或另一个。

(可选)创建入站规则

使用入站规则是一个两步过程。此选项用于打开从 Internet 访问子网的权限,并且即使在重新引导后仍会继续授予对指定端口上实例的访问权限。您必须先在 OCI 中创建规则,然后在 Oracle Linux 实例上的 firewalld 中打开端口。

  1. 将入站规则添加到公共子网。

    该规则应允许来自 0.0.0.0/0 的端口 5808/tcp 上的入站流量。该规则在创建后立即生效。

  2. 打开新终端并通过 SSH 连接到 Oracle Cloud Developer 实例。

    ssh -i <SSH_KEY> opc@<IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>
    
  3. 添加对演示 Web 应用程序的访问权限。

    sudo firewall-cmd --permanent --add-port=5808/tcp
    sudo firewall-cmd --reload
    
  4. 确认对防火墙所做的更改。

    sudo firewall-cmd --list-all
    

    输出显示 ports: 5808/tcp 可用。

使用 SSH 端口转发

  1. 打开终端并通过 SSH 连接到 Oracle Cloud Developer 实例。

    -L 选项启用本地转发,这将打开本地端口,以通过 SSH 隧道连接到远程演示 Web 应用程序。

    ssh -L 5808:localhost:5808 -i <SSH_KEY> opc@<IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>
    

为 Web 应用程序创建容器映像并本地运行

  1. 克隆演示应用程序的 Git 资料档案库。

    在本教程中,您将部署基于 Node.js 的服务器监视 Web 应用程序 RasDash 。

    git clone https://github.com/sykeben/RasDash.git
    
  2. 转到源代码目录。

    cd  ~/RasDash
    
  3. 创建 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
    
  4. 在本地实例上构建和运行映像。

    使用 podman 在本地构建容器映像,并使用应用版本和平台的体系结构标记映像。以后,将每个平台映像推送到 Oracle Cloud Infrastructure Registry (OCIR) 以及创建两个平台映像的清单时,此信息将很有帮助。

    sudo podman build --format docker --tag rasdash:0.3.4-arm64 .
    

    最后一行对于您的应用程序构建是唯一的。

  5. 使用映像运行容器。

    sudo podman run --rm --init -detach --name rasdash --publish 5808:5808 localhost/rasdash:0.3.4-arm64
    

    Podman 返回的摘要对于每个容器实例都是唯一的。

  6. 查看正在运行的容器。

    sudo podman ps
    

    输出将容器显示为 Up 并正在运行。

  7. 查看容器日志。

    sudo podman logs rasdash
    

    输出显示 [STATE] Server started。

  8. 查看 Web 应用程序。

    在本地计算机上打开浏览器并导航到 http://localhost:5808。如果您创建了入站和防火墙规则,则可以使用 Oracle Cloud Developer 实例的公共 IP 地址,而不是 localhost。

    注: CPU 温度度量将显示 -1,因为 OCI 中的虚拟实例无法访问物理硬件数据。

  9. 停止正在运行的容器。

    sudo podman stop rasdash
    

在实例之间配置无密码 SSH

Podman 使用 SSH 在实例之间进行通信以实现安全目的。要获得更无缝的体验,请在云开发人员实例上创建公钥/私钥对,并将其复制到 Podman 远程服务器,以便您可以从开发人员实例通过 SSH,而不会收到密码提示。

  1. 在 Oracle Cloud Developer 实例上生成公钥/私钥对。

    ssh-keygen -b 4096 -f ~/.ssh/id_rsa -q -N ""
    
  2. 复制公钥文件的内容。

    cat ~/.ssh/id_rsa.pub
    

    从 cat 命令中选择输出并将其复制。

  3. 切换到 Podman 服务器实例。

  4. 在 vi 中打开文件。

    vi ~/.ssh/authorized_keys
    

    将公钥内容粘贴到授权密钥文件中。

    保存并关闭该文件。

  5. 确保对 SSH 目录和文件应用正确的文件系统权限。

    chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
    
  6. 切换到云开发人员实例。

  7. 测试是否可以以 opc 用户身份通过 SSH 访问 Podman 服务器,而无需口令。

    注意:如果您有任何问题,请参阅以下文档:

    ssh opc@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
    

    验证是否可以连接而无需密码后,请确保 exit Oracle Cloud Developer 实例与 Podman 服务器之间的 SSH 会话。

  8. 切换到 Podman 服务器实例。

  9. 替换 root 用户的授权密钥文件。

    cat /home/opc/.ssh/authorized_keys | sudo tee /root/.ssh/authorized_keys
    
  10. 切换到云开发人员实例。

  11. 测试是否可以将云开发人员实例上的 opc 用户通过 SSH 连接到 Podman 服务器上的 root 用户。

    ssh root@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
    

    以 root 用户身份成功测试到 Podman 服务器的 SSH 连接后,可以 exit 会话。

创建与 Podman 服务器的系统连接

  1. 在 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 地址或主机名。

  2. 验证您是否已成功添加连接。

    sudo podman system connection list
    

    输出显示 amd64 连接,并将 Default 值设置为 true。如果系统配置了多个连接,Podman 将使用此连接。

在远程 Podman 服务器上构建映像

现在,您应该能够使用 podman --remote 将命令从 Oracle Cloud Developer 实例发送到远程 Podman 服务器实例。

  1. 通过获取 Podman 服务器的详细信息进行测试。

    sudo podman --remote info
    

    体系结构应报告为 arm64。

  2. 构建远程映像。

    Podman 会自动将整个上下文复制到远程实例。

    cd ~/RasDash
    sudo podman --remote build --format docker --tag rasdash:0.3.4-amd64 .
    
  3. 验证远程 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
    ...
    
  4. 验证本地映像体系结构。

    验证为特定平台和体系结构构建的每个映像的最终方法使用 jq 提取每个映像清单中 Architecture 字段的值。

    sudo podman inspect rasdash:0.3.4-arm64 | jq -r '.[] | .Architecture'
    

    本地映像将其体系结构报告为 arm64。

  5. 检查远程映像。

    sudo podman --remote inspect rasdash:0.3.4-amd64 | jq -r '.[] | .Architecture'
    

    远程映像报告为 amd64。

创建容器注册表资料档案库

在 Oracle Cloud Infrastructure 控制台中,导航到 Container Registry 部分并创建一个存储库来存储多平台应用程序。

有关更多详细信息,请参阅 Oracle Cloud Infrastructure 文档中的创建资料档案库。

  1. 创建专用 demo/rasdash 系统信息库。

    创建存储库

  2. 查看新系统信息库的详细信息。

    资料档案库详细信息

收集容器注册表资料档案库身份证明

下表提供了本教程后续步骤中使用的示例值。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 将映像推送到容器注册表所需的登录过程。

  1. 获取您的用户名。

    您需要用户名和验证令牌才能登录到容器注册表。要获取用户名,请在 Oracle Cloud Infrastructure 控制台的右上角,打开概要信息菜单(用户菜单图标),然后单击我的概要信息以查看详细信息。

    复制并保存用户名,包括控制台中显示的 tenancy-namespace。

    用户

  2. 生成验证令牌。

    在控制台中向下滚动 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
  1. 创建要在 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"
    
  2. 登录到容器注册表。

    sudo -E podman login -u $OCIR_USERNAME -p $OCIR_USER_TOKEN $OCIR_INSTANCE
    

    远程实例将自动从客户端实例继承验证身份证明。

推送平台映像

在此示例中,具有特定于平台的标记的最终系统信息库 URI 为:

Podman 可以将本地映像推送到远程注册表,而无需事先标记映像。

  1. 推送本地 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
    
  2. 推送远程 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
    
  3. 检查容器注册表控制台。

    注:推送远程映像不会生成本地输出。查看 rasdash:0.3.4-amd64 标记的容器注册表控制台,以检查是否已成功推送映像。

    您应该在容器注册表控制台中看到两个映像。

    images - 图像

    0.3.4-amd64 映像:

    images - 图像

    0.3.4-arm64 映像:

    images - 图像

创建清单列表并将其推送到容器注册表

现在,您有两个平台映像,是时候创建一个清单列表,使容器运行时能够为其平台选择合适的映像,该映像是操作系统和体系结构的组合。

由于大多数容器映像都是基于 Linux 的,因此用户通常将多平台映像称为多归档映像。但是,也可以将可以在 Windows、macOS 和 Linux 上运行的映像组合到单个清单中。

  1. 创建并填充清单。

    在 Cloud Developer 实例上仅使用标记中的应用程序版本创建本地清单列表。

    sudo podman manifest create rasdash:0.3.4
    

    与以前一样,校验和输出对于您创建的清单是唯一的,并且与上面的清单不匹配。

  2. 检查清单列表以显示正在使用的 mediaType 及其成员映像。

    sudo podman manifest inspect rasdash:0.3.4
    
  3. 将两个特定于平台的映像添加到列表中。

    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
    
  4. 检查清单列表。

    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 分发)使用的默认容器运行时与这两种规范都兼容。

  5. 将清单列表推送到容器注册表。

    现在,您已创建清单列表,可以将其推送到存储特定于平台的映像的容器注册表系统信息库。

    sudo -E podman manifest push --all rasdash:0.3.4 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4
    

    此操作是一项快速操作,因为您提前推送了特定于平台的映像。容器注册表仅将清单列表链接到现有映像。

  6. 在本地创建和运行映像。

    现在,您可以使用清单列表标记(而不是特定于平台的标记)在本地和远程运行映像实例。

    sudo -E podman run --rm --detach --init --publish 5808:5808 $OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4
    
  7. 远程创建和运行映像。

    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 端口转发。

  1. 打开到 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 应用程序。

  2. 退出 SSH 隧道会话。

  3. 打开 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 帮助中心。