在容器技术领域,Docker 长期以来占据着主导地位。然而,随着技术不断发展,对安全性、效率和资源控制的要求日益提高,新的竞争者逐渐崭露头角。Podman(Pod Manager)正是其中备受瞩目的一个。凭借其无守护进程(Daemonless)的架构、卓越的 rootless 模式支持以及与 Docker 命令行的高度兼容性,Podman 为开发者和运维人员提供了一个强大而现代的替代方案。

而恰巧公司出于安全考虑不允许个人办公电脑安装Docker,而我又有docker的需求,正好安装Podman来试试


1. 什么是 Podman?

Podman 是一款开源的容器管理工具,用于在 Linux 系统上开发、管理和运行符合 OCI(Open Container Initiative)标准的容器和镜像。由 Red Hat 主导开发,Podman 被视为下一代容器工具链中的核心组件之一。

与 Docker 最显著的区别在于其无守护进程架构。Docker 依赖于一个长期运行于后台的守护进程(dockerd)来管理所有容器,所有 docker 命令都需通过该守护进程执行。而 Podman 直接与容器运行时(如 runc)交互,每个用户命令都作为独立进程运行,从而带来以下几大核心优势:

  • 更强的安全性:无需一个拥有 root 权限的中心守护进程,有效减少攻击面。Podman 支持完全在非特权用户下运行(rootless 模式),增强了多用户环境中的隔离性与安全。
  • 更好的系统集成:Podman 与 Systemd 等现代 Linux 系统工具无缝集成,可将容器作为 Systemd 服务管理,实现开机自启和完整的生命周期控制。
  • 兼容 Docker CLI:为降低学习与迁移成本,Podman 命令行工具在设计上高度兼容 Docker。大多数用户可通过 alias docker=podman 实现无缝切换。

此外,Podman 引入了 Pod(容器组) 的概念,与 Kubernetes 中的 Pod 保持一致。一个 Pod 是一组共享网络和存储卷的容器集合,极大便利了在本地环境中管理和调试复杂的多容器应用。


2. 安装 Podman

Podman 在主流 Linux 发行版上的安装过程非常简单。

在 Fedora/CentOS/RHEL 上:

bash

sudo dnf install podman

在 Ubuntu/Debian 上: 从 Ubuntu 20.10 开始,Podman 已纳入官方软件源。

bash

sudo apt update
sudo apt install podman

在 macOS 上: 可通过 Homebrew 安装。Podman 在 macOS 上借助虚拟机运行 Linux 容器。

bash

brew install podman
podman machine init
podman machine start

在 Windows 上: Podman 通过 WSL 2(Windows Subsystem for Linux 2)运行。

  1. 确保已安装并启用 WSL 2。
  2. 在 WSL 发行版(如 Ubuntu)中按照上述 Linux 安装说明执行。
  3. 也可通过 winget 或 MSI 安装程序自动完成配置。

安装完成后,可运行以下命令验证:

bash

podman --version

3. Podman 基本使用

若您熟悉 Docker,使用 Podman 将几乎没有学习成本。

拉取镜像

bash

# 从 Docker Hub 拉取最新版 Nginx 镜像
podman pull nginx:latest

运行容器

bash

# 后台运行 Nginx 容器,映射主机 8080 端口至容器 80 端口
podman run -d --name mynginx -p 8080:80 nginx

查看运行中的容器

bash

podman ps

查看所有容器(包括已停止的)

bash

podman ps -a

停止和删除容器

bash

# 停止容器
podman stop mynginx

# 删除容器
podman rm mynginx

构建镜像 Podman 同样使用 Dockerfile,命令与 Docker 完全一致:

bash

# 在 Dockerfile 所在目录构建名为 my-app:1.0 的镜像
podman build -t my-app:1.0 .

使用 Pod Podman 的一大特色是其对 Pod 的原生支持,与 Kubernetes 模型一致:

bash

# 1. 创建一个 Pod
podman pod create --name my-pod -p 8080:80

# 2. 在 Pod 中运行一个应用容器(如 Python Flask)
podman run -d --pod my-pod --name my-app my-flask-app

# 3. 在同一 Pod 中启动 Nginx 反向代理
podman run -d --pod my-pod --name my-nginx nginx-reverse-proxy

# 4. 查看 Pod 中的容器
podman ps --pod

通过 Pod,您可以轻松管理需要紧密协作的多容器应用,简化本地开发与测试流程。


4. 使用 Alias 实现无缝兼容

Podman 与 Docker 命令行的高度兼容性使得迁移变得异常简单。您可以通过 Shell 别名(alias)实现命令的无缝替换,几乎无需改变现有的使用习惯。

兼容 Docker 命令:

只需在您的 Shell 配置文件(如 ~/.bashrc~/.zshrc)中加入以下别名设置:

bash

# 将 docker 命令重定向到 podman
alias docker=podman

加载配置后,您之前使用的所有 docker 命令(如 docker rundocker ps)都会自动由 podman 执行。

兼容 Docker Compose 命令:

虽然 Podman 原生不支持 docker-compose,但通过 podman-compose 工具和别名,可以达到几乎相同的效果。首先确保已安装 podman-compose

bash

pip3 install podman-compose

然后在同一配置文件中继续添加:

bash

# 将 docker-compose 命令重定向到 podman-compose
alias docker-compose=podman-compose

使别名生效:

bash

# 重新加载 Shell 配置
source ~/.bashrc   # 如果使用 Bash
source ~/.zshrc    # 如果使用 Zsh

完成以上设置后,您可以继续使用熟悉的 dockerdocker-compose 命令,而实际调用的是 Podman,实现了无痛迁移。

请注意:虽然别名解决了大部分兼容性问题,但由于架构差异,极少数高级或特定功能可能仍有不同。建议在重要生产流程中进行全面测试。


5. Podman vs. Docker:详细对比

特性PodmanDocker
架构无守护进程 (Daemonless)客户端-服务器 (C/S) 架构,依赖守护进程
安全性原生支持 Rootless 模式,无需 root 权限,安全性更高。需 root 权限或加入 docker 用户组(存在风险),Rootless 模式配置复杂。
系统集成与 Systemd 天然集成,容器可作为系统服务管理。依赖守护进程,与 Systemd 集成需额外配置。
核心概念支持 Pod,与 Kubernetes 概念一致,便于管理多容器应用。核心单元为单个容器,多容器管理需依赖 Docker Compose。
镜像仓库默认配置多个镜像源(如 quay.io),不绑定 Docker Hub。默认使用 Docker Hub。
CLI 兼容性高度兼容 Docker CLI,多数命令可直接替换。业界标准,生态成熟。
生态工具提供 podman-compose 以兼容 Compose,另有 Buildah、Skopeo 等专业工具。生态完善,拥有 Docker Compose、Docker Swarm 等全套工具。
适用场景高安全要求环境、HPC、CI/CD 流水线、Kubernetes 本地开发。传统开发与测试环境,生态成熟,入门简单。

6. Podman 与 Docker Compose 的兼容性

Docker Compose 是许多开发流程中的关键工具,而 Podman 本身并不直接支持 docker-compose,因为后者依赖 Docker 守护进程的 API。不过,社区提供了完善的解决方案:podman-compose

这是一个 Python 工具,能够将 docker-compose.yml 转换为 Podman 命令,致力于实现无缝兼容。

安装 podman-compose

bash

pip3 install podman-compose

使用示例: 假设已有 docker-compose.yml 文件:

yaml

version: '3'
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  redis:
    image: redis

之前使用 docker-compose up,现在只需:

bash

podman-compose up -d

常用命令包括:

  • podman-compose down
  • podman-compose ps
  • podman-compose logs

请注意podman-compose 会为每一个 Compose 文件创建一个 Pod,并将所有服务作为该 Pod 中的容器运行,这与 Podman 的设计理念完全契合。

尽管 podman-compose 在大多数场景下表现良好,但在某些复杂的网络或存储配置中可能与原版存在细微差异。不过对于绝大多数开发和测试需求,它已足够可靠。


结论:我该选择 Podman 吗?

Podman 并非意在完全取代 Docker,而是为容器技术栈提供了一个更现代、更安全的选择。

  • 新项目或注重安全的用户:Podman 的无守护进程和 rootless 设计能有效降低风险,非常值得尝试。
  • Kubernetes 开发者:Podman 的 Pod 概念可帮助在本地环境中更好地模拟生产集群,是理想的开发工具。
  • 现有 Docker 用户:凭借 CLI 兼容性和 podman-compose,迁移成本极低。可通过 alias docker=podman 平滑过渡,几乎不影响现有流程。

总而言之,Podman 凭借其前瞻的设计和强大的功能,正成为容器生态中不可忽视的力量。它在继承 Docker 易用性的同时,在安全性和集成能力上实现了显著突破。无论您是刚接触容器,还是经验丰富的专家,都值得将 Podman 纳入您的技术工具箱。

文章作者: 嘿手大叔
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 i·Space
其它分类 Docker 容器
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝