Podman 快速使用
这篇文章面向“快速上手”,覆盖 Podman 的核心概念与常用命令,并补充一些容易踩坑的点(尤其是 rootless 与 macOS/Windows 的 machine)。
1. Podman 是什么
Podman(POD Manager)是一个 无守护进程(daemonless) 的容器与镜像管理工具,用来运行、构建和管理 OCI(Open Container Initiative) 兼容的容器和镜像。整体定位接近 Docker CLI,但实现方式与能力边界略有不同:
• 无守护进程:不需要类似 dockerd 的常驻后台服务。Podman 命令执行时会通过 fork/exec 直接创建容器进程。
• 支持 Rootless:普通用户即可运行容器(更安全),但网络、端口映射、权限等会有一些限制与注意事项。
• Docker CLI 兼容:大多数命令参数可直接替换使用(如 docker run → podman run)。
• Pod 概念:支持将多个容器放入同一 Pod 共享网络(类似 Kubernetes 的 Pod),并会创建一个 infra 容器来维持命名空间。
• 镜像标准:完全兼容 OCI 镜像格式,可直接拉取 Docker Hub 等镜像仓库的镜像。
小提示:如果你只是想“把 Docker 命令换成 Podman”,可以先从 podman 常用命令 + podman machine(非 Linux)开始。
2. 基础命令(镜像 / 容器)
# 版本与帮助
podman --version
podman --help
podman run --help
# 镜像:搜索、拉取、查看
podman search nginx
podman pull docker.io/library/nginx:latest
podman images
podman image inspect nginx
# 容器:运行、查看、日志、进入
podman run -d --name mynginx -p 8080:80 nginx
podman ps
podman ps -a
podman logs -f mynginx
podman exec -it mynginx sh # nginx 镜像通常没有 bash
# 生命周期:停止/启动/重启/删除
podman stop mynginx
podman start mynginx
podman restart mynginx
podman rm mynginx
# 删除镜像
podman rmi nginx补充几个高频命令:
# 容器详细信息(端口、挂载、网络等)
podman inspect mynginx
# 查看端口映射
podman port mynginx
# 资源占用
podman stats
# 一次性清理已退出的容器(谨慎)
podman container prune3. Pod 概念与用法
Podman 的 Pod 允许多个容器共享 网络 / IPC /(可选)PID 等命名空间。典型用法是把强耦合的容器(如 web + redis)放到同一个 Pod。
# 创建 Pod,并做端口转发(转发到 Pod 的共享网络命名空间)
podman pod create --name mypod -p 8080:80
# 向 Pod 中添加容器
podman run -d --pod mypod --name web nginx
podman run -d --pod mypod --name cache redis
# 查看 Pod 与容器
podman pod ps
podman ps -a --pod
# 停止 / 启动 Pod
podman pod stop mypod
podman pod start mypod
# 删除 Pod(通常会连带删除 Pod 内容器;可加 -f 强制)
podman pod rm mypod注意点:
• Pod 会有一个 infra 容器(类似 pause 容器)用来维持 Pod 的命名空间。
• Pod 的端口映射通常挂在 Pod 上(podman pod create -p ...),更直观。
4. Rootless 模式(普通用户运行容器)
Rootless 让容器以普通用户权限运行,更安全,但会引入一些常见差异:
# 以当前普通用户运行交互式容器
podman run --rm -it alpine sh常见注意事项:
• 低端口映射限制:在许多系统上,rootless 直接绑定 80/443 这类低端口会受限。建议映射到高端口(如 8080/8443),或按系统能力配置后再做低端口绑定。
• 网络后端差异:rootless 网络通常依赖 slirp4netns 或 pasta/passt 等用户态网络组件。若发现 -p 端口转发不可用或性能偏低,优先检查这些依赖与版本。
• UID/GID 映射:rootless 依赖 /etc/subuid 与 /etc/subgid 的映射范围;如果你(或管理员)手动改了它们,通常需要运行:
podman system migrate5. 构建镜像(Containerfile / Dockerfile)
Podman 可以直接构建 OCI 镜像,语法与 Docker 非常接近:
# -t: tag
# . : Containerfile/Dockerfile 所在目录
podman build -t myimage:latest .
# 查看构建出的镜像
podman images | head6. 一个最小工作流(从拉取到运行)
# 拉取镜像
podman pull nginx
# 运行容器
podman run -d --name web -p 8080:80 nginx
# 查看运行状态
podman ps
# 查看日志
podman logs -f web
# 进入容器(注意:很多镜像只有 sh)
podman exec -it web sh
# 停止与清理
podman stop web
podman rm web7. Podman VM(macOS / Windows 的 podman machine)
在非 Linux 平台(macOS / Windows)上,Podman 需要通过一个轻量虚拟机提供 Linux 内核环境,podman machine 用来管理这个虚拟机。
# 初始化(创建一台 VM)
podman machine init
# 启动 / 停止
podman machine start
podman machine stop
# 列出 VM
podman machine list
# SSH 进入 VM
podman machine ssh
podman machine ssh "cat /etc/os-release"
# 查看详细信息
podman machine inspect
# 删除 / 重置
podman machine rm
podman machine reset
# 动态修改资源
podman machine set --cpus=4 --memory=8192常见注意事项:
• macOS/Windows 下的容器实际运行在 VM 内,文件挂载、网络、性能表现 与 Linux 原生会有差异。
• 如果你同时装了 Docker Desktop,注意避免 CLI/上下文混淆(尤其是端口占用与环境变量)。
8. (可选)把 Docker 命令“无缝替换”为 Podman
如果你只想快速迁移命令习惯,可以考虑:
# 用 podman-docker 包(部分发行版提供)或手动别名
alias docker=podman
# 验证
podman info说明:不同系统对 podman-docker 支持与行为可能略有差异;团队环境建议明确写在 README 或开发环境脚本里,避免误会。