podman 配置文件的地图
一句话总结
如果说 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"
graphroot——存放镜像和容器层的位置。 它通常是磁盘空间的主要消耗者。runroot——运行时状态,例如锁和临时挂载。它必须位于 tmpfs,以免重启后残留的锁文件阻止容器启动。driver——rootless 模式可使用overlay(配合 fuse-overlayfs)或vfs。vfs 会为每层完整复制数据,因此速度慢、占用空间大,但兼容性最好。
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 时,检查顺序通常如下。
- 是否存在专用用户及其主目录
/etc/subuid、/etc/subgid中是否有该用户的范围- 是否安装了
newuidmap/newgidmap graphroot是否位于空间充足的分区runroot是否位于 tmpfsregistries.conf中是否配置了内部镜像和 unqualified 搜索podman info中的 rootless=true、驱动和路径是否符合预期
第 7 项是最终验证。许多团队还会解析 podman info --format json,在 CI 中自动检查。
下一项实验要做什么
为用户 podster 配置 subuid/subgid,手工计算映射,编写 storage.conf 与 registries.conf,最后用 podman info 验证全部设置。