三者对比

维度DockerPodmanContainerd
架构C/S 架构,dockerd 守护进程无守护进程,fork/exec 模型嵌入式运行时,无独立 CLI
CLI 兼容性原生 docker 命令兼容 docker 命令(alias docker=podman)ctr/nerdctl(nerdctl 兼容 docker)
守护进程需要 dockerd 运行不需要守护进程作为库嵌入容器平台
Rootless支持(需配置)原生支持(默认 rootless)支持(需配置)
镜像管理docker pull / pushpodman pull / pushctr / nerdctl pull
Compose 支持docker compose(内置)podman-compose(外部工具)nerdctl compose
Kubernetes 集成需配置(已弃用 dockershim)podman generate kube原生 CRI 接口
社区生态最成熟,文档最全Red Hat 主导,RHEL 默认K8s 默认运行时

推荐使用场景

Docker — 开发/学习首选

生态最成熟,文档最全,Compose 集成最好。本地开发、CI/CD、学习容器技术的最佳选择。

Podman — 无守护进程安全场景

无需 root 权限运行容器,适合安全要求高的生产环境。RHEL/CentOS 默认容器工具。

Containerd — Kubernetes 运行时

作为 K8s 的 CRI 运行时,轻量高效。nerdctl 提供了 docker 兼容的 CLI 体验。

命令映射表

DockerPodmannerdctl
docker run -d nginxpodman run -d nginxnerdctl run -d nginx
docker pspodman psnerdctl ps
docker build -t app .podman build -t app .nerdctl build -t app .
docker pull nginx:alpinepodman pull nginx:alpinenerdctl pull nginx:alpine
docker compose up -dpodman-compose up -dnerdctl compose up -d
docker imagespodman imagesnerdctl images
docker exec -it app shpodman exec -it app shnerdctl exec -it app sh
docker logs apppodman logs appnerdctl logs app

Compose 还是 K8s?

这两个不是同层的替代品——Compose 管的是「单台机器上一组容器怎么启动」,K8s 管的是「一批容器在多台机器上始终以什么状态运行」。选型的关键不是哪个更先进,而是你有几台机器、痛点是哪几个。

维度Docker ComposeKubernetes
作用范围单台机器多节点集群
配置方式一个 compose.yaml一组 YAML(Deployment / Service / ConfigMap …)
自愈restart: always,仅限同一台机器控制器跨节点重建,节点失联也能迁走
滚动发布与回滚需手工编排,存在中断窗口Deployment 原生滚动更新,回滚是一条命令
学习与运维成本低,一个文件搞定高,还需网络 / 存储 / 入口 / 可观测性等配套
适合单机、少量服务、本地开发、个人项目多机调度、自动扩缩、要求不停机发布的场景
💡 一句话:机器只有一台、服务只有几个,Compose 就是最优解。只有当「自愈、调度、滚动发布、声明式收敛」这四件事同时成为你的真实痛点时,K8s 的复杂度才划算——展开的对照与判据见 Kubernetes 入门。