4534 字
23 分钟
Podman 安装指南:Rootless 容器从入门到生产就绪(2026 最佳实践)

Podman 是什么#

Podman 是一款无守护进程的容器引擎,由 Red Hat 主导开发,是 Docker 的主流替代方案。它无需常驻后台守护进程,采用 fork-exec 模型直接启动容器;默认以非 root 用户运行(Rootless),不依赖 root 权限或 docker 用户组;原生支持 Kubernetes 风格的 Pod 抽象;通过 Quadlet 实现 systemd 深度集成。

截至 2026 年 5 月,Podman 5.8 是当前主流稳定版,当前最新补丁版本为 5.8.2(2026 年 4 月 14 日发布)。Podman 6.0 测试日于 2026 年 5 月 11-15 日进行,预计随后正式发布。值得注意的架构变化:数据库后端已从 BoltDB 迁移至 SQLite,现有环境升级时会自动转换。

Podman vs Docker#

维度PodmanDocker
架构无守护进程(fork-exec)客户端-服务端(dockerd)
权限Rootless 默认,无需 root需 root 或加入 docker
systemd 集成原生(Quadlet 文件)需手动编写 unit 文件
Pod 支持原生 Kubernetes 风格不支持(需 Swarm/Compose)
攻击面较低(无持久 Socket)较高(/var/run/docker.sock
CLI 兼容dockerpodman 别名无缝替换原生
数据库后端SQLite(5.x+)BoltDB
守护进程dockerd + containerd

版本选择与系统要求#

各发行版仓库 Podman 版本#

发行版仓库版本(参考)说明
Arch Linux5.8.x滚动更新,始终最新
Fedora 415.x接近上游,dnf info podman 查看
Ubuntu 26.04 LTS5.7.xLTS 初始版本 5.7.0,安全更新持续推送
Ubuntu 24.04 LTS4.9.x需 APT Pinning 获取 5.x
Debian 13 “Trixie”5.4.xStable 仓库,apt policy podman 查看
Debian 12 “Bookworm”4.3.x需 APT Pinning 从 Trixie 拉取
RHEL / Rocky / Alma 105.6.xcontainer-tools 模块流
RHEL / Rocky / Alma 9.4+5.xAppStream 仓库
openSUSE Tumbleweed5.8.x滚动更新,zypper info podman 查看

上表为截至 2026 年 5 月的参考版本。滚动发行版版本可能更高。建议使用以下命令直接查看当前可用版本:

  • Debian / Ubuntuapt policy podman
  • RHEL / Fedoradnf info podmandnf module list container-tools
  • Archpacman -Si podman
  • openSUSEzypper info podman

推荐选择发行版官方仓库或模块流安装,确保安全补丁及时到位。

系统要求#

组件要求说明
内核≥ 5.2(推荐 5.8+)cgroups v2 于 5.2 引入
cgroupsv2(推荐)Podman 在 cgroups v2 下性能和隔离最佳
存储驱动overlayfs(rootful) / fuse-overlayfs(rootless 后备)fuse-overlayfs 是内核 overlay 不可用时的后备
网络pasta(默认 rootless)+ netavarkPodman 5.0+ 默认网络栈
数据库SQLitePodman 5.x 已从 BoltDB 迁移

fuse-overlayfs 在无内核 overlay 支持的环境(如某些 VPS、旧内核)中是 rootless 模式正常运行的关键后备。安装 Podman 时通常作为依赖自动安装。


安装方式对比#

方式适用场景优点缺点
包管理器大多数 Linux 生产环境自动更新、依赖管理、systemd 集成旧发行版可能版本偏旧
podman machinemacOS / Windows官方方案、自动管理 VM需额外资源开销
源码编译需要最新特性或定制完全可控维护成本高、需手动处理升级

本文聚焦 Linux 包管理器安装。macOS / Windows 用户参见文末补充主题。


各发行版安装#

Ubuntu#

Ubuntu 26.04 LTS —— 官方仓库直接安装#

Podman 5.7.x 已在官方仓库中,无需添加第三方 PPA:

Terminal window
sudo apt update
sudo apt install -y podman
# 可选配套工具
sudo apt install -y podman-compose # Docker Compose 替代
sudo apt install -y podman-docker # docker 命令透明别名(迁移用户推荐)
sudo apt install -y buildah # 镜像构建工具
sudo apt install -y skopeo # 镜像搬运工具
podman --version

Ubuntu 24.04 LTS —— APT Pinning 从 26.04 拉取#

Ubuntu 24.04 仓库中 Podman 停留在 4.9.x。通过 APT Pinning 从 Ubuntu 26.04 LTS(代号 resolute,2026 年 4 月 23 日发布)拉取 5.x,无需升级整个系统。

Terminal window
# 1. 添加 Ubuntu 26.04 LTS 源
echo "deb http://archive.ubuntu.com/ubuntu resolute main universe" \
| sudo tee /etc/apt/sources.list.d/ubuntu-26.list
# 2. 设置 Pin 优先级(仅 Podman 相关包从 26.04 拉取)
cat <<'EOF' | sudo tee /etc/apt/preferences.d/podman-26.pref
Package: podman buildah golang-github-containers-common crun libgpgme11t64 libgpg-error0 libsubid4 netavark passt aardvark-dns containernetworking-plugins catatonit conmon containers-storage slirp4netns
Pin: release n=resolute
Pin-Priority: 991
Package: *
Pin: release n=resolute
Pin-Priority: 400
EOF
# 3. 安装
sudo apt update
sudo apt install -y podman
# 4. 验证来源
apt-cache policy podman # 应显示 resolute 为候选

Ubuntu 22.04 LTS —— openSUSE Kubic OBS#

22.04 官方仓库 Podman 版本过旧(3.x/4.x)。openSUSE Kubic 社区仓库提供较新的构建。注意:此方案为社区维护,无官方支持承诺。

Terminal window
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_22.04/ /" \
| sudo tee /etc/apt/sources.list.d/kubic-libcontainers-stable.list
curl -fsSL "https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_22.04/Release.key" \
| sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubic-libcontainers.gpg
sudo apt update
sudo apt install -y podman

Debian#

Debian 13 “Trixie” (Stable) —— 官方仓库#

Terminal window
sudo apt update
sudo apt install -y podman

安装后确认版本:

Terminal window
apt-cache policy podman

不锁定具体小版本号——Debian Stable 在生命周期内会通过 security/update 通道推送安全修复,5.x 系列特性完整。

Debian 12 “Bookworm” —— APT Pinning 从 Trixie 拉取#

Bookworm 仓库 Podman 为 4.3.x,功能较旧(无 pasta 默认集成、无 Quadlet 完善支持)。推荐从 Trixie 拉取:

Terminal window
# 1. 添加 Trixie 源
cat <<EOF | sudo tee /etc/apt/sources.list.d/debian-trixie.sources
Types: deb
URIs: http://deb.debian.org/debian
Suites: trixie
Components: main
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
EOF
# 2. 将 Trixie 默认优先级压低
cat <<EOF | sudo tee /etc/apt/preferences.d/podman
Package: *
Pin: release n=trixie
Pin-Priority: 400
EOF
# 3. 从 Trixie 安装 podman
sudo apt update
sudo apt install -t trixie podman

Slirp4netns 后备#

Debian 用户在 pasta 出现兼容问题时,可切换回 slirp4netns 作为网络后备:

~/.config/containers/containers.conf
[network]
default_rootless_network_cmd = "slirp4netns"

RHEL / Rocky Linux / AlmaLinux#

RHEL 9.4+ / Rocky 9.4+ / Alma 9.4+ 以及 RHEL 10 / Rocky 10 / Alma 10 均通过 container-tools 模块流提供 Podman 5.x。推荐使用模块流而非 COPR 第三方仓库。

Terminal window
# 查看可用模块流
dnf module list container-tools
# 安装(RHEL 10 / Rocky 10 直接安装即可,无需启用模块)
sudo dnf install -y podman buildah skopeo
# RHEL 9 系列上如版本偏旧,可切换模块流
# sudo dnf module reset container-tools
# sudo dnf module install container-tools:latest

安装配套工具:

Terminal window
sudo dnf install -y podman-compose podman-docker

使用 dnf module list container-tools 可查看当前可用模块流及版本。

RHEL 系列上 SELinux 默认 enforcing,挂载卷时需要使用 :Z:z 标志(参见安全加固章节)。

Fedora#

Fedora 与 Podman 上游开发最贴近,官方仓库始终提供最新版本:

Terminal window
sudo dnf install -y podman buildah skopeo podman-compose podman-docker

Arch Linux#

Terminal window
sudo pacman -Syu podman podman-docker podman-compose

Arch 的 [extra] 仓库始终跟踪上游最新版(当前 5.8.x),是体验最新功能的最佳选择。

openSUSE#

Terminal window
# Tumbleweed
sudo zypper install -y podman podman-compose podman-docker
# Leap(如可用)
sudo zypper install -y podman

安装后必要配置#

1. 配置 Subordinate UID/GID 映射(Rootless 必需)#

Rootless 容器依赖用户命名空间将容器内 root 映射为宿主机普通用户。大多数系统自动分配,如果未配置会在运行时报 cannot find UID/GID

Terminal window
# 查看当前映射
grep $USER /etc/subuid /etc/subgid
# 手动配置(如未自动分配)
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER

执行后必须注销重新登录,用户命名空间映射才会生效。

2. 验证 cgroups v2#

Terminal window
podman info | grep -i cgroupVersion
# 期望输出: cgroupVersion: v2

如果输出 v1,需在 /etc/default/grub 中添加 systemd.unified_cgroup_hierarchy=1 并执行 sudo update-grub 后重启。cgroups v2 是 Podman 资源限制和监控的基础。

3. 启用 Linger(容器随系统启动)#

Rootless 容器在用户登出后默认停止。要让容器在系统启动时自动运行且不依赖登录会话:

Terminal window
sudo loginctl enable-linger $USER
loginctl show-user $USER --property=Linger
# 应输出: Linger=yes

这是 Headless 服务器上 rootless 容器开机自启的前置条件。

4. 允许非特权端口绑定#

Rootless 容器默认只能绑定 ≥1024 的端口。允许绑定低位端口:

Terminal window
sudo sysctl net.ipv4.ip_unprivileged_port_start=80
echo "net.ipv4.ip_unprivileged_port_start=80" | sudo tee /etc/sysctl.d/99-podman-ports.conf

5. 配置容器注册表短名称解析#

Podman 5.x 默认要求全限定镜像名称(如 docker.io/library/nginx:latest)。配置短名称搜索注册表:

Terminal window
# 用户级
mkdir -p ~/.config/containers
cat > ~/.config/containers/registries.conf << 'EOF'
unqualified-search-registries = ["docker.io", "quay.io"]
EOF

也可系统级配置:编辑 /etc/containers/registries.conf

6. 开启 Podman API 服务(Docker 兼容 Socket)#

Podman 提供与 Docker API 兼容的 Unix Socket,方便需要 Docker API 的工具(如 IDE 插件、docker-compose)对接:

Terminal window
# 用户级 Socket
systemctl --user enable --now podman.socket
# 验证
podman info --format '{{.Host.RemoteSocket.Path}}'
# 输出: unix:///run/user/1000/podman/podman.sock
# 设置 DOCKER_HOST 环境变量(追加到 ~/.bashrc 持久化)
export DOCKER_HOST="unix:///run/user/$(id -u)/podman/podman.sock"

7. 安装 podman-docker 实现 docker 命令透明别名(可选)#

从 Docker 迁移的用户可安装 podman-docker 包,将 docker 命令透明映射到 podman,无需改变肌肉记忆:

Terminal window
# Ubuntu / Debian
sudo apt install -y podman-docker
# RHEL / Rocky / Alma / Fedora
sudo dnf install -y podman-docker
# Arch
sudo pacman -S podman-docker

安装后 docker psdocker run 等命令自动指向 Podman。也可手动设置别名:

Terminal window
alias docker=podman

注意:podman-docker 包提供的兼容包装器不覆盖 Docker 守护进程依赖(如 Docker Desktop),它仅是 CLI 层面的透明替换。


网络配置#

Podman 5.x 的默认 rootless 网络栈由两部分组成:

pasta(外部连通性,无 NAT 默认)
+
netavark(内部网桥、veth pair、防火墙规则)
+
aardvark-dns(容器名 DNS 解析)
  • pasta:Podman 5.0+ 默认 rootless 网络后端,替代旧的 slirp4netns。pasta 默认不做 NAT,而是将宿主机 IP 复制到容器命名空间,性能更优。
  • netavark:Rust 实现的新一代网络后端,负责网桥、veth pair、防火墙规则。CNI 已弃用。
  • aardvark-dns:默认 DNS 插件,自动处理容器名到 IP 的解析。同一网络下的容器可直接用容器名互相访问。

常用网络操作#

Terminal window
# 列出网络
podman network ls
# 创建自定义网络
podman network create mynet
# 创建 IPv4/IPv6 双栈网络
podman network create --ipv6 mynet-dual
# 运行容器并指定网络
podman run -d --network mynet --name web nginx
# 容器通过 aardvark-dns 直接用名称互访
podman run --rm --network mynet alpine ping -c2 web

pasta 配置调整#

如需让 pasta 模拟旧 slirp4netns 的 NAT 行为:

~/.config/containers/containers.conf
[network]
pasta_options = ["-a", "10.0.2.0", "-n", "24", "-g", "10.0.2.2", "--dns-forward", "10.0.2.3"]

WSL2 防火墙兼容#

WSL2 内核的 nftables 不完整,可能导致 netavark 报错。修复:

~/.config/containers/containers.conf
[network]
firewall_driver = "iptables"

Quadlet:systemd 原生集成#

Quadlet 是 Podman 内置的 systemd 生成器(v4.4+)。你只需编写声明式 .container 文件,systemd 在启动或 daemon-reload 时自动生成对应的 .service unit。相比旧式 podman generate systemd,Quadlet 消除了一次性 shell 命令、避免配置漂移,并支持健康检查、自动更新、secret 管理等生产特性。

目录布局#

模式搜索路径(高优先级优先)
Rootful/run/containers/systemd//etc/containers/systemd//usr/share/containers/systemd/
Rootless$XDG_RUNTIME_DIR/containers/systemd/~/.config/containers/systemd//etc/containers/systemd/users/${UID}/

基础示例:Nginx#

创建 ~/.config/containers/systemd/nginx.container

[Unit]
Description=Nginx Web Server (Rootless Quadlet)
After=network-online.target
Wants=network-online.target
[Container]
ContainerName=nginx-web
Image=docker.io/library/nginx:1.27-alpine
PublishPort=127.0.0.1:8080:80
Volume=%h/html:/usr/share/nginx/html:Z
AutoUpdate=registry
[Service]
Restart=always
RestartSec=5
TimeoutStartSec=180
[Install]
WantedBy=default.target

启用并启动:

Terminal window
systemctl --user daemon-reload
systemctl --user start nginx.service
systemctl --user enable nginx.service

服务名与文件名对应:nginx.containernginx.service

健康检查与自动更新#

[Container]
# 注意:nginx:alpine 镜像默认不含 curl,健康检查需使用 wget 或自定义镜像
# 示例使用 wget 替代: HealthCmd=wget -q --spider http://localhost/ || exit 1
HealthCmd=curl -f http://localhost/ || exit 1
HealthInterval=30s
HealthTimeout=5s
HealthRetries=3
HealthOnFailure=kill
AutoUpdate=registry

启用自动更新定时器:

Terminal window
systemctl --user enable --now podman-auto-update.timer

podman auto-update 按定时器检查镜像仓库,发现新 digest 后自动拉取并重启容器。结合健康检查,更新失败可自动回滚。

自动更新要求使用全限定镜像名称docker.io/library/nginx:1.27-alpine),短名称 nginx 不触发检查。

podman quadlet 管理命令#

Podman 5.x 内置 podman quadlet 子命令,提供更便捷的 Quadlet 文件管理:

Terminal window
# 将 Quadlet 文件安装到系统搜索路径
podman quadlet install ~/.config/containers/systemd/nginx.container
# 列出已安装的 Quadlet 单元
podman quadlet list
# 查看生成的 systemd unit 内容(dry-run)
/usr/lib/systemd/user-generators/podman-user-generator --dry-run

Pod + 多容器组合#

# webapp.pod
[Pod]
PublishPort=8080:80
# webapp-app.container
[Container]
Image=docker.io/username/app:v1
Pod=webapp.pod
# webapp-redis.container
[Container]
Image=docker.io/library/redis:7-alpine
Pod=webapp.pod

同一个 Pod 内的容器通过 localhost 互访(Redis 在 localhost:6379),Quadlet 自动生成 webapp-pod.service 并编排依赖。

Secrets 管理#

Terminal window
# 创建 secret
echo -n 'MyS3cret!' | podman secret create db-password -
# 在 .container 中引用 —— 作为环境变量注入
Secret=db-password,type=env,target=POSTGRES_PASSWORD
# 或挂载为文件
Secret=db-password

Secrets 不会出现在 podman inspect、进程列表或 unit 文件中。

Service 依赖编排#

# app.container
[Unit]
Requires=postgres.service
After=postgres.service

引用已生成的 .service 名称即可编排启动顺序。


podman-compose#

两种方案#

方案命令特点
podman-compose(Python)podman-compose up -d成熟稳定、无守护进程、不需要 Socket
podman compose(内置)podman compose up -dPodman 5.x 内置、趋于成熟、未来主流

安装 podman-compose#

Terminal window
# Ubuntu / Debian
sudo apt install -y podman-compose
# RHEL / Rocky / Alma / Fedora
sudo dnf install -y podman-compose
# pip(通用)
pip3 install podman-compose

基本使用#

Terminal window
# 启动(兼容 docker-compose.yml)
podman-compose -f docker-compose.yml up -d
# 查看状态
podman-compose ps
# 停止
podman-compose down

podman compose 内置子命令#

Podman 5.x 的 podman compose 已趋于成熟,是未来主流方向:

Terminal window
# 启用用户 Socket 后即可使用
podman compose up -d
podman compose ps
podman compose down

当前生产环境建议 podman-compose(Python 版)更稳定。podman compose 内置子命令功能快速追赶中,日常开发使用已无障碍。

若你从 Docker 迁移且安装了 podman-dockerdocker compose 也可指向 Podman 的 Socket。设置 DOCKER_HOST 后运行:

Terminal window
export DOCKER_HOST="unix:///run/user/$(id -u)/podman/podman.sock"
docker compose up -d

安全加固#

1. Rootless 是默认安全边界#

Rootless 容器内进程在宿主机上以普通用户身份运行。即使容器内是 root,在宿主机上仅对应受约束的 UID。这是 Podman 最重要的一层防御。

2. SELinux 卷挂载标志#

Terminal window
# :Z —— 私有标签(仅当前容器可访问)
podman run -v /host/data:/data:Z nginx
# :z —— 共享标签(多个容器共享)
podman run -v /shared/config:/config:z nginx

RHEL/Fedora 上 SELinux enforcing 时,省略 :Z:z 会导致容器内权限拒绝,错误表现为静默失败(文件存在但读不到内容)。

3. 网络隔离#

Terminal window
# 无网络(最严格)
podman run --network none alpine
# 仅内部网络(容器间通信,无外网)
podman network create --internal isolated
podman run --network isolated alpine
# 绑定到 localhost 仅(不暴露到外部网络)
podman run -p 127.0.0.1:8080:80 nginx

4. Linux Capabilities 裁剪#

Terminal window
# 移除所有 capabilities 再按需添加(最小权限原则)
podman run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx

5. Podman Secrets#

敏感信息(密码、API 密钥、证书)通过 secret 注入,而非写在环境变量或挂载配置文件中:

Terminal window
echo -n 'mypassword' | podman secret create db-pass -
podman run --secret db-pass,type=env,target=POSTGRES_PASSWORD postgres

6. 禁止容器内获得新权限#

Terminal window
# 禁止通过 setuid 提权
podman run --security-opt=no-new-privileges nginx

常用命令速查#

命令用途
podman --version查看版本
podman info查看系统、存储、网络、注册表信息
podman search <term>搜索镜像
podman pull <image>拉取镜像
podman images列出本地镜像
podman run -d --name <name> -p <host>:<ctr> <image>后台运行容器
podman ps / podman ps -a查看运行中 / 所有容器
podman stop <name>停止容器
podman rm <name>删除容器
podman rmi <image>删除镜像
podman logs <name>查看容器日志
podman exec -it <name> bash进入容器 Shell
podman inspect <name>查看容器/镜像详细信息
podman cp <name>:<path> <host>容器与宿主机间复制文件
podman system prune -af清理所有未使用的镜像和容器
podman stats实时资源使用统计
podman top <name>查看容器内进程
podman network ls / create / rm管理网络
podman volume ls / create / rm管理卷
podman secret ls / create / rm管理 secrets
podman generate systemd <name>生成 systemd unit(旧方式)
podman auto-update --dry-run模拟自动更新
journalctl --user -u <service>.service -f实时查看 Quadlet 管理容器的日志

常见问题排查#

Error: cannot find UID/GID for user#

原因:未配置 subordinate UID/GID 映射。

解决

Terminal window
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER
# 注销后重新登录

短名称镜像拉取失败#

Error: short-name "nginx" did not resolve to an alias and no unqualified-search registries are defined

原因:Podman 5.x 默认要求全限定镜像名。

解决:使用 docker.io/library/nginx:latest 或配置 registries.conf(见上文安装后配置第 5 项)。

BoltDB → SQLite 自动迁移失败#

原因:Podman 5.x 升级时数据库自动迁移可能因权限或存储损坏中断。

排查

Terminal window
# 查看错误日志
journalctl --user -u podman --no-pager | grep -i "boltdb\|sqlite\|migration"
# 检查旧 BoltDB 文件(确认数据量)
ls -lh ~/.local/share/containers/storage/libpod/bolt_state.db
# 检查新 SQLite 数据库状态
podman system info | grep -i database

手动迁移

Terminal window
# 手动强制迁移数据库(首选尝试)
podman system migrate --migrate-db

如果此命令失败,再执行备份重置步骤:

Terminal window
# 备份
cp -r ~/.local/share/containers ~/.local/share/containers.backup
# 重置存储(注意:删除所有本地镜像、容器、卷)
podman system reset
# 重新拉取镜像

pasta 网络不通#

症状:容器启动后无法访问外网。

排查

Terminal window
# 确认 pasta 在运行
ps aux | grep pasta
# 测试容器内连通性
podman run --rm alpine ping -c2 8.8.8.8
# 确认防火墙未拦截
sudo nft list ruleset

临时回退到 slirp4netns

~/.config/containers/containers.conf
[network]
default_rootless_network_cmd = "slirp4netns"

端口 < 1024 绑定失败#

Error: rootlessport cannot expose privileged port 80

解决

Terminal window
sudo sysctl net.ipv4.ip_unprivileged_port_start=80

SELinux 阻止卷挂载(RHEL/Fedora)#

症状:容器内 ls /data 显示权限拒绝或空目录。

解决:卷挂载时添加 :Z(私有)或 :z(共享)标志。

podman run 后在宿主机上看不到端口监听#

原因:Rootless 容器端口绑定不走宿主机 netstat,由 pasta/netavark 在用户命名空间中代理。

验证

Terminal window
podman port <container_name>
curl http://localhost:<mapped_port>

补充主题#

Podman 在 macOS / Windows 上(podman machine)#

podman machine 是官方跨平台方案,在轻量级 Linux VM 内运行 Podman:

Terminal window
# macOS
brew install podman
podman machine init
podman machine start
# Windows(PowerShell)
winget install RedHat.Podman
podman machine init
podman machine start

之后 podman 命令从宿主机透明转发到 VM 内执行。

从 Kubernetes YAML 部署(podman kube play)#

Terminal window
# 从 Kubernetes YAML 创建 Pod
podman kube play deployment.yaml
# 生成 systemd 服务(结合 Quadlet)
podman kube play --service-container=true deployment.yaml

容器存储与卷管理进阶#

Terminal window
# 创建命名卷
podman volume create app-data
# 使用命名卷
podman run -v app-data:/data nginx
# 查看卷详情
podman volume inspect app-data

命名卷由 Podman 管理其生命周期和存储路径,比宿主机路径挂载更便携。

存储驱动选择

~/.config/containers/storage.conf
[storage]
driver = "overlay" # rootful 首选
# driver = "fuse-overlayfs" # rootless 后备
[storage.options.overlay]
mount_program = "/usr/bin/fuse-overlayfs"

SELinux 标志速查

标志含义使用场景
:Z私有标签单个容器独占的卷
:z共享标签多个容器共享的卷(如配置目录)

性能调优建议#

/etc/containers/containers.conf
# 使用 crun 运行时(C 语言实现,比 runc 更轻量)
sudo dnf install -y crun
[engine]
runtime = "crun"
# 限制容器 pid 数量(防 fork 炸弹)
podman run --pids-limit=100 nginx
# 常用性能数据
podman stats --no-stream

crun 是 Red Hat 主导的 OCI 运行时,内存占用更小,启动更快,与 Podman 配合最紧密。


总结:上线检查清单#

  • podman info 确认 cgroups v2 和 overlay 存储驱动
  • /etc/subuid/etc/subgid 已配置,注销重登录后生效
  • loginctl enable-linger 已为服务用户开启
  • registries.conf 短名称搜索注册表已配置
  • podman run --rm docker.io/library/hello-world rootless 拉取运行正常
  • 生产容器使用全限定镜像名 + 固定版本 Tag
  • 容器已迁移到 Quadlet 管理,systemctl --user enable 开机自启
  • 健康检查和自动更新已配置(适当时)
  • SELinux 卷挂载添加了 :Z / :z
  • 敏感信息通过 podman secret 注入
  • 网络默认策略最小化(仅暴露必要端口,绑定 localhost 优先)
Podman 安装指南:Rootless 容器从入门到生产就绪(2026 最佳实践)
https://blog.syomega.top/posts/podman-installation-guide/
作者
酱w
发布于
2026-05-16
许可协议
CC BY-NC-SA 4.0