14.7. 使用 systemd 自动启动 pod


您可以将多个容器作为 systemd 服务启动。请注意,system ctl 命令应该只用于 pod,不应通过 systemctl 单独启动或停止容器,因为它们由 pod 服务与内部 infra-container 一起管理。

注意

从 Podman v4.6 开始,您可以使用描述如何以类似于常规 systemd 单元文件的格式运行容器的 Quadlets ,并隐藏了在 systemd 下运行容器的复杂性。

先决条件

  • container-tools 元数据包已安装。

流程

  1. 创建一个空 pod,如 systemd-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 中创建两个容器。例如,要在 systemd-pod 中创建 container0container1

    $ podman create --pod systemd-pod --name container0 registry.access.redhat.com/ubi9 top
    $ podman create --pod systemd-pod --name container1 registry.access.redhat.com/ubi9 top
  4. 可选:列出与其关联的所有 pod 和容器:

    $ podman ps -a --pod
    CONTAINER ID  IMAGE                                   COMMAND  CREATED        STATUS         PORTS   NAMES               POD ID        PODNAME
    24666f47d9b2  registry.access.redhat.com/ubi9: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/ubi9: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 单元文件,一个用于 systemd-pod pod,两个用于容器 container0container1

  6. 显示 pod-systemd-pod.service 单元文件:

    $ cat pod-systemd-pod.service
    # pod-systemd-pod.service
    # autogenerated by Podman 3.3.1
    # Wed Sep  8 20:49:17 CEST 2021
    
    [Unit]
    Description=Podman pod-systemd-pod.service
    Documentation=man:podman-generate-systemd(1)
    Wants=network-online.target
    After=network-online.target
    RequiresMountsFor=
    Requires=container-container0.service container-container1.service
    Before=container-container0.service container-container1.service
    
    [Service]
    Environment=PODMAN_SYSTEMD_UNIT=%n
    Restart=on-failure
    TimeoutStopSec=70
    ExecStart=/usr/bin/podman start bcb128965b8e-infra
    ExecStop=/usr/bin/podman stop -t 10 bcb128965b8e-infra
    ExecStopPost=/usr/bin/podman stop -t 10 bcb128965b8e-infra
    PIDFile=/run/user/1000/containers/overlay-containers/1dfdcf20e35043939ea3f80f002c65c00d560e47223685dbc3230e26fe001b29/userdata/conmon.pid
    Type=forking
    
    [Install]
    WantedBy=multi-user.target default.target
    • [Unit] 部分中的 Requires 行定义 container-container0.servicecontainer-container1.service 单元文件的依赖项。两个单元文件都会被激活。
    • [Service] 部分中的 ExecStartExecStop 行分别启动和停止 infra-container。
  7. 显示 container-container0.service 单元文件:

    $ cat container-container0.service
    # container-container0.service
    # autogenerated by Podman 3.3.1
    # Wed Sep  8 20:49:17 CEST 2021
    
    [Unit]
    Description=Podman container-container0.service
    Documentation=man:podman-generate-systemd(1)
    Wants=network-online.target
    After=network-online.target
    RequiresMountsFor=/run/user/1000/containers
    BindsTo=pod-systemd-pod.service
    After=pod-systemd-pod.service
    
    [Service]
    Environment=PODMAN_SYSTEMD_UNIT=%n
    Restart=on-failure
    TimeoutStopSec=70
    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/4bccd7c8616ae5909b05317df4066fa90a64a067375af5996fdef9152f6d51f5/userdata/conmon.pid
    Type=forking
    
    [Install]
    WantedBy=multi-user.target default.target
    • [Unit] 部分中的 BindsTo 行定义 pod-systemd-pod.service 单元文件的依赖项
    • [Service] 部分中的 ExecStartExecStop 行分别启动和停止 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

其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.