第7章 Podman で systemd サービスとしてコンテナーを実行

Podman (Pod Manager) は、簡単なデーモンレスツールである、完全に機能するコンテナーエンジンです。Podman は、他のコンテナーエンジンからの移行を容易にし、Pod、コンテナー、およびイメージの管理を可能にする Docker-CLI と同等のコマンドラインを提供します。当初は、Linux システム全体の起動や、起動順序、依存関係の確認、失敗したサービスの復元などのサービス管理を行うよう設計されていました。これは、systemd のような、本格的な初期化システムのジョブです。

Red Hat は、コンテナーと systemd の統合について先駆者になり、他のサービスと機能が Linux システムで管理されているのと同じように、Podman により構築された OCI 形式および Docker 形式のコンテナーを管理できます。本章では、systemd 初期化サービスを使用してコンテナーを操作する 2 つの方法を説明します。

  • systemd でコンテナーを起動 - ホストコンピューターに systemd ユニットファイルを設定して、自動的にホストの起動、停止、ステータスの確認を行い、その他の方法ではコンテナーを systemd サービスとして管理できます。
  • systemd を使用してコンテナーでサービスの起動 - 多くの Linux サービス (Web サーバー、ファイルサーバー、データベースサーバーなど) は、Red Hat Enterprise Linux が systemd サービスとして動作するようにパッケージ化されています。最新の RHEL コンテナーイメージを使用している場合は、RHEL コンテナーイメージを設定して systemd サービスを開始し、コンテナーが起動すると、コンテナーで選択したサービスを自動的に開始できます。

次の 2 つのセクションでは、このような方法で systemd コンテナーを使用する方法を説明します。

7.1. systemd でコンテナーの起動

コンテナーを systemd サービスとして開始するように設定すると、コンテナー化されたサービスの実行順序の定義、依存関係の確認 (別のサービスが実行していること、ファイルが利用可能であること、リソースがマウントされていることなど)、さらに runc コマンドを使用してコンテナーが開始するように設定できます。

このセクションでは、RHEL システムで systemd サービスとして直接実行するように設定されたコンテナーの例を示します。systemd サービスファイルの自動生成は、「systemd ユニットファイルの生成」を参照してください。

  1. システムで実行するイメージを取得します。たとえば、docker.io の Alpine Linux に基づく最小限のイメージを使用するには、次のコマンドを実行します。

    # podman pull docker.io/library/alpine:latest
  2. ~/.config/systemd/user ディレクトリーに汎用ユニットの構成ファイルを作成して、コンテナーを systemd サービスとして構成します。たとえば、~/.config/systemd/user/container.service の内容は次のようになります。

    # cat ~/.config/systemd/user/container.service
    [Unit]
    Description=Podman in Systemd
    
    [Service]
    Restart=on-failure
    ExecStartPre=/usr/bin/rm -f /%t/%n-pid /%t/%n-cid
    ExecStart=/usr/bin/podman run --conmon-pidfile  /%t/%n-pid  --cidfile /%t/%n-cid -d alpine:latest top
    ExecStop=/usr/bin/sh -c "/usr/bin/podman rm -f `cat /%t/%n-cid`"
    KillMode=none
    Type=forking
    PIDFile=/%t/%n-pid
    
    [Install]
    WantedBy=multi-user.target
    • Restart=on-failure 行は、再起動ポリシーを設定し、サービスを正常に開始または停止できない場合、またはプロセスがゼロ以外のステータスで終了した場合に、systemd にサービスを再開するように指示します。
    • ExecStart 行は、コンテナーの開始方法を示しています。
    • ExecStop 行は、コンテナーを停止して削除する方法を示しています。

      top を実行するバックグラウンドで alpine:latest コンテナーを実行できます。podman run コマンドには、2 つのコマンドラインオプションがあります。

    • --conmon-pidfile オプションは、ホストで実行している conmon プロセスのプロセス ID を格納するパスを指します。conmon プロセスはコンテナーと同じ終了ステータスで終了します。これにより、systemd は正しいサービスステータスを報告し、必要に応じてコンテナーを再起動できます。
    • --cidfile オプションは、コンテナー ID を格納するパスを指します。
    • %t は、ランタイムディレクトリーのルートへのパスです (例: /run/user/$UserID)。
    • %n は、サービスの完全な名前です。

    たとえば、サービス名が container で、ユーザー ID が 1000 の場合、上記の構成では、/run/user/1000/container.service-pidconmon-pidfile に配置し、/run/user/1000/container.service-cidcidfile に配置します。

  3. systemd マネージャーの設定を再読み込みするには、次のコマンドを実行します。

    # systemctl --user daemon-reload
  4. サービスを有効にしてシステム起動時に開始するには、次のコマンドを実行します。

    # systemctl --user enable container.service
  5. サービスをすぐに開始してサービスの状態を確認するには、次のコマンドを実行します。

    # systemctl --user start container.service
    # systemctl --user status container.service
    * container.service - Podman in Systemd
       Loaded: loaded (/home/valentin/.config/systemd/user/container.service; disabled; vendor preset: enabled)
       Active: active (running) since Mon 2019-11-18 15:32:56 CET; 1min 5s ago
      Process: 189705 ExecStartPre=/usr/bin/rm -f //run/user/1000/container.service-pid //run/user/1000/container.service-cid (code=exited, status=0/SUCCESS)
      Process: 189706 ExecStart=/usr/bin/podman run --conmon-pidfile //run/user/1000/container.service-pid --cidfile //run/user/1000/container.service-cid -d alpine:latest top (code=exited, status=0/SUCCESS)
     Main PID: 189731 (conmon)
       CGroup: /user.slice/user-1000.slice/user@1000.service/container.service
           	├─189724 /usr/bin/fuse-overlayfs [...]
           	├─189726 /usr/bin/slirp4netns [...]
           	├─189731 /usr/bin/conmon [...]
           	└─189737 top
  6. 実行中または終了したコンテナーの一覧を表示するには、次のコマンドを実行します。

    # podman ps
    CONTAINER ID  IMAGE                        	COMMAND  CREATED     	STATUS         	PORTS  NAMES
    f20988d59920  docker.io/library/alpine:latest  top  	12 seconds ago  Up 11 seconds ago     	funny_zhukovsky
  7. container.service を停止するには、次のコマンドを実行します。

    # systemctl --user stop container.service

systemd でサービスを設定する方法の詳細は、システム管理者ガイドの章「systemd によるサービス管理」か、「Running containers with Podman and shareable systemd services」を参照してください。


このページには機械翻訳が使用されている場合があります (詳細はこちら)。