14.6. Podman을 사용하여 systemd 장치 파일 자동 생성

기본적으로 Podman은 기존 컨테이너 또는 포드에 대한 단위 파일을 생성합니다. podman generate systemd --new 를 사용하여 더 많은 이식 가능한 systemd 장치 파일을 생성할 수 있습니다. new 플래그는 컨테이너를 생성, 시작 및 제거하는 장치 파일을 생성, 시작 및 제거하도록 Podman에 지시합니다.

참고

Podman v4.6부터 일반 systemd 장치 파일과 유사한 형식으로 컨테이너를 실행하는 방법을 설명하고 systemd 에서 실행 중인 컨테이너의 복잡성을 숨길 수 있습니다.

사전 요구 사항

  • container-tools meta-package가 설치되어 있습니다.

절차

  1. 시스템에서 사용할 이미지를 가져옵니다. 예를 들어 httpd-24 이미지를 가져오려면 다음을 수행합니다.

    # podman pull registry.access.redhat.com/ubi9/httpd-24
  2. 선택 사항: 시스템에서 사용 가능한 모든 이미지를 나열합니다.

    # podman images
    REPOSITORY                                TAG                  IMAGE ID      CREATED        SIZE
    registry.access.redhat.com/ubi9/httpd-24  latest               8594be0a0b57  2 weeks ago    462 MB
  3. httpd 컨테이너를 생성합니다.

    # podman create --name httpd -p 8080:8080 registry.access.redhat.com/ubi9/httpd-24
    cdb9f981cf143021b1679599d860026b13a77187f75e46cc0eac85293710a4b1
  4. 선택 사항: 컨테이너가 생성되었는지 확인합니다.

    # podman ps -a
    CONTAINER ID  IMAGE                                            COMMAND               CREATED        STATUS      PORTS                   NAMES
    cdb9f981cf14  registry.access.redhat.com/ubi9/httpd-24:latest  /usr/bin/run-http...  5 minutes ago  Created     0.0.0.0:8080->8080/tcp  httpd
  5. httpd 컨테이너의 systemd 장치 파일을 생성합니다.

    # podman generate systemd --new --files --name httpd
    /root/container-httpd.service
  6. 생성된 container-httpd.service systemd 장치 파일의 내용을 표시합니다.

    # cat /root/container-httpd.service
    # container-httpd.service
    # autogenerated by Podman 3.3.1
    # Wed Sep  8 20:41:44 CEST 2021
    
    [Unit]
    Description=Podman container-httpd.service
    Documentation=man:podman-generate-systemd(1)
    Wants=network-online.target
    After=network-online.target
    RequiresMountsFor=%t/containers
    
    [Service]
    Environment=PODMAN_SYSTEMD_UNIT=%n
    Restart=on-failure
    TimeoutStopSec=70
    ExecStartPre=/bin/rm -f %t/%n.ctr-id
    ExecStart=/usr/bin/podman run --cidfile=%t/%n.ctr-id --sdnotify=conmon --cgroups=no-conmon --rm -d --replace --name httpd -p 8080:8080 registry.access.redhat.com/ubi9/httpd-24
    ExecStop=/usr/bin/podman stop --ignore --cidfile=%t/%n.ctr-id
    ExecStopPost=/usr/bin/podman rm -f --ignore --cidfile=%t/%n.ctr-id
    Type=notify
    NotifyAccess=all
    
    [Install]
    WantedBy=multi-user.target default.target
참고

--new 옵션을 사용하여 생성된 유닛 파일은 컨테이너와 Pod가 있을 것으로 예상하지 않습니다. 따라서 podman start 명령 대신 서비스를 시작할 때 podman run 명령을 수행합니다( ExecStart 행 참조). 예를 들어 Podman을 사용하여 systemd 장치 파일 생성 섹션을 참조하십시오.

  • podman run 명령에서는 다음 명령줄 옵션을 사용합니다.

    • -- conmon -pidfile 옵션은 호스트에서 실행되는 공통 프로세스의 프로세스 ID를 저장할 경로를 가리킵니다. conmon 프로세스는 컨테이너와 동일한 종료 상태로 종료되므로 systemd 가 올바른 서비스 상태를 보고하고 필요한 경우 컨테이너를 다시 시작할 수 있습니다.
    • --cidfile 옵션은 컨테이너 ID를 저장하는 경로를 가리킵니다.
    • %t 는 런타임 디렉터리 루트의 경로입니다(예: /run/user/$UserID ).
    • %n 은 서비스의 전체 이름입니다.

      1. /etc/systemd/system 에 단위 파일을 복사하여 root 사용자로 설치합니다.

        # cp -Z container-httpd.service /etc/systemd/system
      2. container-httpd.service 를 활성화하고 시작합니다 :

        # systemctl daemon-reload
        # systemctl enable --now container-httpd.service
        Created symlink /etc/systemd/system/multi-user.target.wants/container-httpd.service → /etc/systemd/system/container-httpd.service.
        Created symlink /etc/systemd/system/default.target.wants/container-httpd.service → /etc/systemd/system/container-httpd.service.

검증 단계

  • container-httpd.service :의 상태를 확인합니다.

    # systemctl status container-httpd.service
        ● container-httpd.service - Podman container-httpd.service
           Loaded: loaded (/etc/systemd/system/container-httpd.service; enabled; vendor preset: disabled)
           Active: active (running) since Tue 2021-08-24 09:53:40 EDT; 1min 5s ago
             Docs: man:podman-generate-systemd(1)
          Process: 493317 ExecStart=/usr/bin/podman run --conmon-pidfile /run/container-httpd.pid --cidfile /run/container-httpd.ctr-id --cgroups=no-conmon -d --repla>
          Process: 493315 ExecStartPre=/bin/rm -f /run/container-httpd.pid /run/container-httpd.ctr-id (code=exited, status=0/SUCCESS)
         Main PID: 493435 (conmon)
        ...