주:

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. lab 환경을 배치합니다.

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

    무료 실습 환경에서는 Python용 Oracle Cloud Infrastructure SDK에 대한 RPM 패키지를 설치하므로 localhost에 대한 추가 변수 ansible_python_interpreter가 필요합니다. 이 패키지 설치 위치는 사용 중인 Oracle Linux 버전을 기반으로 하는 시스템의 기본 Python 모듈 아래에 있습니다. 인벤토리 변수를 사용하면 localhost 이외의 호스트에서 실행되는 재생에 영향을 주지 않습니다.

    기본 배치 구성은 AMD CPU를 사용합니다. 명령행에서 새 쉐이프 변수 정의를 전달하여 인스턴스의 쉐이프를 변경할 수 있습니다.

    예: -e instance_shape="VM.Standard3.Flex"

    마찬가지로 Oracle Linux 이미지의 기본 버전은 `default_vars.yml 파일에 정의된 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
    

    출력은 갤럭시 사이트에서 압축 아카이브 파일을 검색 한 다음 .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 플레이북은 특정 호스트에 매핑된 작업으로 구성된 재생으로 구성됩니다. 이러한 작업은 주로 멱등 모듈을 실행합니다. Idempotency는 플레이북이 한 번 또는 여러 번 실행되는지에 관계없이 동일한 결과를 얻을 수 있도록 합니다. 이 자습서에서는 단계별로 플레이북을 구축하고 각 변경 사이에 실행함으로써 멱등성을 보여줍니다.

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. Playbook 실행하기

    로컬 호스트에 대해 이 플레이북을 실행하므로 인벤토리 파일을 명시적으로 만들거나 참조할 이유가 없습니다. 그러나 원격 호스트에 대해 이 작업을 실행하려면 hosts: 항목을 업데이트하고 플레이북에서 connection: 행을 제거한 다음 인벤토리 파일을 만들고 참조해야 합니다. 이 프로세스에 익숙하지 않은 경우 이 자습서 끝에 있는 Oracle Linux Training Station에 링크된 다른 자습서를 참조할 수 있습니다.

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

    명령의 출력에는 localhost에 대해 성공적으로 실행되어 Install podman 작업의 변경 사항을 보고하는 것으로 표시되어야 합니다. 이 상태는 container-tools 모듈의 설치를 적절히 완료했음을 나타냅니다.

  3. 버전을 표시하여 설치된 Podman 패키지를 확인합니다.

    podman --version
    

이미지 풀링

Podman을 설치하면 선택한 레지스트리에서 이미지를 가져와 로컬로 스테이지할 수 있습니다. 이 단계에서는 GitHub Container Registry에서 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. Playbook 실행하기

    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. Playbook 실행하기

    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. Playbook 실행하기

    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 Help Center를 참조하십시오.