LabHub
学习 学习路径 课程

Rootless Podman 运维

podman 配置文件的地图

在 LabHub 中继续学习

一句话总结

如果说 Docker 把配置集中在一个 daemon.json 中,那么 Podman 则把配置按职责拆分到多个文件,并且用户级配置会覆盖系统级配置

概念图: 按职责拆分到多个文件 · 用户级配置会覆盖系统级配置 · 用户级文件会覆盖系统级文件。 · 存放镜像和容器层的位置。

为什么需要理解这一点

从 Docker 迁移过来的人,最先困惑的通常就是这里:“注册表镜像写在哪里?”“存储路径到哪里修改?”Podman 没有守护进程,自然也没有 daemon.json

它如何工作

docker                          podman
──────────────────────────      ───────────────────────────────────────
/etc/docker/daemon.json         /etc/containers/containers.conf   (엔진·런타임 옵션)
                                ~/.config/containers/containers.conf
(레지스트리 미러도 daemon.json)  /etc/containers/registries.conf   (레지스트리·미러·차단)
                                ~/.config/containers/registries.conf
                                /etc/containers/storage.conf      (스토리지 드라이버·경로)
                                ~/.config/containers/storage.conf
                                /etc/containers/policy.json       (이미지 서명 정책)
~/.docker/config.json (인증)     ~/.config/containers/auth.json    (레지스트리 인증)

이미지·컨테이너 저장 위치
/var/lib/docker                 rootful:  /var/lib/containers/storage
                                rootless: ~/.local/share/containers/storage

用户级文件会覆盖系统级文件。 因此,rootless 模式的配置大多位于 ~/.config/containers/ 下。

storage.conf

[storage]
driver = "overlay"
runroot = "/run/user/1000/containers"
graphroot = "/home/podster/.local/share/containers/storage"

[storage.options]
additionalimagestores = []

[storage.options.overlay]
mount_program = "/usr/bin/fuse-overlayfs"

registries.conf

unqualified-search-registries = ["docker.io"]

[[registry]]
prefix = "docker.io"
location = "mirror.internal.example.com/dockerhub"

[[registry]]
location = "blocked.example.com"
blocked = true

unqualified-search-registries 是 Podman 与 Docker 的典型差异。 Docker 会自动把 nginx 解释为 docker.io 上的镜像,而 Podman 会遵循配置,或询问要使用哪个注册表。对于 CI 脚本,直接写成 docker.io/library/nginx 这样的完整路径最稳妥。

containers.conf

这个文件定义引擎默认值,例如默认 OCI 运行时(crun/runc)、默认网络后端(netavark/cni)、默认 cgroup 管理器和默认环境变量等。

[engine]
runtime = "crun"
cgroup_manager = "cgroupfs"

[containers]
default_ulimits = ["nofile=65535:65535"]

如果 rootless 环境没有 systemd,或没有获得 cgroup 委派,就应设置 cgroup_manager = "cgroupfs"

在实际项目中

初始配置检查清单。 在新服务器上部署 rootless Podman 时,检查顺序通常如下。

  1. 是否存在专用用户及其主目录
  2. /etc/subuid/etc/subgid 中是否有该用户的范围
  3. 是否安装了 newuidmap/newgidmap
  4. graphroot 是否位于空间充足的分区
  5. runroot 是否位于 tmpfs
  6. registries.conf 中是否配置了内部镜像和 unqualified 搜索
  7. podman info 中的 rootless=true、驱动和路径是否符合预期

第 7 项是最终验证。许多团队还会解析 podman info --format json,在 CI 中自动检查。

下一项实验要做什么

为用户 podster 配置 subuid/subgid,手工计算映射,编写 storage.confregistries.conf,最后用 podman info 验证全部设置。