注意:

使用 Oracle Linux Automation Engine 配置 Podman 容器

简介

借助 Oracle Linux Automation Engine,用户可以创建用于安装 Podman 的手册,然后使用 containers.podman 集合运行和管理容器。

运行手册时,Oracle Linux Automation Engine 在与手册中的 hosts: 指令匹配的计算机上运行任务。这些主机通常在清单文件中定义,可以是远程主机或本地主机。在本教程中,我们将演示如何在本地运行手册。

目标

在本教程中,您将学习:

先决条件

部署 Oracle Linux Automation Engine

注:如果在您自己的租户中运行,请在部署实验环境之前阅读 linux-virt-labs GitHub 项目 README.md 并完成先决条件。

  1. 在 Luna Desktop 上打开一个终端。

  2. 克隆 linux-virt-labs GitHub 项目。

    git clone https://github.com/oracle-devrel/linux-virt-labs.git
    
  3. 转到工作目录。

    cd linux-virt-labs/olam
    
  4. 安装所需集合。

    ansible-galaxy collection install -r requirements.yml
    
  5. 更新 Oracle Linux 实例配置。

    cat << EOF | tee instances.yml > /dev/null
    compute_instances:
      1:
        instance_name: "ol-control-node"
        type: "control"
    olam_type: olae
    EOF
    
  6. 创建清单文件。

    cat << EOF | tee hosts > /dev/null
    localhost ansible_connection=local ansible_connection=local ansible_python_interpreter=/usr/bin/python3.6
    EOF
    
  7. 部署实验室环境。

    ansible-playbook create_instance.yml -i hosts -e "@instances.yml"
    

    对于 localhost,免费实验室环境需要额外的变量 ansible_python_interpreter,因为它为 Oracle Cloud Infrastructure SDK for Python 安装 RPM 软件包。根据您的 Oracle Linux 版本,此软件包的安装位置位于系统的默认 Python 模块下面。使用清单变量可避免影响在本地主机以外的主机上运行的播放。

    默认部署配置使用 AMD CPU。您可以通过在命令行上传递新的配置变量定义来更改实例的配置。

    例如:-e instance_shape="VM.Standard3.Flex"

    同样,Oracle Linux 映像的缺省版本使用在 `default_vars.yml file' 中定义的变量 os_version。可以通过在命令行上传递 Oracle Linux 主版本来修改此值。

    例如:-e os_version="9"

    重要提示:等待手册成功运行并到达暂停任务。在手册的这一阶段,Oracle Linux 安装已完成,实例已准备就绪。请注意上一个播放,其中输出其部署的节点的公共和专用 IP 地址。

集合

集合是 Oracle Linux Automation Engine 内容的分发格式,可以包括手册、角色、模块和插件。本教程将使用 requirements.yml 文件安装 containers.podman 集合。通过 requirements.yml 文件,可以根据文件中定义的键安装集合、角色或两者。

创建需求文件

  1. 打开新终端,并通过 SSH 连接到 ol-control-node 系统。

    ssh oracle@<ip_address_of_instance>
    
  2. 创建工作目录。

    mkdir -p ~/podman-project
    
  3. 创建需求文件。

    cat << 'EOF' | tee ~/podman-project/requirements.yml > /dev/null
    ---
    collections:
      - name: containers.podman
    EOF
    
  4. 安装集合。

    ansible-galaxy collection install -r ~/podman-project/requirements.yml
    

    输出显示从 Galaxy 站点检索压缩归档文件的过程,然后将其安装到 .ansible/collections. 下的起始目录中

    注:如果输出显示 ERROR: Ansible requires the locale encoding to be UTF-8; Detected None.,则表示 ansible 的区域设置不正确。通过设置以下两个环境变量修复问题:

    export LC_ALL="en_US.UTF-8"
    export LC_CTYPE="en_US.UTF-8"
    

安装 Podman

Oracle Linux Automation Engine 剧本由映射到特定主机的任务组成。这些任务主要运行幂等模块。幂等性可确保无论手册运行一次还是多次,您都能获得相同的结果。本教程将通过分阶段构建手册并在每次更改之间运行手册来演示幂等性。

在运行 Podman 容器之前,我们需要从 Oracle Linux AppStream 系统信息库安装 Podman 软件包。

  1. 创建剧本文件。

    cat << 'EOF' | tee ~/podman-project/podman-playbook.yml > /dev/null
    ---
    - hosts: localhost
      connection: local
    
      tasks:
    
      - name: Install podman
        ansible.builtin.dnf:
          name: '@container-tools:ol8'
          state: present
        become: yes
        when:
          - ansible_distribution == 'OracleLinux'
          - ansible_facts['distribution_major_version'] == '8'
    
      - name: Install podman
        ansible.builtin.dnf:
          name: 'container-tools'
          state: present
        become: yes
        when:
          - ansible_distribution == 'OracleLinux'
          - ansible_facts['distribution_major_version'] == '9'
    EOF
    

    剧本和任务的名称旨在使剧本具有自我记录功能。下面的信息提供了一些关键项目的进一步说明。

    • hosts: localhost:指示要针对 localhost 运行的任务。
    • connection: local:确保链路保持本地状态,并且不通过 SSH 运行。
    • become: yes:默认情况下,提升此手册部分中的任务以使用 sudo 权限运行。
  2. 运行剧本。

    由于我们针对本地主机运行此手册,因此没有理由显式创建或引用清单文件。但是,如果要对远程主机运行此命令,则需要更新 hosts: 条目,删除手册中的 connection: 行,然后创建并引用清单文件。如果您不熟悉此过程,请参阅本教程末尾的 Oracle Linux 培训站中链接的一些其他教程。

    ansible-playbook ~/podman-project/podman-playbook.yml
    

    该命令的输出应显示它针对 localhost 成功运行,并报告 Install podman 任务中的更改。此状态表明我们已正确完成了 container-tools 模块的安装。

  3. 通过显示 Podman 软件包的版本来验证已安装的 Podman 软件包。

    podman --version
    

拉取图像

一旦我们安装了 Podman,我们可以从所选的注册表中提取图像,并在本地放置它们。在此步骤中,我们将从 GitHub 容器注册表提取 Oracle Linux 映像。

有关 Oracle Linux Developer 映像的其他信息,请访问此处

  1. 添加任务以将容器图像提取到手册中。

    cat << EOF | tee -a ~/podman-project/podman-playbook.yml > /dev/null
    
      - name: Pull oraclelinux:9 from GitHub
        containers.podman.podman_image:
          name: ghcr.io/oracle/oraclelinux:9
    EOF
    
  2. 运行剧本。

    ansible-playbook ~/podman-project/podman-playbook.yml
    
  3. 验证 Podman 是否拉动了图像。

    podman images
    

    输出示例:

    REPOSITORY                  TAG         IMAGE ID      CREATED       SIZE
    ghcr.io/oracle/oraclelinux  9           97e22ab49eea  20 hours ago  254 MB
    

运行容器映像

我们不仅可以拉取映像,还可以单步拉取和运行基于映像的容器。让我们提取并运行 Oracle Linux NGINX 开发人员映像。

  1. 更新手册文件。

    cat << EOF | tee -a ~/podman-project/podman-playbook.yml > /dev/null
    
      - name: Run image
        containers.podman.podman_container:
          name: nginx
          image: ghcr.io/oracle/oraclelinux9-nginx:1.20
          state: started
          detach: yes
          expose:
            - '80'
            - '443'
          publish:
            - '8080:80'
    EOF
    

    其中:

    • name:容器的名称。
    • image:用于创建容器的资料档案库路径(或映像名称)和标记。
    • state:检查是否存在与名称和配置匹配的正在运行的容器。Podman 在找不到匹配项时创建并启动新容器。
    • detach:在分离模式下运行容器。
    • expose:公开端口或端口范围。
    • publish:将容器的端口或端口范围发布到主机。
  2. 运行剧本。

    ansible-playbook ~/podman-project/podman-playbook.yml
    
  3. 验证容器是否正在运行。

    podman ps
    

    输出示例:

    [oracle@ol-server podman-project]$ podman ps
    CONTAINER ID  IMAGE                                   COMMAND               CREATED         STATUS             PORTS                 NAMES
    5f7a28cc4c6b  ghcr.io/oracle/oraclelinux9-nginx:1.20  nginx -g daemon o...  2 minutes ago   Up 2 minutes ago   0.0.0.0:8080->80/tcp  nginx
    

    输出显示容器已启动并运行了 2 分钟。

  4. 停止容器。

    使用上面输出的 CONTAINER ID ,运行:

    podman stop $(podman ps -q -f name=nginx)
    

    此命令使用 CONTAINER ID 作为停止 nginx 容器的引用。

使用卷运行容器映像

Podman 通过添加绑定挂载来创建卷,绑定挂载将本地目录映射到容器内的目录。我们将通过运行相同的 NGINX 容器并将默认的 index.html 页面替换为自定义页面来演示此功能。

  1. 更新手册文件。

    创建本地目录。虽然我们可以在命令行中一次有效地手动执行此步骤,但让我们将其自动化。自动执行此步骤可确保该目录在播放手册运行时存在。在运行映像之前,请添加这些任务,以创建目录和 index.html 文件。

    确保在任务之间留空以提高可读性,并遵循 YAML 语法规则和对齐准则。我们将使用 sed 完成此任务,因为它允许在特定行中轻松地将文本块插入文件。

    sed -i -e '24 r '<(cat -<< EOF
      - name: Ensure the destination directory exists
        ansible.builtin.file:
          path: "/home/oracle/nginx/"
          state: directory
    
      - name: Create an empty file
        ansible.builtin.file:
          path: "/home/oracle/nginx/index.html"
          state: touch
          mode: '0755'
    
      - name: Create index.html
        ansible.builtin.copy:
          dest: "/home/oracle/nginx/index.html"
          content: |
            Hello! Welcome to Oracle Linux Containers.
    
    EOF
    ) ~/podman-project/podman-playbook.yml
    
  2. 然后在 Run image 任务的末尾添加以下选项。

    cat << EOF | tee -a ~/podman-project/podman-playbook.yml > /dev/null
          volume: "/home/oracle/nginx:/usr/share/nginx/html:Z"
    EOF
    

    volume 选项会在 source:destination 目录之间创建绑定挂载。:Z 选项可解决与绑定挂载相关的所有 SELinux 权限问题。Podman 通过重新标记卷的内容来匹配容器内的标签来实现这一点。

    此处是手册的完整版本,供参考。

  3. 运行剧本。

    ansible-playbook ~/podman-project/podman-playbook.yml
    
  4. 验证容器是否正在运行。

    podman ps
    

    输出示例:

    CONTAINER ID  IMAGE                                   COMMAND               CREATED         STATUS             PORTS                 NAMES
    f74aa726d470  ghcr.io/oracle/oraclelinux9-nginx:1.20  nginx -g daemon o...  10 minutes ago  Up 10 minutes ago  0.0.0.0:8080->80/tcp  nginx
    
  5. 验证 index.html 文件是否存在。

    ls -l /home/oracle/nginx
    

    输出示例:

    [oracle@ol-server podman-project]$ ls -l /home/oracle/nginx/
    total 4
    -rwxr-xr-x. 1 oracle oracle 41 Nov  5 16:46 index.html
    
  6. 验证绑定挂载。

    使用 cURL 可显示容器中的 index.html 页面和欢迎消息。

    curl localhost:8080
    

    其中 8080 是到容器中端口 80 的本地端口映射。

后续步骤

通过完成本教程,您应了解如何使用 Oracle Linux Automation Engine 自动完成 Podman 和容器的工作。浏览 containers.podman 集合中的其他模块,以创建可自动执行基础结构的其他手册。

更多学习资源

通过 docs.oracle.com/learn 浏览其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心