什么是 Podman?能否替代 Docker?Podman 快速入门

什么是 Podman

Podman(POD Manager)是一个开源的无守护进程(daemonless)容器引擎,用于管理容器、容器镜像、容器卷和网络。

它兼容 OCI 标准,可以运行 Docker 镜像,并且设计上与 Docker CLI 命令高度兼容。

podman logo

Podman 的特点与优势

  • Daemonless 进程,更轻

Podman 直接使用 RunC(或其他符合 OCI 的运行时)来创建和运行容器。每个容器都是当前用户的一个子进程。

基于 Daemonless 能够提供更安全(减少攻击面)、更稳定(守护进程崩溃不影响现有容器)、资源消耗更低、更符合 Linux 进程模型。

对比 Docker,依赖于一个长期运行的后台进程 (dockerd) 来管理容器。

  • Rootless 容器,更安全

普通用户无需 sudo 或 root 权限即可直接启动和管理容器。

极大提升安全性(容器进程以用户权限运行,即使容器被攻破,影响范围也限于该用户)、满足更严格的安全合规要求、允许多用户在同一系统上安全地管理各自的容器。

对比 Docker,目前也支持 Rootless 容器,但需要进行特殊配置,且默认仍然需要 root 权限。

  • 基于标准设计,兼容好

Podman 支持 OCI 标准,且与 Docker 兼容,大部分命令与 Docker 命令相同。

Docker 用户迁移成本小,学习曲线低,现有脚本通常只需替换命令即可工作。

  • Kubernetes Pod 原生支持:

Podman 对 Kubernetes 的 Pod 概念有原生支持。可以轻松创建和管理包含多个共享命名空间(网络、IPC、UTS)容器的 Pod。

可以在创建、启动、检查和管理 Pod。直接使用 Podman 操作 Kubernetes YAML,从 Pod 生成 Kubernetes YAML,并部署到现有的 Kubernetes 环境中。

Podman 安装

  • 在 Window 和 MacOS 上安装 Podman

容器是基于 Linux 内核的,因此和 Docker 一样,在 Window 和 MacOS 上运行容器时需要用到虚拟机。

和 Docker Machine 一样,Podman 也有 Podman Machine 虚拟机。

如在 MacOS 上安装 Podman

brew install podman
podman info
podman machine init
podman machine start
podman machine ls
podman run hello-world

在 Windows 上,每台 Podman 机器都由一个虚拟化的 Windows Subsystem for Linux(WSLv2)发行版提供支持。

安装后,可以直接从 Windows PowerShell(或 CMD)提示符运行 podman 命令,该命令会与在 WSL 环境中运行的 podman 服务进行远程通信。

或者,如果您更喜欢 Linux 提示符和 Linux 工具,也可以直接从 WSL 实例访问 Podman。

除了直接使用 podman 外,Podman Desktop 也可以作为图形界面工具,

  • 在 Linux 上安装 Podman

在 Linux 上安装 Podman 的最简单方法是使用包管理器。

# Arch Linux & Manjaro Linux
sudo pacman -S podman

# Alpine Linux
sudo apk add podman

# CentOS Stream/Fedora
sudo dnf -y install podman

# Debian/Ubuntu
sudo apt-get -y install podman

# Gentoo
sudo emerge app-containers/podman

# openSUSE
sudo zypper install podman

Podman 使用

podman 命令和 docker 命令基本一样,设置一个简单的别名  alias docker=podman  就能无缝切换。

  • 查找镜像

Podman 会在不同的镜像仓库中搜索。

podman search httpd --filter=is-official
  • 拉取镜像

建议使用完整的镜像名称(如 docker.io/library/httpd,而不是 httpd),以确保您使用的是正确的镜像。

podman pull docker.io/library/httpd
  • 运行一个容器

示例容器将运行一个基础的 httpd 服务器

podman run -dt -p 8080:80/tcp docker.io/library/httpd

容器是在分离模式-d下运行的,Podman 将在执行命令后打印出容器 ID。-t  选项还会添加一个伪终端,以便在交互式 shell 中运行任意命令。-p  添加一个端口映射,将 httpd 的 80 端口映射到主机的 8080 端口。

  • 查看容器状态

podman ps命令用于列出已创建和正在运行的容器。

podman ps

如果添加  -a  参数,Podman 将显示所有容器,包括已创建、已退出、正在运行等。

  • 测试 httpd 服务

通过端口映射,httpd 服务的 80 端口映射到宿主机的 8080 端口。

curl http://localhost:8080
  • 其他命令

其他如  podman logs 、podman inspect、 podman stoppodman rm 、podman images  和 docker 的命令一致,可以查看详细的 podman 或 docker 的命令行文档。

Podman 和 Docker 生态对比

对比项目 Docker Podman
Daemonless dockerd
Rootless 需要特殊配置 默认 rootless
Machine Docker Machine Podman Machine
Compose Docker Compose Podman Compose
Desktop Docker Desktop Podman Desktop
Dockerfile Dockerfile Containerfile

Podman 和 Docker 该如何选?

如果对安全是否有更高的要求,推荐 Podman

  • Podman 是开源的,由 CNCF 社区托管。避免了单一厂商的锁定。
  • Podman 默认是 Rootless。业务逻辑运行在容器内,避免了越权问题。
  • Podman 默认不运行后台进程。减少容器运行时消耗的资源,以及安全攻击面。

如果对产品成熟度和生态完善性有更高的要求,推荐 Docker

  • 当前很多 DevOps 工具默认集成了 Docker。如 Jenkines、ArgoCD 等

  • Podman 还处于 CNCF 的沙盒阶段,距离孵化和毕业还需要很长一段时间。

  • Podman 功能上大部分兼容 Docker,但仍然有一些功能还未完全兼容,如不支持 Docker 的  --restart=always(依赖守护进程实现容器自启),Podman 需通过 Systemd 单元文件管理。

  • 藏云阁 Pro(服务号):极少的内容推送,菜单按照移动端 APP 思路配置,提供微信端快速的知识库访问。深度的云技术思考,综合性的架构解决方案。

  • 云原生技术栈(订阅号):提供云技术的最佳实践、科普内容,了解更多优秀的开源项目及其使用方法、问题解决方法等。