第15章 Podman を使用した systemd へのコンテナーの移植
Podman (Pod Manager) は、シンプルなデーモンレスツールである、フル機能のコンテナーエンジンです。Podman は、他のコンテナーエンジンからの移行を容易にし、Pod、コンテナー、およびイメージの管理を可能にする Docker-CLI と同等のコマンドラインを備えています。
Podman は元々、Linux システム全体を提供したり、起動順序、依存関係のチェック、サービス障害時の復旧といったサービスを管理したりするように設計されたものではありませんでした。システム全体の初期化は systemd が担当していました。
Red Hat がコンテナーを systemd に統合したことにより、Podman で構築された OCI および Docker 形式のコンテナーを、Linux システム内の他のサービスや機能と同様の方法で管理できるようになりました。systemd 初期化サービスを使用して、Pod およびコンテナーを操作できます。
systemd ユニットファイルを使用すると、以下が可能になります。
- コンテナーまたは Pod を systemd サービスとして起動するように設定します。
- コンテナー化されたサービスを実行して依存関係を確認する順序を定義します (たとえば、別のサービスが実行されていること、ファイルが利用可能であること、またはリソースがマウントされていることなど)。
-
systemctlコマンドを使用して、systemd システムの状態を制御します。
systemd ユニットファイルを使用して、コンテナーおよび Pod の移植可能な説明を生成できます。
15.1. Quadlets を使用した 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メタパッケージがインストールされている。
手順
mysleep.containerユニットファイルを作成します。$ cat $HOME/.config/containers/systemd/mysleep.container [Unit] Description=The sleep container After=local-fs.target [Container] Image=registry.access.redhat.com/ubi9-minimal:latest Exec=sleep 1000 [Install] # Start by default on boot WantedBy=multi-user.target default.target[Container]セクションでは、以下を指定する必要があります。-
Image- 実行するコンテナーイメージ Exec- コンテナー内で実行するコマンドこれにより、
systemdユニットファイルで指定する他のすべてのフィールドを使用できるようになります。
-
mysleep.containerファイルに基づいてmysleep.serviceを作成します。$ systemctl --user daemon-reloadオプション:
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)mysleep.serviceを起動します。$ systemctl --user start mysleep.service
検証
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: ...すべてのコンテナーをリスト表示します。
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 421c8293fc1b registry.access.redhat.com/ubi9-minimal:latest sleep 1000 30 seconds ago Up 10 seconds ago systemd-mysleep作成されたコンテナーの名前は次の要素で構成されています。
-
systemd-接頭辞 systemdユニットの名前、つまりsystemd-mysleepこの名前は、一般的なコンテナーと
systemdユニットで実行されているコンテナーを区別するのに役立ちます。また、コンテナーがどのユニットで実行されるかを判断するのにも役立ちます。コンテナーの名前を変更する場合は、[Container]セクションのContainerNameフィールドを使用します。
-