用途
Podman 是一个无守护进程的容器引擎,用于运行和管理容器。本技能适用于以下场景:在没有 root 权限的情况下运行容器、在没有 Docker 的系统上管理容器、创建基于 Pod 的容器组、使用 systemd 管理容器,以及在对安全性有要求的环境中工作。
主要能力
Podman 与 Docker 的关键差异包括:架构上为无守护进程(Docker 为客户端-守护进程);root 权限默认可选(支持无根模式);支持 Kubernetes 风格的 Pod;原生集成 systemd;可选使用 podman.sock。
基础命令涵盖容器操作(run、ps、stop、rm、exec、logs)、镜像管理(pull、images、build、push、rmi)。
无根容器:可检查用户命名空间支持、配置 subuid/subgid、以普通用户运行容器、查看用户命名空间映射、验证非 root 运行。无根模式默认无法绑定 1024 以下端口,可使用 1024 及以上端口,或以 root 调整非特权端口起始值。
Pod:可创建 Pod、向 Pod 添加容器、列出 Pod、启停 Pod、删除 Pod、查看详情,以及从 Pod 生成 Kubernetes YAML。
systemd 集成:可为容器或 Pod 生成 systemd 单元文件,重载并启用服务;Podman 4.4+ 支持 Quadlet,通过 .container 文件声明式定义服务。
Compose 兼容:可安装 podman-compose 运行 compose 文件,或启用 podman.socket 后使用 Docker Compose。原生 Podman Kube 支持通过 podman kube play 运行 Kubernetes YAML,并用 podman kube down 停止和移除。
网络:可创建网络、将容器接入网络、列出和检查网络;同一网络内容器可通过名称进行 DNS 解析。
存储:可创建、使用、列出和检查卷;无根卷位于 ~/.local/share/containers/storage/volumes/;绑定挂载可使用 SELinux 标签(Z 为私有标签,z 为共享标签)。
注册表配置:可编辑 registries.conf 配置搜索注册表和镜像加速;使用 podman login 登录注册表,凭据存储于 ~/.config/containers/auth.json。
镜像构建:Podman 使用 Buildah 进行构建,支持指定格式、多阶段构建;也可直接使用 Buildah 命令从零创建容器并提交为镜像。
使用方式
前置条件:已安装 Podman(4.x+);无根模式需启用用户命名空间;需了解基础容器概念。
常用操作示例:
运行容器:podman run -d --name webserver -p 8080:80 nginx
列出容器:podman ps -a
停止并删除:podman stop webserver && podman rm webserver
进入容器:podman exec -it webserver /bin/sh
查看日志:podman logs -f webserver
拉取镜像:podman pull docker.io/library/nginx:latest
构建镜像:podman build -t myapp:latest .
推送镜像:podman push myapp:latest registry.example.com/myapp:latest
创建 Pod:podman pod create --name mypod -p 8080:80 -p 5432:5432
生成 systemd 单元:podman generate systemd --new --name myapp > ~/.config/systemd/user/container-myapp.service
运行 Kubernetes YAML:podman kube play deployment.yaml
适用场景
适合需要无根运行容器、在无 Docker 环境管理容器、使用 Pod 组织相关容器、通过 systemd 管理容器服务,以及在对安全性有要求的环境中工作的场景。
限制
本技能为文档型导入,上游脚本和模板未随附。指引会针对真实环境执行:应用任何操作前需确认目标、影响范围和回滚方案。未经明确批准,不得部署到生产环境。
主机变更边界:sysctl 和 subuid/subgid 命令为 Linux 示例,不适用于 macOS/Windows 的可移植设置。应先检查现有分配,切勿将同一从属 ID 范围分配给多个用户或盲目覆盖主机策略。优先使用较高的本地发布端口;降低非特权端口阈值会改变主机全局策略。为可复现性应固定可信镜像摘要,保护注册表凭据,并在运行或删除容器前检查挂载。
常见问题:权限被拒绝时,可使用 :Z 或 :z 后缀处理 SELinux 或检查所有权;无根模式端口不可访问时,使用 1024 及以上端口或配置非特权端口起始值;镜像拉取缓慢时,可在 registries.conf 中配置镜像加速;systemd 服务失败时,可启用 lingering:loginctl enable-linger $USER。
最佳实践:使用无根模式增强安全性;利用 Pod 组织相关容器;为生产环境生成 systemd 单元;使用 Quadlet 实现声明式容器服务;为绑定挂载配置 SELinux 标签;启用用户 lingering 以保持服务持久;使用 podman auto-update 自动更新;可将 docker 别名指向 podman 以保持兼容。
相关技能:docker-management(Docker 基础)、kubernetes-ops(K8s 编排)、container-hardening(安全)。