Red Hat Training

A Red Hat training course is available for RHEL 8

14.6. Podman を使用した systemd ユニットファイルの自動生成

デフォルトで、Podman は既存のコンテナーまたは Pod のユニットファイルを生成します。podman generate systemd --new を使用すると、より移植性の高い systemd ユニットファイルを生成できます。--new フラグでは、コンテナーの作成、起動、削除を行うユニットファイルを生成するように Podman に指示します。

注記

Podman v4.6 以降では、Quadlet を使用できるようになりました。Quadlet を使用すると、通常の systemd ユニットファイルと同様の形式でコンテナーを実行する方法を記述でき、systemd でコンテナーを実行する際の複雑さを意識せずに済みます。

前提条件

  • container-tools モジュールがインストールされている。

手順

  1. システムで使用するイメージをプルします。たとえば、httpd-24 イメージをプルするには、以下を実行します。

    # podman pull registry.access.redhat.com/ubi8/httpd-24
  2. オプション: システムで使用可能なすべてのイメージをリストします。

    # podman images
    REPOSITORY                                TAG                  IMAGE ID      CREATED        SIZE
    registry.access.redhat.com/ubi8/httpd-24  latest               8594be0a0b57  2 weeks ago    462 MB
  3. httpd コンテナーを作成します。

    # podman create --name httpd -p 8080:8080 registry.access.redhat.com/ubi8/httpd-24
    cdb9f981cf143021b1679599d860026b13a77187f75e46cc0eac85293710a4b1
  4. オプション: コンテナーが作成されたことを確認します。

    # podman ps -a
    CONTAINER ID  IMAGE                                            COMMAND               CREATED        STATUS      PORTS                   NAMES
    cdb9f981cf14  registry.access.redhat.com/ubi8/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/ubi8/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 の存在は想定されていません。したがって、サービスの起動時に (ExecStart の行を参照)、podman start コマンドではなく、podman run コマンドを実行します。たとえば、Generating a systemd unit file using Podmanのセクションを参照してください。

  • podman run コマンドは、以下のコマンドラインオプションを使用します。

    • --conmon-pidfile オプションは、ホストで実行している conmon プロセスのプロセス 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)
        ...