さよなら ‘podman generate systemd’:FedoraでQuadletを使ってプロフェッショナルにコンテナを管理する方法

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

なぜ ‘podman generate systemd’ をやめて Quadlet に移行したのか?

Fedoraでコンテナを動かしているなら、podman generate systemd コマンドには馴染みがあるでしょう。この方法はかつての標準でしたが、多くの「技術的負債」を残しました。生成されるユニットファイルは数十行に及び、固定のコンテナIDが含まれるため、メンテナンスが非常に困難です。環境変数の変更やボリュームのマウントを追加するたびにユニットファイルを修正するのは、苦行に近い作業でした。

私は2年以上、Fedoraをメインの開発用PCとして使用しています。Podman 4.4でQuadletが登場した際、すべての個人サービスをこのツールに移行しました。Quadletは、systemdの設定に似た簡潔な .container ファイルでコンテナを定義できます。システムをリロードするたびに、これらが実際のsystemdユニットに自動的にコンパイルされます。非常にクリーンでモダンな手法です。

最大のメリットは、rootless(ルート権限不要)で実行できる点です。Fedoraにおいて、Quadletは複雑な独自設定でDevOpsエンジニアを悩ませることなく、セキュリティを大幅に向上させてくれます。

Fedoraでの環境準備

Fedora 38以降のほとんどのバージョンには、新しいPodmanがプリインストールされています。以下のコマンドでバージョンを素早く確認できます:

podman --version

Fedora Minimalを使用している場合は、必要なパッケージをインストールしてください:

sudo dnf install -y podman

rootlessモードに関する重要な注意点:ログイン(SSHやGUI経由)しなくても、マシンの起動時にコンテナが自動開始されるように、linger 機能を有効にしておきましょう:

loginctl enable-linger $USER

Quadletで最初のコンテナをデプロイする

Docker Composeや、延々と続く podman run コマンドのことは忘れましょう。一般ユーザー権限では、~/.config/containers/systemd/ ディレクトリ内で作業するだけで済みます。

設定ディレクトリが存在しない場合は作成します:

mkdir -p ~/.config/containers/systemd/

個人用WebサーバーとしてNginxを立ち上げてみましょう。my-web.container ファイルを作成します:

nano ~/.config/containers/systemd/my-web.container

以下の設定内容をコピーしてください:

[Unit]
Description=Quadletで実行されるNginx Webサーバー
After=network-online.target

[Container]
Image=docker.io/library/nginx:latest
PublishPort=8080:80
Volume=/home/user/html:/usr/share/nginx/html:Z
Environment=FOO=BAR

[Install]
WantedBy=default.target

注目すべきパラメータ:

  • [Unit]: After=network-online.target は、ネットワークがオンラインになるまでコンテナの起動を待機させます。
  • [Container]: ファイルの核心部分です。
    • Image: 使用するイメージを指定します。
    • PublishPort: ホストマシンのポート8080をコンテナ内のポート80にマップします。
    • Volume: 接尾辞の :Z はFedoraにおいて非常に重要です。PodmanがSELinuxラベルを自動的に処理し、イライラさせる「Permission denied」エラーを徹底的に回避してくれます。

サービスの有効化と管理

ファイルを保存しただけでは、Quadletはすぐには適用されません。systemdに設定を再スキャンさせる必要があります:

systemctl --user daemon-reload

この時点で、my-web.service という名前のサービスが自動的に作成されています。通常のシステムサービスと同じように操作できます:

# サービスを開始
systemctl --user start my-web.service

# 動作ステータスを確認
systemctl --user status my-web.service

# マシン起動時に自動実行
systemctl --user enable my-web.service

このプロセスは非常に快適です。イメージを更新したい場合は、podman pull nginx:latest を実行してから systemctl --user restart my-web するだけです。システムが古いコンテナの破棄と新しいコンテナの作成を自動で行うため、手動でコンテナIDを管理する必要はありません。

確認とモニタリング

コンテナのログはsystemdのジャーナル(journal)に統合されます。集中管理されることで、エラーの追跡が容易になります:

journalctl -f --user-unit my-web.service

Podmanの視点から詳しく確認したい場合も、podman ps コマンドがそのまま使えます。リロード後にサービスが表示されない場合は、Quadletのデバッグツールを使用してください:

/usr/libexec/podman/quadlet -user --dry-run

このコマンドは、生のsystemdユニットファイルをレンダリングします。.container ファイルに構文エラーがある場合、推測に頼ることなく、ここでエラーメッセージを確認できます。

SELinuxとポートに関する実践的な注意点

ボリュームのマウント時に面倒だからとSELinuxを無効にする人が多いですが、それはやめましょう。setenforce 0 をする代わりに、専用ボリュームには :Z を、共有ボリュームには :z を使用してください。Fedoraが自動的にラベル付け(relabel)を行い、コンテナのファイルアクセスを許可しつつシステムを保護します。

ポートに関しては、Fedoraはデフォルトで一般ユーザーが1024未満のポート(80や443など)を使用することを制限しています。最善の方法は、8080や8443などの高いポート番号を使用し、その前段にCaddyやNginxなどのリバースプロキシを配置してトラフィックを誘導することです。この方法は安全であり、rootlessの標準にも合致しています。

Fedoraエコシステム上でコンテナをプロフェッショナルかつ長期的に安定して管理したいのであれば、Quadletへの移行は正しい選択です。

Share: