[容器] Podman : 一款新型的容器引擎与容器管理工具

1 概述: Podman

  • 当我们谈论容器时,我们首先想到的默认工具就是Docker。但自从 Docker 诞生以来,容器领域已经有了很多发展,特别是在容器安全方面。Podman 是解决安全问题的项目之一。

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

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

什么是PodMan?比 Docker 更安全的竞品

  • Podman(POD Manager)是一款符合OCI标准的容器管理工具,提供与 Docker 类似的容器管理功能。

  • podman 的最佳功能之一是它能够运行无根容器

无根容器是在没有根权限(普通用户)的情况下运行和管理容器的概念。
安全角度来看,无根容器即使在容器受到攻击者破坏的情况下也不允许根访问,从而增加了额外的安全层。
您可以在此处了解【无根容器】的优点。

注意: Docker 也支持无根模式,但有一些限制。您可以在这里阅读相关内容。

  • Podman 也是无守护进程的(与 docker 不同)。

这意味着它没有守护进程并直接与 runc 交互(运行基于 OCI 规范的容器)。
在文章的最后,我补充了Docker 和 Podman 之间的区别。
另外,假设 Linux 中有两个用户。用户 a和用户 b。用户 a使用 podman创建的容器不能被用户 b修改,反之亦然。

2 安装使用

2.1 安装 Podman

  • 前往官方 Podman 安装文档。 在这里您可以找到 Windows、MAC 和 Linux 版本的所有安装命令。

注意:对于 Windows 和 Mac,podman 需要虚拟机来部署容器。

2.1.1 安装 on Linux

Ubuntu 20.10 为例

  • 对于Debian 11 和 ubuntu 20.10 或更高版本,您可以使用以下步骤。
sudo apt-get install runc -y
sudo apt-get -y install podman
  • 对于 CentOS 7:
sudo yum -y install podman
brew install podman
podman machine init
podman machine start
  • 安装后,使用以下命令验证安装。
podman version

2.2 Podman 容器注册表配置

  • 默认情况下,Podman 配置有两个容器注册表。
  • 您可以在以下文件中找到默认的 Podman 容器注册表配置。

/etc/containers/registries.conf

image

  • 您可以将自定义或私有容器注册表添加到此配置。

例如,Google容器注册表、AWS ECR、自托管私有注册表等。

  • 如果您想使用registry中的其他私有容器镜像,可以使用命令登录registry podman

例如,要登录 docker hub:

podman login docker.io

登录后,您将能够使用podman命令从 docker hub 中提取容器镜像

  • 如果您希望为【特定用户】拥有不同的【注册表配置】,您可以registries.conf在用户目录中创建单独的容器注册表信息。
$HOME/.config/containers/registries.conf

2.3 Podman 容器存储

  • 每个系统用户都有自己的容器存储。

这意味着,如果您尝试从不同的用户登录中提取映像,它将从【远程注册表】而不是【本地映像】中提取【映像】。

  • 例如,
  • 对于root 用户,容器存储在 /var/lib/containers/storage 目录中
  • 对于其他用户,容器存储在 $HOME/.local/share/containers/storage/ 目录中

2.4 使用 Podman 管理容器

  • 您可以像使用 docker 一样管理容器。但是,我们将使用 podman 作为带有类似于 docker 标志的命令,而不是 docker 命令。

  • 此外,您可以使用任何没有 sudo 权限的用户运行 podman 命令。

拉取镜像

  • 首先,让我们尝试拉取镜像

默认情况下,podman 首先在 quay.io 中搜索镜像,然后在 docker.io 中搜索。
如果 quay.io 中不存在映像,podman 会在 docker.io 中搜索并拉取该映像。
因此,最好指定注册表端点的完整映像名称。例如:

podman pull docker.io/nginx
podman pull quay.io/quay/busybox

创建并运行容器

  • 让我们从 dockerhub 注册表运行 Nginx 容器。

以下命令运行具有主机端口映射的 Nginx 容器 8080

podman  run --name docker-nginx -p 8080:80 docker.io/nginx
  • 如果您看到的话,上面的 podman 命令相当于 docker 命令和标志。

  • 无根模式(【普通用户模式】)下不能使用低于 1024 的端口。

因为【普通用户容器命名空间】确实具有映射这些端口的权限。
如果您想使用 podman 映射小于 1024 的主机端口,您应该以 root 用户或使用 sudo 权限运行 podman,如下所示:

sudo podman run --name docker-nginx -p 80:80 docker.io/nginx

检查映射的端口

  • 您可以使用以下命令检查映射的端口。-l 返回最新容器的详细信息。
podman port -l

检查容器

  • 您可以使用检查命令检查容器。
podman inspect -l

其他命令

  • 其他停止、移除和删除容器的命令与 docker 命令的工作方式相同。
  • 举几个例子:
podman images
podman ps
podman ps -a
podman stop <container-name>
podman rm <container-name>

帮助手册(help)

  • 运行 help 命令以了解所有可用的 podman 命令。
podman --help

2.5 使用 Podman 构建容器镜像

  • 让我们尝试使用自定义 HTML 文件构建 Nginx 的容器映像。我在 GitHub 存储库中有 Dockerfile 和 HTML 文件。
  • 让我们将 repo 和 cd 克隆到 repo nginx-image目录中
git clone https://github.com/scriptcamp/podman.git
cd podman/nginx-image
  • nginx-image文件夹内,您将看到一个Dockerfileindex.html 文件。

  • 让我们使用 podman 构建容器镜像。该命令与 docker 命令类似。

podman build -t scriptcamp/nginx .
  • 现在,让我们将映像推送到容器注册表。确保您已登录容器注册表以推送映像。这里我使用的是dockerhub。
podman push scriptcamp/nginx

2.6 使用 Podman 创建 Pod

  • Podaman 的高级功能之一是它能够创建类似于 Kubernetes PodPod

  • Pod 是一个可以拥有一个或多个容器的单元。

  • 具体步骤:

  • 创建空 pod:当您创建空 pod 时,Podman 会分配一个基础容器 k8s.gcr.io/pause 来保存命名空间,并允许与 pod 中的其他容器进行通信。
  • 您可以在 Pod 中添加和删除容器。
  • 您可以在 Pod 中创建完整的应用程序堆栈。
  • 您可以在 Pod 内有选择地启动和停止容器。
  • 现在让我们看一下示例。

要了解所有可用的 podman pod 命令,只需运行 help 命令即可。

podman pod --help

创建一个空 Pod

  • 让我们创建一个空的 Pod。如果您不指定该 --name 标志,podman 将创建一个具有随机名称的 pod。
podman pod create --name demo-pod
  • 让我们列出创建的 Pod。
podman pod ls
  • 列出 pod 中的所有容器。对于空 Pod,将k8s.gcr.io/pause添加一个容器。
podman ps -a --pod

将容器添加到 Podman Pod

  • 让我们向空 pod 添加一个 Nginx 容器。如果运行以下命令后列出容器,您将看到 Nginx 容器添加到 demo-pod
podman run -dt --pod demo-pod  nginx

Y 推荐文献

/quay/redis , /quay/ubuntu , /quay/busybox , quay/elasticsearch, ...

X 参考文献

echo '{"registry-mirrors": ["https://swr.cn-south-1.myhuaweicloud.com"]}' > /etc/containers/registries.conf

posted @ 2025-12-07 21:03  千千寰宇  阅读(105)  评论(0)    收藏  举报