什么是Podman
Podman(POD Manager)是一个开源的无守护进程(daemonless)容器引擎,用于管理容器、容器镜像、容器卷和网络。
它兼容 OCI 标准,可以运行 Docker 镜像,并且设计上与 Docker CLI 命令高度兼容。
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 stop
、podman 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 单元文件管理。