6 Podmanサービスの操作

Podmanは、Systemdサービスと統合して、ポッドやコンテナをシステム・サービスとして管理できます。Podmanサービス・ラッパーを使用すると、システム・ブート時にコンテナまたはポッドが開始されるように構成できるようになり、ホスト・システムで実行できるその他のサービスと同様に管理できるようになります。

Podmanには、コンテナまたはポッドにSystemdサービス・ラッパー構成ファイルを自動的に生成するツールが用意されているため、コンテナ・インフラストラクチャの管理にSystemdを使用できます。

標準ユーザーとしてコンテナを実行している場合は、Systemdユーザー・サービスを使用できます。また、rootユーザーとしてコンテナを実行している場合は、システム・レベルのサービスを構成できます。

コンテナとポッドのサービス・ラッパーに対するSELinux権限の設定

システムでSELinuxをenforcingモードに設定している場合は、コンテナの開始、停止および監視にSystemdを使用できるように、container_manage_cgroup権限を有効にする必要があります。

sudo setsebool -P container_manage_cgroup on

Quadletについて

podman generate systemdコマンドを使用してPodmanサービス・ラッパーを生成し、すべてのSystemdユニット・ファイルを個別に管理するかわりに、単一のQuadletを管理し、podman-systemdデーモンを使用して、必要なときにいつでもそれらのSystemdユニット・ファイルを再生成できます。

Quadletを使用するもう1つの実用的な利点は、新しいバージョンのPodmanがリリースされるたびに、影響を受けるサービスを再初期化することで、任意のテンプレート化Systemdユニット・ファイルに対する修正および拡張をロールアウトできることです。

ノート:

Oracle Linux 8ホストでは、Quadletはroot権限でのみ実行できます。詳細は、「非特権ユーザーに対してQuadletがOracle Linux 8で失敗する」を参照してください。

Quadletコンテナの作成

Quadletコンテナは、.containerファイル拡張子を持つユニット・ファイルを使用して管理されます。また、[Container]セクションも含める必要があります。次に例を示します:

[Unit]
Description=your-description
After=local-fs.target

[Container]
Image=container-registry.oracle.com/os/oraclelinux:8-slim
Exec=your-command-here

[Install]
# Start by default on boot
WantedBy=multi-user.target default.target

root権限で実行されるQuadletコンテナを作成するには、その.containerファイルを/usr/share/containers/systemd/ディレクトリまたは/etc/containers/systemd/ディレクトリに格納してから、Systemdサービスをリロードします:

sudo systemctl daemon-reload

標準のユーザー権限で実行されるQuadletコンテナを作成するには、管理者が個々のユーザーごとに/etc/containers/systemd/users/${USER_ID}ディレクトリにquadletファイルを作成するか、個々のユーザーが.containerファイルを自分の~/.config/containers/systemd/ディレクトリに格納してから、Systemdサービスを再ロードします:

systemctl --user daemon-reload

作成されたユニット・ファイルを調べるには、quadletコマンドで-dryrunオプションを使用できます:

/usr/libexec/podman/quadlet -dryrun

root権限なしで実行されるQuadletコンテナの-userオプションを追加します。

systemctlコマンドを使用して、他のSystemdサービスと同じ方法でQuadletを管理できるようになりました。たとえば、テスト実行中に確認されたmyoracleというquadletコンテナを開始するには、次のコマンドを実行します:

sudo systemctl start myoracle

詳細は、podman-systemd.unit(5)マニュアル・ページを参照してください。

Podmanログイン・シェルの使用

Oracle Linux 9では、Podmanログイン・シェルを使用して、コンテナでシェル・コマンドを実行できます。この機能により、コンテナ内での作業時に、確立された境界内にユーザーが保持されるようにする利点が得られます。ユーザーは、/bin/bashなどの通常のシェルのかわりに、/usr/bin/podmanshシェル・コマンドを使用するように構成されます。このコマンドは、podmanshというルートレス・コンテナでユーザーのセッションを開始します。このコンテナは、ユーザーがセッションを終了するまで実行が続行され、その時点でコンテナは削除されます。

管理者は、Quadletファイルでこの機能を使用するユーザーを構成します。これらのファイルは、ユーザーがコンテナ内にいるときのホスト・システムの可視性、アクセス制限、セキュリティ権限、リソース使用率など、ユーザーがコンテナ内で作業するときのパラメータを定義します。詳細は、「Quadletについて」を参照してください。

次に、コンテナでの作業時にPodmanログイン・シェルおよびその他の設定パラメータを使用するようにユーザーを構成する方法の例を示します。quadletが特定の${USER_ID}に適用され、quadletがpodmansh.containerであるとします。

[Unit]
Description=The Podmansh container
After=local-fs.target

[Container]
Image=container-registry.oracle.com/os/oraclelinux:8-slim
ContainerName=podmansh
RemapUsers=keep-id
RunInit=yes

Exec=sleep infinity

[Install]
RequiredBy=default.target

[Container]セクションでさらにパラメータを定義して、コンテナ内でユーザーが実行できる操作をさらに指定できます。詳細は、podman-systemd.unit(5)マニュアル・ページを参照してください。

コンテナの名前(ContainerName)はpodmanである必要があることに注意してください。このように、/usr/bin/podmanshシェル・コマンドは、podmanshコンテナでpodman execを実行します。

quadletの${USER_ID}に一致するIDを持つユーザーは、次のようにログインします:

ssh user@systemname

quadletファイル内でユーザーに定義されたすべての設定は、ユーザーや管理者の介入を必要とせずに透過的に実行されます。

Podmanログイン・シェルとその他の定義済パラメータを組み合せてユーザーを分離することで、コンテナのセキュリティを確保します。コンテナはセッションの最後に削除され、再度ログインすると、ユーザーに対して同じ制限された環境が再作成されます。そのため、コンテナの操作はより簡単になります。

Podmanサービス・ラッパーの生成

ゼロからSystemdサービス・ラッパーを記述するかわりに、podman generate systemdコマンドを使用して、自動的にサービス構成ファイルを生成します。

rootユーザー・システム・サービスとしてコンテナを実行する場合は、コンテナ・サービス・ラッパー構成ファイルを/etc/systemd/system/に格納します。標準ユーザーとしてコンテナを実行する場合は、コンテナ・サービス・ラッパー構成ファイルを$HOME/.config/systemd/user/に保存します。

コンテナ用Podmanサービス・ラッパーの生成

個別のコンテナ用のSystemdサービス・ラッパーを生成して、$HOME/.config/systemd/userディレクトリに格納するには:

podman generate systemd --name containername > $HOME/.config/systemd/user/container-containername.service

ポッド用Podmanサービス・ラッパーの生成

特定のポッドのPodmanサービス・ラッパーを生成するには、次のコマンドを使用します。

podman generate systemd --name podname

ただし、ポッド自体内のすべてのコンテナに対するサービス・ラッパー構成ファイルの生成を含めるには、コマンドで--fileオプションを使用します。この場合、ファイルを生成するディレクトリでコマンドを実行する必要があります。

$HOME/.config/systemd/userで、mypodとそのコンテナの両方に対してPodmanサービス・ラッパーを生成するとします。次のコマンドを実行します。

cd $HOME/.config/systemd/user/
podman generate systemd --files --name mypod

このコマンドでは、mypodを対象とするサービス・ラッパーには、ポッドが正常に実行するために必要な各コンテナ・ラッパーへの依存関係が含まれています。

Systemdサービス・ラッパーを使用してポッドを開始または停止すると、コンテナ・サービスは同じアクションを自動的にトリガーします。

Podmanサービスの管理

すべてのSystemdサービスは、systemctlコマンドを使用して管理します。

コンテナまたはポッドにSystemdサービス・ラッパーを構成した後、そのコンテナまたはポッドはsystemctlコマンドを使用してサービスとして管理できます。

標準ユーザーとしてコンテナを実行している場合は、すべてのsystemctlコマンドに--userオプションを使用する必要があります。

Podmanサービスの開始と再開

注意:

すでにSystemdサービス・ラッパーの外部でコンテナまたはポッドが実行されている場合、そのコンテナまたはポッドはサービス・ラッパーでは開始できません。その場合は、podman stopまたはpodman pod stopコマンドを使用して、最初にコンテナまたはポッドを停止します。

rootユーザーは、サービス構成が/etc/systemd/system/に格納されている場合にコンテナを開始できます。次に例を示します:

sudo systemctl start container-containername.service

標準ユーザーは、サービス構成が$HOME/.config/systemd/userに格納されている場合に、同じ方法でコンテナを開始できますが、--userオプションを使用する必要があります。

systemctl --user start container-containername.service

ポッドのサービス・ラッパーを開始するには、次のようにパラレル・コマンド構文を使用します。

sudo systemctl start pod-podname.service

コンテナまたはポッドのサービス・ラッパーを再開するには、systemctl restartコマンドを使用できます。次のコマンドは、標準ユーザーとしてポッドを再開します。

systemctl --user restart pod-podname.service

ポッドを開始または再開すると、ポッドに含まれているすべてのコンテナが同様に開始または再開されます。

Podmanサービスの停止

コンテナまたはポッドを停止するには、systemctl stopコマンドを使用できます。次のコマンドは、標準ユーザーとしてポッドを停止します。

systemctl --user stop pod-podname.service

ポッドを開始または再開すると、ポッドに含まれているすべてのコンテナが同様に開始または再開されます。

Podmanサービスのステータスの確認

コンテナまたはポッドに作成したサービス・ラッパーの現在のステータスを確認するには、systemctl statusコマンドを使用できます。次に例を示します:

systemctl --user status container-containername.service

Podmanサービスの自動リストアの有効化

Podmanコンテナのサービス・ラッパーを生成するときには、カスタムの構成ステップを追加できます。

たとえば、1秒のタイムアウト後に常に再開するサービス・ラッパーを作成するには、次のように--restart-policyフラグにパラメータ値を設定します。

sudo systemctl generate systemd --restart-policy=always -t 1 containername > /etc/systemd/user/container-containername.service

システムの起動時にサービス・ラッパーが自動的に実行されるように設定するには、次のように入力します。

sudo systemctl enable container-containername.service

同じコマンドをポッドのサービス・ラッパーにも使用できます。

sudo systemctl enable pod-podname.service

サービスが標準ユーザーとして実行されている場合は、ログインしていないときにプロセスを実行する権限をユーザーに付与する必要があります。それ以外の場合、ユーザーはサービスを有効にできません。次のコマンドをrootユーザーとして入力します。

sudo loginctl enable-linger user

詳細は、https://docs.oracle.com/en/learn/use_systemd/index.htmlを参照してください。

Podmanサービス・ラッパー構成の変更

Podmanで生成したSystemdサービス・ラッパー構成ファイルは、標準のSystemd構成の形式と仕様に従います。生成されたサービス・ラッパー構成ファイルを変更する場合は、そのファイルをテキスト・エディタで手動で編集します。

『Oracle Linux 8: コア・システム構成の管理』の手順に従って、Oracle Linux 8でSystemdサービス・ラッパーの動作を変更します。Oracle Linux 9の場合、詳細は、『Oracle Linux 9: コア・システム構成の管理』を参照してください。

podman generate systemdコマンドで生成したサービス・ラッパーの変更方法の詳細は、https://docs.podman.io/en/latest/markdown/podman-generate-systemd.1.htmlを参照してください。