Red Hat Training

A Red Hat training course is available for RHEL 8

10.5. systemd を使用した Pod の自動起動

複数のコンテナーを systemd サービスとして起動できます。systemctl コマンドは、Pod でだけ使用するようにしてください。コンテナーは Pod サービスと内部の infra-container で管理されているので systemctl を使用して個別にコンテナーを開始または停止しないでください。

手順

  1. たとえば、systemd-pod などの空の Pod を作成します。

    $ podman pod create --name systemd-pod
    11d4646ba41b1fffa51c108cbdf97cfab3213f7bd9b3e1ca52fe81b90fed5577
  2. すべての Pod を一覧表示します。

    $ podman pod ps
    POD ID        NAME         STATUS   CREATED         # OF CONTAINERS  INFRA ID
    11d4646ba41b  systemd-pod  Created  40 seconds ago  1                8a428b257111
    11d4646ba41b1fffa51c108cbdf97cfab3213f7bd9b3e1ca52fe81b90fed5577
  3. 空の Pod に 2 つのコンテナーを作成します。たとえば、container0container1systemd-pod に作成するには、以下を実行します。

    $ podman create --pod systemd-pod --name container0 registry.access.redhat.com/ubi8 top
    $ podman create --pod systemd-pod --name container1 registry.access.redhat.com/ubi8 top
  4. 関連付けられている全 Pod およびコンテナーを一覧表示します。

    $ podman ps -a --pod
    CONTAINER ID  IMAGE                                   COMMAND  CREATED        STATUS         PORTS   NAMES               POD ID        PODNAME
    24666f47d9b2  registry.access.redhat.com/ubi8:latest  top      3 minutes ago  Created                container0          3130f724e229  systemd-pod
    56eb1bf0cdfe  k8s.gcr.io/pause:3.2                             4 minutes ago  Created                3130f724e229-infra  3130f724e229  systemd-pod
    62118d170e43  registry.access.redhat.com/ubi8:latest  top      3 seconds ago  Created                container1          3130f724e229  systemd-pod
  5. 新規 Pod の systemd ユニットファイルを生成します。

    $ podman generate systemd --files --name systemd-pod
    /home/user1/pod-systemd-pod.service
    /home/user1/container-container0.service
    /home/user1/container-container1.service

    systemd ユニットファイルは、3 つ作成される点に注意してください。1 つは systemd-pod の Pod 向け、2 つは container0container1 のコンテナー向けです。

  6. pod-systemd-pod.service ユニットファイルを表示します。

    $ cat pod-systemd-pod.service
    # pod-systemd-pod.service
    # autogenerated by Podman 2.0.3
    # Tue Jul 28 14:00:46 EDT 2020
    
    
    [Unit]
    Description=Podman pod-systemd-pod.service
    Documentation=man:podman-generate-systemd(1)
    Wants=network.target
    After=network-online.target
    Requires=container-container0.service container-container1.service
    Before=container-container0.service container-container1.service
    
    [Service]
    Environment=PODMAN_SYSTEMD_UNIT=%n
    Restart=on-failure
    ExecStart=/usr/bin/podman start c852fbaba568-infra
    ExecStop=/usr/bin/podman stop -t 10 c852fbaba568-infra
    ExecStopPost=/usr/bin/podman stop -t 10 c852fbaba568-infra
    PIDFile=/run/user/1000/containers/overlay-containers/a7ff86382608add27a03ac2166d5d0164199f01eadf80b68b06a406c195105fc/userdata/conmon.pid
    KillMode=none
    Type=forking
    
    [Install]
    WantedBy=multi-user.target default.target
    • [Unit] セクションの Requires 行は、container-container0.servicecontainer-container1.service ユニットファイルの依存関係を定義します。両方のユニットファイルがアクティベートされます。
    • [Service] セクションの ExecStart 行および ExecStop 行はそれぞれ infra-container を開始して停止します。
  7. container-container0.service ユニットファイルを表示します。

    $ cat container-container0.service
    # container-container0.service
    # autogenerated by Podman 2.0.3
    # Tue Jul 28 14:00:46 EDT 2020
    
    [Unit]
    Description=Podman container-container0.service
    Documentation=man:podman-generate-systemd(1)
    Wants=network.target
    After=network-online.target
    BindsTo=pod-systemd-pod.service
    After=pod-systemd-pod.service
    
    [Service]
    Environment=PODMAN_SYSTEMD_UNIT=%n
    Restart=on-failure
    ExecStart=/usr/bin/podman start container0
    ExecStop=/usr/bin/podman stop -t 10 container0
    ExecStopPost=/usr/bin/podman stop -t 10 container0
    PIDFile=/run/user/1000/containers/overlay-containers/12e85378f2854b8283f791974494a02aa6c92630d76d1050237839b61508a008/userdata/conmon.pid
    KillMode=none
    Type=forking
    
    [Install]
    WantedBy=multi-user.target default.target
    • [Unit] セクションの BindsTo l行は、pod-systemd-pod.service ユニットファイルの依存関係を定義します。
    • [Service] セクションの ExecStart 行および ExecStop 行では、それぞれ container0 を起動および停止します。
  8. container-container1.service ユニットファイルを表示します。

    $ cat container-container1.service
  9. 生成されたファイルをすべて $HOME/.config/systemd/user にコピーして、root 以外のユーザーとしてインストールします。

    $ cp pod-systemd-pod.service container-container0.service container-container1.service $HOME/.config/systemd/user
  10. ユーザーのログイン時に、サービスを有効にして開始します。

    $ systemctl enable --user pod-systemd-pod.service
    Created symlink /home/user1/.config/systemd/user/multi-user.target.wants/pod-systemd-pod.service → /home/user1/.config/systemd/user/pod-systemd-pod.service.
    Created symlink /home/user1/.config/systemd/user/default.target.wants/pod-systemd-pod.service → /home/user1/.config/systemd/user/pod-systemd-pod.service.

    サービスは、ユーザーのログアウト時に停止される点に注意してください。

検証手順

  • サービスが有効になっているかどうかを確認します。

    $ systemctl is-enabled pod-systemd-pod.service
    enabled

関連情報