什么是 Podman?

Podman 最突出的特性是支持 rootless 容器——即普通用户无需 root 权限即可运行和管理容器。从安全角度看,即使容器被攻击者攻破,也无法获得宿主机的 root 权限,有效缩小了攻击面。

注:Docker 也支持 rootless 模式,但需要额外配置且存在功能限制。

与 Docker 不同,Podman 采用 daemonless(无守护进程)架构,不依赖后台守护进程,而是直接通过 runc 与 Linux 内核交互。这意味着:

  • 不存在单点故障风险(守护进程崩溃不会影响容器)
  • 容器进程由用户直接管理,而非被守护进程接管

此外,Podman 天然支持多用户隔离。例如 Linux 系统中 user-a 和 user-b 分别创建的容器彼此不可见、不可修改,无需额外配置即可实现严格的权限边界。

安装 Podman

Ubuntu/Debian

sudo apt-get install runc -y
sudo apt-get install podman -y

CentOS/RHEL

sudo yum install podman -y
# 或使用 DNF
sudo dnf install podman -y

macOS

brew install podman
podman machine init    # 初始化 QEMU 虚拟机
podman machine start   # 启动虚拟机

注意:Windows 和 macOS 因内核限制,需通过虚拟机运行容器;Linux 原生支持体验最佳。

基础容器操作

Podman 命令与 Docker 高度兼容,只需将 docker 替换为 podman 即可:

# 拉取镜像(建议显式指定 registry)
podman pull docker.io/nginx
podman pull quay.io/quay/busybox

# 运行容器(rootless 模式)
podman run --name my-nginx -p 8080:80 docker.io/nginx

⚠️ 重要限制:rootless 模式下无法绑定 1024 以下端口(如 80/443)。若需映射低位端口,必须使用 sudo:

sudo podman run -d --name my-nginx -p 80:80 nginx

常用管理命令

podman ps              # 列出运行中容器
podman ps -a           # 查看所有容器
podman logs my-nginx   # 查看日志
podman exec -it my-nginx sh  # 进入容器
podman stop my-nginx   # 停止容器
podman rm my-nginx     # 删除容器

Pod 管理:Kubernetes 风格的多容器编排

Podman 原生支持 Pod 概念——多个容器共享网络和存储命名空间的逻辑单元,与 Kubernetes 完全兼容。

创建空 Pod

podman pod create --name demo-pod
podman pod ls          # 列出所有 Pod
podman ps -a --pod     # 查看 Pod 内容器(含 infra 容器)

创建空 Pod 时,Podman 会自动添加一个 k8s.gcr.io/pause infra 容器用于维持命名空间。

向 Pod 添加容器

# 向现有 Pod 添加 Nginx 容器
podman run -dt --pod demo-pod nginx

一键创建 Pod 与容器

# 创建名为 frontend 的 Pod 并添加 Nginx 容器
podman run -dt --pod new:frontend -p 8080:80 nginx

与 Kubernetes 无缝集成

Podman 支持双向转换:既可从本地 Pod 生成 Kubernetes YAML,也可用 YAML 部署 Pod。

# 1. 创建 Pod
podman run -dt --pod new:webserver -p 8080:80 nginx

# 2. 生成 Kubernetes YAML
podman generate kube webserver > webserver.yaml

# 3. 查看生成的 YAML(简化示例)
apiVersion: v1
kind: Pod
meta
  name: webserver
spec:
  containers:
  - name: nginx
    image: docker.io/library/nginx:latest
    ports:
    - containerPort: 80
      hostPort: 8080

生成的 YAML 可直接用于 Kubernetes 集群部署,实现本地开发与生产环境的一致性。

总结

Podman 以 daemonless 架构和开箱即用的 rootless 支持,在安全性与可靠性上优于传统 Docker。其原生 Pod 支持与 Kubernetes 无缝衔接,特别适合注重安全的生产环境及需要与 K8s 保持一致的开发场景。对于 Red Hat 系发行版用户,Podman 已成为默认容器工具;随着 rootless 容器成为行业最佳实践,Podman 正逐步走向主流。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐