第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 サービスとして直接実行するように設定されたコンテナーの例を示します。

  1. システムで実行するイメージを取得します。たとえば、docker.io から redis サービスを使用するには、以下のコマンドを実行します。

    # podman pull docker.io/redis
  2. イメージをコンテナーとして実行し、systemd サービスファイルで使用する名前を付けます。たとえば、実行中の redis コンテナーに redis_server という名前を付けるには、以下のコマンドを入力します。

    # podman run -d --name redis_server -p 6379:6379 redis
  3. /etc/systemd/system/ ディレクトリーでユニット設定ファイルを作成して、コンテナーを systemd サービスとして設定します。たとえば、/etc/systemd/system/redis-container.service の内容は次のようになります (redis_server は、podman run 行に設定した名前と一致することに注意してください)。

    [Unit]
    Description=Redis container
    
    [Service]
    Restart=always
    ExecStart=/usr/bin/podman start -a redis_server
    ExecStop=/usr/bin/podman stop -t 2 redis_server
    
    [Install]
    WantedBy=local.target
  4. ユニットファイルの作成後、システムの起動時にコンテナーを自動的に起動するには、以下を入力します。

    # systemctl enable redis-container.service
  5. サービスを有効にすると、システムの起動時にサービスが開始します。すぐに開始してサービスの状態を確認するには、以下を入力します。

    # systemctl start redis-container.service
    # systemctl status redis-container.service
    * redis-container.service - Redis container
       Loaded: loaded (/etc/systemd/system/redis-container.service; enabled; vendor preset: disabled)
       Active: active (running) since Fri 2019-03-15 16:22:55 EDT; 6s ago
     Main PID: 1540 (podman)
        Tasks: 8 (limit: 2353)
       Memory: 7.7M
       CGroup: /system.slice/redis-container.service
               └─1540 /usr/bin/podman start -a redis_server
    
    Mar 15 16:22:55 localhost.localdomain systemd[1]: Started Redis container.

systemd を使用してサービスを設定する方法は、『システム管理者ガイド』の「systemd によるサービス管理」を参照してください。