名称

podman-system-service - 运行 API 服务

概要

podman system service [选项]

描述

podman system service 命令创建一个监听服务,该服务响应 Podman 的 API 调用。该命令在 Linux 系统上可用,通常在 systemd 服务中执行。当 Podman 命令直接在 Windows 或 macOS 主机上执行,或在其他情况下 Podman 命令访问远程 Podman API 服务时,该命令不可用。

podman system service 提供的 REST API 分为两部分:一个兼容性层,提供对 Docker v1.40 API 的支持,以及一个 Podman 原生 Libpod 层。后者的文档位于 https://docs.podman.org.cn/en/latest/_static/api.html。这两个 API 都是版本化的,但服务器不会拒绝版本设置不支持的请求。

在 systemd 服务中运行该命令

podman system service 命令支持 systemd 套接字激活。当该命令在 systemd 服务中运行时,API 服务因此可以按需提供。如果 systemd 服务尚未运行,它将在客户端连接到监听套接字时立即激活。然后 systemd 执行 podman system service 命令。经过一段时间的空闲时间(由 --time 选项定义),该命令将终止。systemd 将 podman.service 状态设置为不活动状态。此时,没有运行 podman system service 进程。不会浪费任何不必要的计算资源。只要另一个客户端连接,systemd 就会再次激活 systemd 服务。

为用户声明 Podman API 服务的 systemd 单元文件是

  • /usr/lib/systemd/user/podman.service

  • /usr/lib/systemd/user/podman.socket

podman.socket 文件中,监听 Unix 套接字的路径由以下定义

ListenStream=%t/podman/podman.sock

该路径包含 systemd 规范符 %t,systemd 将其扩展为环境变量 XDG_RUNTIME_DIR 的值(请参阅 systemd.unit(5) 手册页中的 systemd 规范符)。

除了 systemd 用户服务之外,还有一个 systemd 系统服务 podman.service。它运行 rootful Podman,并从 Unix 套接字 /run/podman/podman.sock 访问。请参阅 systemd 单元文件

  • /usr/lib/systemd/system/podman.service

  • /usr/lib/systemd/system/podman.socket

podman system service 命令不支持 API 服务的多个监听套接字。

注意:默认的 systemd 单元文件(系统和用户)将日志级别选项从 error 更改为 info。此更改提供了有关每个 API 调用的附加信息。

直接运行该命令

为了支持不使用 systemd 服务运行 API 服务,该命令还接受一个可选的 API 端点参数,以 URI 形式表示。例如,unix:///tmp/foobar.socktcp://127.0.0.1:8080。如果没有提供端点,则使用默认值。rootful 服务的默认端点为 unix:///run/podman/podman.sock,rootless 服务的默认端点为 unix://$XDG_RUNTIME_DIR/podman/podman.sock(例如 unix:///run/user/1000/podman/podman.sock

从容器内部访问 Unix 套接字

要从容器内部访问 API 服务

  • 将套接字作为卷挂载

  • 使用 --security-opt label=disable 运行容器

安全

请注意,API 授予对所有 Podman 功能的完全访问权限,因此允许以运行 API 的用户的身份执行任意代码,并且无法限制或审核此访问权限。API 的安全模型建立在通过 Unix 套接字进行访问的基础上,并通过标准文件权限限制访问,确保只有运行服务的用户才能访问它。我们强烈建议不要通过网络提供 API 套接字(即,将服务绑定到 tcp URL)。即使通过本地主机访问也存在风险 - 任何拥有系统访问权限的人都可以访问 API。如果需要远程访问,我们建议通过 SSH 转发 API 套接字,并将远程计算机上的访问权限限制在最大程度上。如果必须使用 tcp URL,建议使用 --cors 选项来提高安全性。

选项

--cors

注入到 HTTP 响应的 CORS 标头。默认值为空字符串,它禁用 CORS 标头。

--help, -h

打印使用说明。

--time, -t

会话过期之前的 数。默认值为 5 秒。值为 0 表示没有超时,因此会话不会过期。

可以通过 containers.conf 中的 service_timeout=VALUE 字段更改默认超时。有关更多信息,请参阅 containers.conf(5)

示例

启动 rootless 服务的用户 systemd 套接字。

systemctl --user start podman.socket

配置 DOCKER_HOST 环境变量以指向 Podman 套接字,以便可以通过 Docker API 工具(如 docker-compose)使用它。

$ export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/podman/podman.sock
$ docker-compose up

配置 systemd 套接字以在重新启动后自动启动,并以指定用户身份运行。

systemctl --user enable podman.socket
loginctl enable-linger <USER>

启动 rootful 服务的 systemd 套接字。

sudo systemctl start podman.socket

配置套接字以在重新启动后自动启动。

sudo systemctl enable podman.socket

可以使用不使用 systemd 套接字激活来运行 API。在这种情况下,API 将无法按需使用,因为在空闲超时时间过后,命令将保持终止状态。运行一个没有使用套接字激活的 API,其空闲超时时间为 5 秒。

podman system service --time 5

由于没有提供 URI 参数,因此使用了默认套接字。

另请参阅

podman(1), podman-system-connection(1), containers.conf(5)

历史

2020 年 1 月,最初由 Brent Baude <[email protected]> 编写 2020 年 11 月,由 Jhon Honce(jhonce at redhat dot com)更新