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. 更新系统包:

    1
    sudo dnf update -y
  2. 安装 Podman:

    1
    sudo dnf install -y podman

    Podman 默认包含在 AppStream 源中,无需额外启用 EPEL 仓库。

  3. 验证版本,示例:

    1
    2
    podman --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
    2
    systemctl --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
2
3
4
5
6
7
# 安装(上面已执行)
sudo dnf install -y podman

# 运行容器(非 root)
podman run -d --name my-nginx -p 8080:80 nginx:alpine

# 指定端口后主机访问 8080 即可访问 nginx

创建 Quadlet 服务

1
2
3
4
5
6
7
8
9
10
11
cat > ~/.config/containers/systemd/nginx-container.container << 'EOF'
[Container]
Image=nginx:alpine
PublishPort=8080:80

[Install]
WantedBy=default.target
EOF

systemctl --user daemon-reload
systemctl --user enable --now nginx-container.service

此时服务将自动随用户登录启动。


七、总结

项目 建议说明
安全与简洁 Podman rootless 是天然支持的,无需 root 权限,daemonless 架构更安全
systemd 管理 使用 Quadlet 推荐方式管理 rootless 容器服务
SELinux 兼容 CIFS 与 SELinux relabel 需额外配置,避免报错
podman-compose 若使用 docker-compose 文件,需启用 EPEL 并安装 podman-compose
Cgroup & storage 默认 rootless 存储路径在用户 Home 下,可按需调整并设置权限与 SELinux 标注(可参考社区方案)