引言:
在本文中,我们将了解 Podman
(Pod Manager
的缩写)、它的功能和用法。
一、Podman
Podman 是一个开源的容器管理工具,用于开发、管理和运行OCI容器。让我们来看看与其他容器管理工具相比, Podman 的一些优势,
- Podman 创建的镜像与其他容器管理工具兼容。Podman 创建的镜像遵循 OCI 标准,因此可以推送到其他容器注册中心,如 Docker Hub
- 它可以作为普通用户运行,无需 root 权限。 当以非 root 用户身份运行时,Podman 创建一个用户命名空间,在其中获取 root 权限。这允许它挂载文件系统并设置所需的容器
- 它提供了管理 pod 的能力。 与其他容器运行时工具不同,Podman 允许用户管理 pod(一个或多个为一组一起运行的容器)。用户可以对 Pod 执行创建、列出、检查等操作
但是,Podman 有一定的局限性:
- 它仅在基于 Linux 的系统上运行。 目前,Podman 仅在基于 Linux 的操作系统上运行,并且没有针对 Windows 和 macOS 的包装器。
- 没有 Docker Compose 的替代品。 Podman 不支持在本地管理多个容器,类似于 Docker Compose 所做的。作为 podman-compose 项目的一部分,正在开发使用 Podman 后端的 Docker Compose 实现,但这仍在进行中。
二、与docker的比较
现在我们已经了解了 Podman 是什么,以及它的优点和局限性,让我们将它与使用最广泛的容器管理工具之一的 Docker 进行比较。
2.1 命令行界面 (CLI)
Podman 提供了 Docker 客户端公开的相同命令集。换句话说,这两个实用程序的命令之间存在一对一的映射。
但是,像podman ps
和podman images
这样的命令不会显示使用 Docker 创建的容器或镜像。这是因为 Podman 的本地存储库是/var/lib/containers
,而不是 Docker 维护的/var/lib/docker
。
2.2. 容器模型
Docker 对容器使用客户端-服务器架构,而 Podman 使用 Linux 进程中常见的传统 fork-exec
模型。使用 Podman 创建的容器是父 Podman 进程的子进程。这就是为什么当同时为 Docker 和 Podman 运行 version 命令时,Docker 列出了客户端和服务器的版本,而 Podman 只列出了它的版本。
docker version
[root@docker ~]# docker version
Client: Docker Engine - Community
Version: 20.10.17
API version: 1.41
Go version: go1.17.11
Git commit: 100c701
Built: Mon Jun 6 23:05:12 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.17
API version: 1.41 (minimum version 1.12)
Go version: go1.17.11
Git commit: a89b842
Built: Mon Jun 6 23:03:33 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.8
GitCommit: 9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
runc:
Version: 1.1.4
GitCommit: v1.1.4-0-g5fd4c4d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
podman version
的示例输出:
[root@podman ~]# podman version
Version: 1.6.4
RemoteAPI Version: 1
Go Version: go1.12.12
OS/Arch: linux/amd64
由于 Podman 本身作为进程运行,因此它不需要任何后台守护进程。与 Podman 不同,Docker 需要一个守护进程 Docker daemon 来协调客户端和服务器之间的 API 请求。
2.3. 无需 Root
如前所述,Podman 不需要 root 访问权限来运行其命令。另一方面,Docker 依赖于守护进程,需要 root
权限或要求用户成为docker
组 的一部分才能在没有 root
权限的情况下运行 Docker 命令。
$ sudo usermod -aG docker $USER
三、安装与使用
让我们从安装 Podman开始。
安装:
[root@podman ~]# yum install -y podman
podman info
命令显示 Podman 系统信息并帮助检查安装状态。
[root@podman ~]# podman version
Version: 1.6.4
RemoteAPI Version: 1
Go Version: go1.12.12
OS/Arch: linux/amd64
[root@podman ~]# podman info
host:
BuildahVersion: 1.11.7
CgroupVersion: v1
Conmon:
package: conmon-2.0.8-1.el7.x86_64
path: /usr/bin/conmon
version: 'conmon version 2.0.8, commit: f85c8b1ce77b73bcd48b2d802396321217008762'
Distribution:
distribution: '"centos"'
version: "7"
MemFree: 2882011136
MemTotal: 3954184192
OCIRuntime:
name: runc
package: runc-1.0.0-69.rc10.el7_9.x86_64
path: /usr/bin/runc
version: 'runc version spec: 1.0.1-dev'
SwapFree: 0
SwapTotal: 0
arch: amd64
cpus: 4
eventlogger: journald
hostname: podman
kernel: 3.10.0-957.el7.x86_64
os: linux
rootless: false
uptime: 35h 12m 54.44s (Approximately 1.46 days)
registries:
blocked: null
insecure: null
search:
- registry.access.redhat.com
- registry.redhat.io
- docker.io
store:
ConfigFile: /etc/containers/storage.conf
ContainerStore:
number: 0
GraphDriverName: overlay
GraphOptions: {}
GraphRoot: /var/lib/containers/storage
GraphStatus:
Backing Filesystem: xfs
Native Overlay Diff: "true"
Supports d_type: "true"
Using metacopy: "false"
ImageStore:
number: 0
RunRoot: /var/run/containers/storage
VolumePath: /var/lib/containers/storage/volumes
让我们看一下一些基本的 Podman 命令。
3.1. 创建镜像
首先,我们将看看使用 Podman 创建镜像。让我们首先创建一个包含以下内容的 Dockerfile
FROM centos:latest
RUN yum -y install httpd
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
EXPOSE 80
现在让我们使用 build
命令创建镜像:
$ podman build .
在这里,我们首先拉取 CentOS
的基本镜像,在其上安装 Apache
,然后将其作为前台进程运行,并暴露端口 80。我们可以通过运行这个镜像并将暴露的端口映射到主机端口来访问 Apache 服务器。
build
命令递归地传递上下文目录中可用的所有文件夹。当没有指定目录时,当前工作目录默认成为构建上下文。因此,建议不要在上下文目录中包含创建镜像不需要的文件和文件夹。
3.2. 列出可用镜像
podman images
命令列出所有可用的镜像。它还支持过滤镜像的各种选项
$ podman images
此命令列出本地存储库中可用的所有镜像。它包含有关从哪个存储库中提取镜像、标签、其镜像 ID、创建时间和大小的信息。
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/centos latest 0f3e07c0138f 2 months ago 227MB
<none> <none 49030e844ce7 27 seconds ago 277MB
3.3. 运行镜像
podman run
命令创建指定镜像的容器,然后运行它。让我们运行上面创建的 CentOS 镜像
$ podman run -p 80:80 -dit centos
此命令首先检查是否有可用于 CentOS 的本地镜像。如果镜像不在本地,它会尝试从配置的注册表中拉取镜像。如果镜像不存在于注册表中,则会显示有关无法找到镜像的错误。
上面的 run 命令指定将容器暴露的 80 端口映射到主机的 80 端口,-dit
标志指定以分离和交互模式运行容器。创建的容器的 id 将作为输出。
3.4. 删除镜像
podman rmi
命令删除本地存储库中存在的镜像。可以通过在输入中提供以空格分隔的 ID 来删除多个镜像。指定 -a
标志会删除所有镜像
$ podman rmi 785188cd988c
3.5. 列出容器
可以使用 podman ps -a
命令列出所有可用容器,包括未运行的容器。与 podman images
命令类似,它也可以与各种选项一起使用。
$ podman ps -a
上述命令的输出列出了所有容器的信息,例如创建它的镜像、启动命令、状态、正在运行的端口以及名称。
CONTAINER ID IMAGE COMMAND CREATED AT STATUS PORTS NAMES
eed30719cd37 centos /bin/bash 2019-12-09 02:57:37 +0000 UTC Up 14 minutes ago 0.0.0.0:80->80/udp, 0.0.0.0:80->80/tcp reverent_liskov
3.6. 删除容器
podman rm
命令删除容器。此命令不会删除处于运行或暂停状态的容器。需要先停止,然后再移除。
$ podman stop eed30719cd37
$ podman rm eed30719cd37
3.7. 创建 Pod
podman pod create
命令创建一个 pod
。create
命令支持不同的选项。
$ podman pod create
pod create
命令默认创建一个带有 infra
容器的 pod,除非明确将 infra 标志设置为 false。
$ podman pod create --infra = false
Infra container
允许 Podman 连接 pod 中的各种容器。
3.8. 列出 Pod
podman pod list
命令显示所有可用的 pod
$ podman pod list
此命令的输出会显示 pod id、名称、关联容器的数量、infra 容器的 id 等信息:
POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID
7e0a68528aed gallant_raman Running 5 seconds ago 1 c6d06673c667
所有 Podman
命令及其用法可以在官方文档中找到。
四、 总结
在本文中,我们了解了 Podman 的基础知识及其功能、与 Docker 的比较以及一些可用的命令。