Linux如何安装和配置Podman:无守护进程容器工具详解

对于大多数现代Linux用户来说,安装Podman其实可以变得非常简单。尤其是Ubuntu 20.04 LTS及之后的版本,官方软件源已经收录了Podman,这意味着你不再需要折腾第三方仓库或者手动编译。简单来说:直接使用apt包管理器就能上手。当然,如果你使用的是老版本系统或其他发行版,确实需要额外步骤,但先别急着去GitHub拉取源码,很多时候有更稳妥的选择。
Ubuntu上安装Podman:用apt最稳,别绕弯路
如果你是Ubuntu用户,那么恭喜,安装Podman最直接、最可靠的方法就是通过系统自带的包管理器。为什么这样说?因为官方源中的podman包已经针对当前系统的内核版本、cgroups配置以及网络组件(如slirp4netns)做了充分适配,特别是在无根(rootless)模式支持上,比手动安装的版本稳定得多。
具体操作只需几步:
- 打开终端,运行
sudo apt update && sudo apt install podman,一气呵成完成安装。 - 验证是否安装成功:输入
podman --version。正常情况下,你应该会看到类似podman version 4.9.4的输出(以2026年的主流版本为例)。 - 万一提示找不到包,先别慌张。检查一下你的系统版本,运行
lsb_release -sc。只要输出是focal(20.04)、jammy(22.04)或noble(24.04),都原生支持。
这里有一个常见的“坑”需要特别提醒:不推荐使用那些 curl | bash 的一键安装脚本。这类脚本容易引入未签名的二进制文件,而且绕过了系统的包管理机制,日后升级或卸载都会变得麻烦。
rootless模式失败?请检查 /etc/subuid 和 /etc/subgid
Podman默认会尝试以无根模式运行,安全性更高。但很多用户第一次执行 podman run hello-world 时,可能会遇到 cannot find UID/GID for user 这样的报错。这背后的根源,其实是系统内核没有为你的用户账户分配独立的用户/组ID映射范围。
解决办法很明确:
- 执行命令:
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER,为用户添加子ID范围。 - 然后确认一下:运行
grep $USER /etc/subuid /etc/subgid,应该能看到两行输出,格式类似youruser:100000:65536。 - 操作完成后,需要重启当前的登录会话(注销再登录),或者运行
newgrp $USER来刷新组权限。
如果问题依然存在,并且报错提到了 slirp4netns not found,那可能是缺少了这个网络依赖。直接安装即可:sudo apt install slirp4netns(在Ubuntu 24.04及之后版本中,它通常已经是默认安装的一部分)。
podman pull拉不到镜像?先别急着换 registry
当你兴冲冲地使用 podman pull 想拉取镜像,却卡在 Getting image source signatures 这一步时,先别急着怀疑网络或更换镜像仓库。这往往不是证书问题,而是Podman默认启用了镜像签名验证策略(signature_policy),而你要拉取的镜像恰好没有提供签名。
怎么解决呢?有几个思路:
- 临时方案(仅用于调试):在命令前加上环境变量,如
POLICY=skip podman pull nginx,跳过策略检查。 - 永久修改(调整全局策略):编辑配置文件
/etc/containers/policy.json,将"default"部分替换为[{"type": "insecureAcceptAnything"}]。这意味着接受任何来源的镜像,请权衡安全风险。 - 更精细的控制:只对特定的镜像仓库关闭验证。这需要编辑
/etc/containers/registries.d/default.yaml,为指定仓库添加insecure: true配置。
另外,关于登录凭证有一个关键区别:Podman的登录信息默认存储在 $HOME/.config/containers/auth.json,而不是Docker使用的 ~/.docker/config.json。因此,你之前的Docker登录凭证并不能直接拿来使用。
podman run启动容器后立即退出?检查CMD和前台进程
这个问题是不是很眼熟?和Docker一样,podman run 命令只是启动容器内定义的主进程。一旦这个主进程执行完毕,容器自然就退出了。常见于直接运行一个bash终端,或者一个执行完就结束的Python脚本。
可以这样应对:
- 如果是想交互式调试,记得加上
-it参数:podman run -it ubuntu:22.04 bash。 - 如果要运行一个后台服务(比如Nginx),必须确保该服务在前台运行。例如,命令应该是
nginx -g "daemon off;",而不是在容器内执行service nginx start(这会让服务转入后台,导致主进程结束)。 - 如果使用包含systemd的镜像,需要添加
--systemd=true参数,并确保镜像中的/sbin/init是可执行的。 - 注意无根模式的网络限制:普通用户无法绑定1024以下的端口。所以
podman run -p 80:8080会失败,应该改用-p 8080:80。使用net=host共享主机网络可以绕过,但一般不推荐,因为它会降低隔离性。
话说回来,还有一个真正容易被忽略的细节:rootless容器与cgroup v2的兼容性。Ubuntu 22.04+ 默认使用cgroup v2,但某些旧内核或自定义内核可能没有开启统一层级(unified_cgroup_hierarchy)。这会导致 podman info 显示 cgroupVersion: v1,此时无根模式可能会静默降级,表现出类似有根模式的行为。因此,务必运行 podman info | grep cgroup 来确认当前的环境,这才是避免后续各种权限问题的关键所在。
