Buildah/Podman 无守护容器¶
一句话概述:Podman 和 Buildah 是 Red Hat 主导的无守护进程容器工具,不需要 Docker 那样的后台 daemon 进程,更安全(可以 rootless 运行),命令与 Docker 几乎完全兼容。
核心知识点¶
| 概念 | 白话解释 |
|---|---|
| Podman | Docker 的替代品,运行容器,无需 daemon |
| Buildah | 专门构建 OCI 镜像的工具,比 docker build 更灵活 |
| Rootless | 无 root 权限运行容器(更安全) |
| Daemonless | 无守护进程 = 不需要后台跑一个服务 |
| Pod | Podman 的 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 found | DNS 插件未安装 | apt install aardvark-dns |
permission denied | SELinux 限制 | 挂载时加 :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 年