rockylinux9 podman实现rootless运行容器
在Rocky Linux 9 上,通过 Podman 实现 rootless(无特权用户)部署 是原生支持且稳定可靠的解决方案。
一、为什么选择 Podman?
- Podman 是 Red Hat 开发的无守护进程容器引擎,本身即支持 rootless 容器运行,不依赖
root权限。 - CLI 几乎完全兼容 Docker,因此大多数
docker命令可直接替代使用。 - 与 systemd 集成优异,推荐通过 Quadlet 或
podman generate systemd管理容器服务。
二、安装 Podman (Rocky Linux 9)
更新系统包:
1
sudo dnf update -y
安装 Podman:
1
sudo dnf install -y podman
Podman 默认包含在 AppStream 源中,无需额外启用 EPEL 仓库。
验证版本,示例:
1
2podman --version
# 输出类似:podman version 5.x.x
三、Rootless 默认支持
- 以非 root 用户运行
podman run ...即为 rootless 模式,无需额外配置。 - 用户级存储位于
~/.local/share/containers/storage。 - 无守护进程方式,更安全、更轻量。
四、systemd 集成与 Quadlet
Podman 支持两种方式将容器管理为 systemd 服务:
(推荐方式) 使用 Quadlet
Quadlet 是从 Podman 4.4 起集成的 systemd 生成器。
可以在用户配置目录创建
.container文件,例如:1
2
3
4
5
6
7
8~/.config/containers/systemd/myapp.container
[Container]
Image=nginx:latest
PublishPort=8080:80
[Install]
WantedBy=default.target然后运行:
1
2systemctl --user daemon-reload
systemctl --user enable --now myapp.service这样可以让容器在用户登录时自动启动,也支持
loginctl enable-linger保持持续运行。
使用 podman generate systemd(已弃用)
- 曾可用于生成
.service单元文件,但现在官方建议改用 Quadlet 。
五、常见 issues 与兼容性提示
- Rocky Linux 9.2 曾有用户在 rootless Podman 启动失败,出现
crun: setgroups: Invalid argument,建议首次尝试在普通用户 SSH Session 下运行容器,不要用sudo -u切换用户执行时启动容器 ([Rocky Linux Forum][5])。 - 若挂载 CIFS/SMB 共享目录时出现 SELinux relabel 错误(如加
:Z时),可尝试在宿主系统 fstab 中指定正确 SELinux 上下文,或者移除:Z参数 ([Reddit][6])。 - 若
podman-compose工具需要使用,需要从 EPEL 仓库安装;AppStream 中并未包含该包 ([Rocky Linux Forum][7])。
六、快速部署示例
1 | # 安装(上面已执行) |
创建 Quadlet 服务
1 | cat > ~/.config/containers/systemd/nginx-container.container << 'EOF' |
此时服务将自动随用户登录启动。
七、总结
| 项目 | 建议说明 |
|---|---|
| 安全与简洁 | Podman rootless 是天然支持的,无需 root 权限,daemonless 架构更安全 |
| systemd 管理 | 使用 Quadlet 推荐方式管理 rootless 容器服务 |
| SELinux 兼容 | CIFS 与 SELinux relabel 需额外配置,避免报错 |
| podman-compose | 若使用 docker-compose 文件,需启用 EPEL 并安装 podman-compose |
| Cgroup & storage | 默认 rootless 存储路径在用户 Home 下,可按需调整并设置权限与 SELinux 标注(可参考社区方案) |