podman 可直接替代 docker 且命令一致,但无 dockerd 守护进程;rootless 模式默认使用 $home/.local/share/containers 存储,易因空间不足或 selinux 报“no space left on device”;需用 podman info 查路径,sudo podman 可切系统级存储但牺牲安全性。

Podman 可以直接替代 Docker,命令几乎完全一致,不需要改脚本、不重学 CLI,但必须理解它没有 dockerd 守护进程 —— 这是所有行为差异的根源。
podman run 为什么有时卡住或报 “no space left on device”?
这是最常见的误操作结果:用户照搬 docker run 命令,却忽略了 Podman 默认使用 rootless 模式(普通用户身份)运行容器,其存储路径在 $HOME/.local/share/containers,而该目录常位于 /home 分区,空间小且可能被 SELinux 或磁盘配额限制。
- 检查实际存储位置:
podman info --format '{{.Store.GraphRoot}}' - 若需切换到系统级存储(如
/var/lib/containers),必须用sudo podman,但会失去 rootless 安全优势 - 清理旧镜像和停止容器:
podman system prune -a(注意:rootless 模式下只清理当前用户数据) - 挂载宿主机目录时,rootless 模式默认禁止 bind mount,需加
--security-opt label=disable或提前用podman unshare配置权限
如何让现有 Docker Compose 文件无缝跑在 Podman 上?
podman-compose 是兼容层,但不是所有字段都支持;更推荐直接用 podman play kube 或原生 podman compose(v4+)。
- 确认已安装
podman-compose或启用内置支持:podman system service --time=0 &+export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/podman/podman.sock - Docker Compose v2+ YAML 中的
build.context路径必须对当前用户可读,rootless 模式下不能引用/root/或其他用户家目录 -
networks:定义会被忽略 —— Podman 默认使用slirp4netns(用户态网络),如需自定义桥接网络,得用sudo podman network create并显式指定--network - 环境变量文件
.env和env_file:支持良好,但变量内含空格或特殊字符时,务必用引号包裹
GPU 容器启动失败:nvidia-container-toolkit 不生效?
Podman 对 NVIDIA 支持依赖 nvidia-container-toolkit 配置,但和 Docker 的集成方式不同:它不走 dockerd 插件机制,而是靠 runtime 注册和 --device 显式传递。
- 必须先运行:
sudo nvidia-ctk runtime configure --runtime=podman(不是docker) - 验证配置是否写入:
cat /usr/share/containers/registries.conf.d/99-runtimes.conf应含nvidia条目 - 启动时显式声明设备:
podman run --device /dev/nvidia0 --device /dev/nvidiactl --device /dev/nvidia-uvm -it deepseek-ocr-2 - BF16 推理需确认基础镜像已安装
libcuda1和cuda-toolkit-11-8,仅装驱动不够
真正容易被忽略的是:Podman 的 rootless 模式下,/proc/sys、/sys/fs/cgroup 等路径默认不可写,哪怕加了 --privileged 也无效 —— 这类需求必须切回 sudo podman,但代价是放弃隔离性。别指望“既 rootless 又全能”。










