Podman 远程客户端(Remote Client)实战指南:基于 SSH 与 REST API 远程管理 Linux 容器
容器运行时云原生CLI【免费下载链接】podmanPodman: A tool for managing OCI containers and pods.项目地址https://gitcode.com/gh_mirrors/po/podman点击查看免费下载Podman 远程客户端remote client允许你在本地工作站上执行 Podman 命令却由远端的 Linux 服务器实际完成容器、镜像与 Pod 的管理操作。本文以官方教程 docs/tutorials/remote_client.md 为核心骨架结合当前仓库的源码实现完整讲解从服务器端启用 API Socket、配置 SSH到客户端建立连接并执行远端命令的每一步帮助你掌握本地敲命令、远端跑容器的完整实战方案。远程客户端的工作原理Podman 远程客户端采用典型的客户端 / 服务器client-server模型其架构分为三层客户端运行在本地操作系统上提供与本地 Podman 完全一致的命令行界面CLI。唯一区别是少数只适用于本地模式的标志flag会被移除。传输层SSH当你在本地执行任意 Podman 命令时Podman 会通过 SSH 协议连接到远端的 Linux 服务器。服务端服务器上运行着 Podman 服务通过 systemd socket 激活启动客户端通过 SSH 连接到该服务后实际调用的是 Podman 提供的 REST API 来执行命令所有容器操作都发生在服务器上。从客户端使用者的角度来看远端容器仿佛运行在本机——podman ps、podman run、podman images等命令的体验与本地完全一致。需要说明的是本教程面向Linux 远程场景。如果你使用的是 Mac 或 Windows 客户端请参考 Mac 和 Windows 客户端教程。两种客户端形态podman-remote 与 podman --remote客户端机器上你可以二选一podman-remote单独编译的专用客户端只能作为远程客户端连接后端不包含本地引擎。podman完整版既能运行本地标准 Podman 命令也能通过podman --remote充当远程客户端。如果本地已经安装了完整版 Podman就不需要再安装 podman-remote。构建专用客户端可执行文件使用make podman-remote从源码构建。从源码结构看这两种形态在 cmd/podman/main.go 的parseCommands()中统一处理Podman 根据配置的**引擎模式EngineMode**决定行为本地模式为entities.ABIMode远程隧道模式为entities.TunnelMode。凡是标记了引擎模式注解、且与当前模式不匹配的命令会隐藏起来并返回错误提示cannot use command %q with the remote podman client。因此命令行界面与本地完全一致仅移除不适用的标志这一特性在实现层面是有保证的。准备阶段客户端与服务器安装客户端机器安装完整版 Podman它内置远程客户端能力或单独安装 podman-remote。安装方式按官方安装文档操作安装完成后确认podman或podman-remote命令可用。服务器机器服务器必须是 Linux 系统并安装 Podman。服务器上需要运行SSH 守护进程sshd它是客户端与服务端通信的基础。配置服务器启用 Podman API Socket 与 SSH启用 Podman API Socket在执行任何远程客户端命令之前必须在 Linux 服务器上启用podman.socketsystemd 服务。本文示例以普通非特权用户即rootless 用户身份运行 Podmanrootless 模式下 socket 默认监听于/run/user/${UID}/podman/podman.sock使用以下命令永久启用该 socketsystemctl --user enable --now podman.socket仓库中 contrib/systemd/user/podman.socket 定义了该 socket 的监听配置[Socket] ListenStream%t/podman/podman.sock SocketMode0660 DirectoryMode0700其中%t即运行时目录rootless 下对应/run/user/${UID}SocketMode0660允许同一用户组内的成员访问。该 socket 由 systemd 按需激活即客户端首次连接时才拉起podman.service承载 API 服务。启用 linger仅 rootless 必需为了让用户未登录时 socket 依然工作需要为当前用户启用 lingersudo loginctl enable-linger $USER如果以 root 身份运行 Podmanrootful则不需要这一步此时 socket 路径为/run/podman/podman.sock。启用后可以先用一条简单的远端命令验证 socket 是否在监听podman --remote info host: arch: amd64 buildahVersion: 1.16.0-dev cgroupVersion: v2 conmon: package: conmon-2.0.19-1.fc32.x86_64启用 sshdPodman 客户端与服务器之间的通信依赖 SSH。如果服务器尚未启用 SSH 守护进程请先启动sudo systemctl enable --now sshd配置 SSH 密钥远程 Podman 使用 SSH 在客户端与服务器之间通信使用SSH 密钥会显著提升体验无需每次输入密码。在客户端机器上生成密钥对ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519注意某些情况下使用rsa密钥会导致连接问题务必创建ed25519类型的密钥。生成的公钥默认位于~/.ssh/id_ed25519.pub。需要将公钥内容追加到 Linux 服务器的~/.ssh/authorized_keys中可用ssh-copy-id自动完成ssh-copy-id -i ~/.ssh/id_ed25519.pub 192.168.122.1如果你不想使用 SSH 密钥那么每次执行 Podman 命令时都会被提示输入登录密码。建立第一个连接说明下文中的podman-remote与podman --remote等价取决于你安装的是哪种形态。使用 Podman 远程客户端的第一步是配置一个连接connection。使用podman system connection add命令添加podman-remote system connection add myuser --identity ~/.ssh/id_ed25519 ssh://myuser192.168.122.1/run/user/1000/podman/podman.sock该命令会在 Podman 配置中记录一个远程连接如果这是添加的第一个连接它会自动被标记为默认连接。add 命令支持的连接地址形式从 cmd/podman/system/connection/add.go 源码可见DESTINATION支持以下四种形式形式说明[user]hostname未带 scheme默认按ssh://处理ssh://[user]hostname[:port][/path]未给出 path 时由服务端自动获取 socket 路径tcp://hostname:port未启用 TLS 时不加密unix://path必须使用绝对路径add命令还支持以下常用标志详见 add.go标志默认值说明--port, -p22SSH 端口号--identity无SSH 身份文件路径如~/.ssh/id_ed25519--default, -dfalse将连接设为默认连接--socket-path/run/podman/podman.sock或/run/user/{uid}/podman/podman.sock远端 socket 路径--tls-cert/--tls-key/--tls-ca无TLS 客户端证书、私钥、CA 文件仅tcp://scheme 支持需要注意的是--tls-cert、--tls-key、--tls-ca仅适用于tcp://scheme--identity不适用于unix://tcp://必须显式给出端口通过--port或写在 URL 中且--tls-cert与--tls-key必须成对提供。这些校验逻辑都可以在 add.go 中找到对应实现。连接记录最终写入podman-connections.json配置文件详见下文连接存储与查看一节。查看已配置的连接使用podman system connection list别名ls查看全部连接podman-remote system connection list Name Identity URI myuser* id_ed25519 ssh://myuser192.168.122.1/run/user/1000/podman/podman.sock输出中带*标记的是默认连接。默认表格包含Name、URI、Identity、Default、ReadWrite列。基于 cmd/podman/system/connection/list.go 源码list还支持--formattls额外展示TLSCA、TLSCert、TLSKey三列--formatjson输出 JSON 格式--format{{range .}}{{.Name}}{{ \n }}{{ end }}自定义 Go template--quiet, -q只输出连接名称。关于 ReadWrite 列根据 podman-system-connection(1) 的说明ReadWrite为true表示连接存储在podman-connections.json中可用system connection系列命令修改为false则表示连接定义在containers.conf的service_destinations中不能被system connection命令编辑。连接配置文件位置Podman 将连接写入podman-connections.json位于$XDG_CONFIG_HOME/containers若未设置该环境变量则默认是$HOME/.config/containers也可通过PODMAN_CONNECTIONS_CONF环境变量指定完整文件路径。该文件由 Podman 命令管理不应手工编辑——如需手工配置请使用containers.conf中的service_destinations。测试连接连接建立后用podman info验证能否正常通信podman-remote info host: arch: amd64 buildahVersion: 1.16.0-dev cgroupVersion: v2 conmon: package: conmon-2.0.19-1.fc32.x86_64如果连接失败Podman 会给出类似提示Cannot connect to Podman. Please verify your connection to the Linux system usingpodman system connection list, or trypodman machine initandpodman machine start。该提示逻辑位于 cmd/podman/root.go 的Execute()中。另外在远程模式下执行podman info或podman version即使连接失败也会尽力输出客户端自身的信息如 OS 架构、Provider、版本等相关数据结构见 cmd/podman/client.go。连接管理与高级用法使用 --connection 标志切换连接Podman 远程客户端提供了--connection标志可以指定使用其他已定义的连接如果未提供该标志则使用默认连接podman-remote --connection myuser info查看system connection子命令的帮助podman-remote system connection --help通过环境变量指定连接从 cmd/podman/root.go 的setupRemoteConnection()可以看到连接的选择遵循以下优先级顺序命令行标志--connection、--url、--context、--host环境变量CONTAINER_HOST服务地址、CONTAINER_CONNECTION连接名、CONTAINER_SSHKEYSSH 身份文件containers.conf中配置的ActiveService即默认连接内置的RemoteURI兜底地址。其中--connection与--context同时使用会直接报错--host/-H仅用于 Docker 兼容属于隐藏标志--context也是为 Docker CLI 脚本兼容性提供的 NOOP 标志详见 root.go 的readRemoteCliFlags()。常用的相关根标志还包括--sshSSH 模式、--identitySSH 身份文件路径对应CONTAINER_SSHKEY、--url对应CONTAINER_HOST、--remote, -r以及 TLS 相关标志--tls-cert、--tls-key、--tls-ca。其他 connection 子命令podman system connection是一个完整的子命令组除add、list外还包括见 podman-system-connection(1)子命令作用default将指定连接设为默认remove删除指定连接rename重命名连接直接以 URL 方式连接不持久化如果不想预先保存连接也可以直接用--url指定服务地址支持ssh://、tcp://、unix://例如podman --url ssh://myuser192.168.122.1/run/user/1000/podman/podman.sock info远程模式下的限制如前文所述本地模式的引擎ABI专用命令和标志在远程模式下会被隐藏或直接报错。这是有意设计--root、--storage-driver、--runtime、--cgroup-manager等属于服务器端配置客户端无需也无法指定相关标志仅在非远程模式注册见 root.go 附近的逻辑。其余绝大多数 Podman 命令容器、镜像、Pod、网络、卷、Pod 编排等均可通过远程客户端正常使用。常见问题排查如果遇到连接或执行问题请先查阅仓库根目录的 Troubleshooting 文档。结合上文内容这里给出几个高频问题的自查要点连接失败确认服务器上已systemctl --user enable --now podman.socket且已执行sudo loginctl enable-linger $USERrootless 场景确认 sshd 已启动、端口可达。socket 路径不对rootless 用户默认是/run/user/${UID}/podman/podman.sockroot 为/run/podman/podman.sock添加连接时可通过--socket-path显式指定。SSH 认证问题优先使用ed25519密钥确认公钥已追加到服务器的~/.ssh/authorized_keys。命令不可用报错cannot use command ... with the remote podman client说明该命令/标志仅限本地模式属预期行为。小结通过 Podman 远程客户端你可以在本地轻松管理运行在 Linux 服务器上的容器。整个过程可概括为三步服务器端启用podman.socket与 sshd 并配置 SSH 密钥 →客户端执行podman system connection add建立连接首个连接自动成为默认→日常使用中所有 Podman 命令自动经 SSH 转发到远端执行。客户端与服务器的通信重度依赖 SSH强烈建议使用 SSH 密钥而非密码登录。对于多服务器场景--connection标志与CONTAINER_HOST/CONTAINER_CONNECTION环境变量则提供了灵活的连接切换能力配合podman system connection list --formatjson还可以将连接信息集成到脚本或自动化工具中。赞分享容器运行时云原生CLI【免费下载链接】podmanPodman: A tool for managing OCI containers and pods.项目地址https://gitcode.com/gh_mirrors/po/podman点击查看免费下载相关推荐LlamaIndex 结构化数据提取入门用 Pydantic 把非结构化文本变成程序可用的结构化数据LlamaIndex 结构化数据提取入门用 Pydantic 把非结构化文本变成程序可用的结构化数据 结构化数据提取Structured Data Extr容器运行时云原生CLI在 macOS 上编译 Podman 远程客户端podman-remote完整构建指南在 macOS 上编译 Podman 远程客户端podman remote完整构建指南 导读 Podman 在 macOS 上以“远程客户端remote容器运行时云原生CLIFeast Remote Offline Store基于 Arrow Flight 的远程离线存储客户端与服务端实战指南Feast Remote Offline Store基于 Arrow Flight 的远程离线存储客户端与服务端实战指南 导读 Remote OfflineMLOps后端数据工程上一篇mat-chem-sim-pred性能优化技巧内存搬运从16次减少到2次的终极秘诀下一篇解决日志碎片化难题Traefik日志流优化全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考