Red Hat Training

A Red Hat training course is available for RHEL 8

第14章 Podman を使用した systemd へのコンテナーの移植

Podman (Pod Manager) は、シンプルなデーモンレスツールである、フル機能のコンテナーエンジンです。Podman は、他のコンテナーエンジンからの移行を容易にし、Pod、コンテナー、およびイメージの管理を可能にする Docker-CLI と同等のコマンドラインを備えています。

もともと、Podman は、Linux システム全体を提供したり、起動順序、依存関係のチェック、失敗したサービスの回復などのサービスを管理したりするように設計されたものではありませんでした。完全なシステム初期化は、systemd が担当していました。Red Hat はコンテナーを systemd と統合しているため、Linux システムで他のサービスや機能が管理するのと同じ方法で、Podman によってビルドされた OCI および Docker 形式のコンテナーを管理できます。systemd 初期化サービスを使用して、Pod とコンテナーを操作できます。

systemd ユニットファイルを使用すると、次のことが可能になります。

  • systemd サービスとして開始するようにコンテナーまたは Pod をセットアップします。
  • コンテナー化されたサービスを実行して依存関係を確認する順序を定義します (たとえば、別のサービスが実行されていること、ファイルが利用可能であること、またはリソースがマウントされていることなど)。
  • systemctl コマンドを使用して、systemd システムの状態を制御します。

systemd ユニットファイルを使用して、コンテナーと Pod の移植可能な説明を生成できます。

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

Quadlet を使用する場合、通常の systemd ユニットファイルによく似た形式でコンテナーを実行する方法を記述します。コンテナーの記述は、関連するコンテナーの詳細を中心に行うため、systemd でのコンテナー実行に関する技術的詳細を意識せずに済みます。次のいずれかのディレクトリーに <CTRNAME>.container ユニットファイルを作成します。

  • root ユーザーの場合: /usr/share/containers/systemd/ または /etc/containers/systemd/
  • ルートレスユーザーの場合: $HOME/.config/containers/systemd/$XDG_CONFIG_HOME/containers/systemd/、 /etc/containers/systemd/users/$(UID)、または /etc/containers/systemd/users/
注記

Quadlet は、Podman v4.6 以降で利用可能です。

前提条件

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

手順

  1. mysleep.container ユニットファイルを作成します。

    $ cat $HOME/.config/containers/systemd/mysleep.container
    [Unit]
    Description=The sleep container
    After=local-fs.target
    
    [Container]
    Image=registry.access.redhat.com/ubi8-minimal:latest
    Exec=sleep 1000
    
    [Install]
    # Start by default on boot
    WantedBy=multi-user.target default.target

    [Container] セクションでは、以下を指定する必要があります。

    • Image - 実行するコンテナーイメージ
    • Exec - コンテナー内で実行するコマンド

      これにより、systemd ユニットファイルで指定する他のすべてのフィールドを使用できるようになります。

  2. mysleep.container ファイルに基づいて mysleep.service を作成します。

    $ systemctl --user daemon-reload
  3. オプション: mysleep.service のステータスを確認します。

    $ systemctl --user status mysleep.service
    ○ mysleep.service - The sleep container
    	 Loaded: loaded (/home/username/.config/containers/systemd/mysleep.container; generated)
    	 Active: inactive (dead)
  4. mysleep.service を起動します。

    $ systemctl --user start mysleep.service

検証

  1. mysleep.service のステータスを確認します。

    $ systemctl --user status mysleep.service
    ● mysleep.service - The sleep container
    	 Loaded: loaded (/home/username/.config/containers/systemd/mysleep.container; generated)
    	 Active: active (running) since Thu 2023-02-09 18:07:23 EST; 2s ago
       Main PID: 265651 (conmon)
          Tasks: 3 (limit: 76815)
    	 Memory: 1.6M
       	 CPU: 94ms
    	 CGroup: ...
  2. すべてのコンテナーをリスト表示します。

    $ podman ps -a
    CONTAINER ID  IMAGE                            COMMAND               CREATED            STATUS                          PORTS   NAMES
    421c8293fc1b  registry.access.redhat.com/ubi8-minimal:latest               sleep 1000  30 seconds ago   Up 10 seconds ago systemd-mysleep

    作成されたコンテナーの名前は次の要素で構成されています。

    • systemd- 接頭辞
    • systemd ユニットの名前、つまり systemd-mysleep

      この名前は、一般的なコンテナーと systemd ユニットで実行されているコンテナーを区別するのに役立ちます。また、コンテナーがどのユニットで実行されるかを判断するのにも役立ちます。コンテナーの名前を変更する場合は、[Container] セクションの ContainerName フィールドを使用します。