熟悉容器技术的朋友,这两年应该没少听到 Podman 这个名字。我大概从 2021 年开始在生产环境里小规模试用它,到现在已经习惯了把 Podman 作为主力容器引擎,Docker 反而降级成兼容性测试工具。如果你也受够了 Docker daemon 偶尔抽风导致所有容器一起挂掉,或者在多用户服务器上被 root 权限问题折腾得头疼,那么这篇内容就是为你准备的。我会从 Podman 最核心的设计思路讲起,然后完整走一遍在 Linux 服务器上同时安装 Docker 和 Podman、切换使用、配置镜像加速和网络参数的过程,最后把这一两年里踩过的一些坑整理成问题清单。无论你是刚接触容器的新手,还是准备迁移的老手,按着这篇文章的操作走一遍,基本能平稳落地。
1. Podman 到底是什么,解决什么问题
1.1 没有守护进程的容器引擎
很多人第一次接触 Podman 都会问一句话:它和 Docker 到底有什么区别?最直白的回答是,Docker 靠一个常驻后台的 daemon 进程管理所有容器,而 Podman 没有这个中心化的 daemon。你在命令行敲下 podman run 的时候,Podman 会直接用 fork 的方式启动一个容器进程,所有操作都由当前用户自己完成。这个差异带来的实际好处,我举一个非常典型的场景:服务器上的 Docker daemon 因为日志暴涨或者网络插件异常挂掉了,你累死累活地重启服务,然后发现原本跑着的十几个容器全部停掉了。这种情况但凡经历过一次就知道有多痛。而 Podman 每个容器进程都是独立的,互不依赖守护进程,某个容器崩溃不会拖累别的容器,系统重启之后容器也能通过 systemd 服务自动恢复,稳定性上确实踏实很多。
还有一个容易被忽视的点是安全模型。Docker 的操作基本都要通过 daemon 来完成,这个 daemon 通常是 root 权限运行的,等于你每次执行 docker ps 都是在向一个特权进程请求服务。Podman 的 rootless 模式让普通用户也能直接管理自己的容器,不需要给用户 sudo 权限。这种设计在多租户服务器上特别实用,团队里每个人各自创建自己的容器,互不干扰,也不会出现某人删了别人的容器这种事故。
1.2 与 Docker 的兼容性和差异化定位
我见过不少人听到“Podman 兼容 Docker”这句话后,以为 Podman 能直接无缝替换 Docker,然后一执行 docker-compose up 就发现不对劲。这里得把兼容性的边界说清楚。Podman 的命令行接口和 Docker 高度一致,run、ps、exec、logs、build 这些核心操作你几乎感觉不到差别,甚至可以直接通过设置环境变量 export DOCKER_HOST=unix:///run/user/$(id -u)/podman/podman.sock,让 Docker CLI 去连接 Podman 的 socket。我自己实测过,大部分 docker 命令都能正常执行,很多 CI 工具也能直接复用。
但说到 docker-compose,完整替代还差一点火候。Podman 官方推荐用 podman-compose 或者 Quadlet 方案,虽然日常的 volume、network、环境变量配置能兼容大部分场景,但一些冷门的 compose 语法还是有差异的。所以我的建议是:个人开发环境、单容器部署、生产服务托管,直接用 Podman;但如果你深度依赖 Docker Compose,并且在团队协作中对 compose 文件的通用性要求很高,那就保留 Docker 作为补充工具,互相配合使用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 安装 Docker 和 Podman 的完整实操
2.1 系统准备与安装步骤
我这次演示用的是一台全新安装的 Ubuntu 22.04 LTS 服务器,干净的系统最适合用来梳理完整的安装流程。无论你是准备安装 Docker 还是 Podman,第一步都是一样的:更新系统软件包索引,确保依赖环境没问题。
bash复制sudo apt update && sudo apt upgrade -y
接下来安装 Podman。Ubuntu 22.04 官方软件源里其实已经带了 Podman,不过版本偏旧,我建议用一种更省心也比较稳妥的方式,直接用官方源安装,确保拿到的是当前稳定版:
bash复制sudo apt install -y podman
podman --version
我在另一台 CentOS 9 的机器上用的是 dnf install podman,步骤差不多,这里就不展开多写了。安装完先不要急着创建容器,建议马上做两件事:第一,检查 containers.conf 配置文件中 cgroup manager 是否设置正确,我这边用的是 systemd,如果你的系统初始化
