跳转至

Buildah/Podman 无守护容器

一句话概述:Podman 和 Buildah 是 Red Hat 主导的无守护进程容器工具,不需要 Docker 那样的后台 daemon 进程,更安全(可以 rootless 运行),命令与 Docker 几乎完全兼容。

核心知识点

概念白话解释
PodmanDocker 的替代品,运行容器,无需 daemon
Buildah专门构建 OCI 镜像的工具,比 docker build 更灵活
Rootless无 root 权限运行容器(更安全)
Daemonless无守护进程 = 不需要后台跑一个服务
PodPodman 的 Pod 概念,类似 K8s Pod,多个容器共享网络
OCI开放容器倡议 = 容器镜像/运行时的行业标准

安装配置

# Ubuntu/Debian
sudo apt install podman buildah  # 安装 Podman 和 Buildah

# CentOS/RHEL/Fedora
sudo dnf install podman buildah  # 安装

# macOS
brew install podman  # 安装 Podman
podman machine init  # 初始化虚拟机
podman machine start  # 启动

# 验证
podman version  # 查看版本
podman info  # 查看详细信息

# Docker 兼容(alias 大法)
alias docker=podman  # 设置别名,docker 命令自动走 podman

基本使用

Podman(运行容器)

# 基本操作(和 Docker 命令一样)
podman pull nginx  # 拉取镜像
podman run -d --name web -p 8080:80 nginx  # 运行容器
podman ps  # 查看运行中的容器
podman logs web  # 查看日志
podman stop web  # 停止
podman rm web  # 删除

# Rootless 运行(无需 sudo,更安全)
podman run --rm -it python:3.12 python  # 普通用户直接运行

# Pod 管理(类似 K8s Pod)
podman pod create --name mypod -p 8080:80  # 创建 Pod
podman run -d --pod mypod nginx  # 在 Pod 中运行 nginx
podman run -d --pod mypod redis  # 同一 Pod 中运行 redis(共享网络)
podman pod ps  # 查看 Pod

# 生成 Kubernetes YAML
podman generate kube mypod > pod.yaml  # 从 Podman Pod 生成 K8s YAML
podman play kube pod.yaml  # 从 K8s YAML 启动 Pod

Buildah(构建镜像)

# 方式1:用 Dockerfile 构建(和 docker build 一样)
buildah build -t myapp:latest .  # 从 Dockerfile 构建

# 方式2:脚本式构建(Buildah 独有,更灵活)
ctr=$(buildah from ubuntu:22.04)  # 从基础镜像创建容器
buildah run $ctr -- apt-get update  # 在容器中执行命令
buildah run $ctr -- apt-get install -y python3  # 安装 Python
buildah copy $ctr ./app /app  # 复制文件到容器
buildah config --cmd "python3 /app/main.py" $ctr  # 设置启动命令
buildah commit $ctr myapp:latest  # 提交为镜像
buildah rm $ctr  # 删除构建容器

Podman Compose

# 安装 podman-compose
pip install podman-compose  # 安装

# 使用(和 docker compose 一样)
podman-compose up -d  # 启动
podman-compose down   # 停止

高级用法

Systemd 集成(开机自启)

# 为容器生成 systemd 服务文件
podman generate systemd --new --name web > ~/.config/systemd/user/container-web.service
systemctl --user enable container-web.service  # 设置开机自启
systemctl --user start container-web.service   # 启动

常见报错

报错信息原因解决方法
WARN: aardvark-dns not foundDNS 插件未安装apt install aardvark-dns
permission deniedSELinux 限制挂载时加 :Z 后缀
rootless: cannot find UID/GID用户命名空间配置检查 /etc/subuid/etc/subgid
Error: short-name resolution镜像名不明确用完整名如 docker.io/library/nginx

速查表

# === Podman vs Docker 命令对照 ===
# docker run  →  podman run    (完全相同)
# docker build → podman build  (完全相同)
# docker ps   →  podman ps     (完全相同)
# docker-compose → podman-compose(基本相同)

# === Podman 独有 ===
podman pod create              # 创建 Pod
podman generate kube <pod>     # 生成 K8s YAML
podman play kube <file>        # 从 K8s YAML 启动
podman generate systemd <ctn>  # 生成 systemd 服务

# === Buildah 独有 ===
buildah from <image>           # 开始构建
buildah run <ctr> -- <cmd>     # 构建中执行命令
buildah copy <ctr> <src> <dst> # 复制文件
buildah commit <ctr> <image>   # 提交镜像

# === 关键区别 ===
# Docker: 需要 daemon(后台服务)
# Podman: 无 daemon,每个容器独立进程
# Docker: 默认需要 root
# Podman: 原生支持 rootless
# Docker: Docker Hub 默认仓库
# Podman: 需要指定仓库(或配置 registries.conf)

参考:Podman 文档 | Buildah 文档 | 更新于 2026 年