Podman 和 Docker 一样,也是一个容器化技术的一种实现。它是全开源的。但是它们的底层架构是不同的,Podman 不需要使用 root 用户创建容器,也没有 deamon 进程,所以 Podman 不支持--restart 策略。但是为了迁移方便,Podman 团队采用了和 Docker 类似的命令。

以下内容摘自 官网文档

Podman 是一个无守护进程、开源的 Linux 原生工具,旨在使用开放容器倡议 (OCI) 容器和容器映像轻松查找、运行、构建、共享和部署应用程序。Podman 提供了一个命令行界面 (CLI),任何使用过 Docker 容器引擎的人都很熟悉。大多数用户可以简单地将Docker别名化为Podman(别名docker=podman),没有任何问题。与其他常见的容器引擎(Docker,CRI-O,containerd)类似,Podman依赖于符合OCI的容器运行时(runc,crun,runv等)与操作系统接口并创建正在运行的容器。这使得 Podman 创建的正在运行的容器与任何其他常见容器引擎创建的容器几乎没有区别。

Podman 控制下的容器可以由 root 或非特权用户运行。Podman 使用 libpod 库管理整个容器生态系统,包括 pod、容器、容器镜像和容器卷。Podman 专注于帮助您维护和修改 OCI 容器映像的所有命令和功能,例如拉取和标记。它允许您在生产环境中创建、运行和维护这些容器和容器映像。

一、安装

2024.11.23

podman 5.3.1

podman 安装时可能会有两种 oci-runtime 可选项,推荐使用 crun(C 语言编写,新兴);docker 使用的 runc(Go 语言编写),使用广泛,是 Docker 公司捐献出来的。有兴趣可以查看这篇 文章

V5 版本

V5 版本将不再支持 cgroup v1,标记为过期,后续仅支持 cgroup v2。cgroup v2 是 Linux cgroup API 的下一个版本。cgroup v2 提供了一个具有增强资源管理能力的统一控制系统,对 cgroup v1 进行了多项改进更新。有兴趣可以查看 这篇文章

要检测当前发行版使用的是哪个 cgroup 版本,可以使用以下命令,对于 cgroup v2,输出为 cgroup2fs;对于 cgroup v1,输出为 tmpfs

1
stat -fc %T /sys/fs/cgroup/

V4 以下版本

撰写本文的时候 Podman 已更新到 4.4.0 版本,本文所有涉及 Podman 的命令全部都是在此版本的基础上进行的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1. 安装
paru -S podman podman-compose
# 2. 查看当前用户名称
whoami
# 3. 把用户名称加入到 `/etc/subuid、/etc/subgid` 两个文件中
usermod --add-subuids 100000-165535 --add-subgids 100000-165535 username
# 执行命令并测试
podman system migrate
podman -v

# 使用搜索命令,会发现没有任何结果。这是因为需要配置一下
podman search nginx

# 编辑配置文件 /etc/containers/registries.conf
# 备份文件
sudo cp /etc/containers/registries.conf /etc/containers/registries.conf.bak
sudo vim /etc/containers/registries.conf

registries.conf 内所有的内容都是被注释掉的,找到以下内容去掉注释并修改,保存退出。

/etc/containers/registries.conf
1
2
3
4
5
unqualified-search-registries = ["docker.io"]

[[registry]]
prefix = "docker.io"
location = "hub-mirror.c.163.com"

unqualified-search-registries 可以配置多个源,镜像的搜索会从这些源中去寻找。
registry##prefix、location 是镜像拉取时使用的地址。
现在不推荐中科大源,原因详见:https://mirrors.ustc.edu.cn/help/dockerhub.html
此外也可以使用红帽提供的镜像,这些镜像有文档说明:https://catalog.redhat.com/software/containers/search

举个栗子,用以上配置举例:

1
2
3
4
5
6
7
8
9
# 搜索 unqualified-search-registries 配置的所有源中所有符合条件的镜像
# 如果你配置了多个,那么你就会在结果中看到有的镜像带有不同的前缀
podman search nginx

# 拉取镜像
podman pull nginx
# 虽然自己写的是上面的命令,但是 Podman 会自动加入配置
# 我们配置了 prefix,实际命令是这样:podman pull docker.io/nginx
# 如果还配置了 location,就会是这样:podman pull registry.docker-cn.com/nginx

二、命令

命令选项大多和 Docker 一样,如果不习惯可以配置 docker 别名(前提是只安装了 podman)。具体的使用可以参阅官方文档:https://docs.podman.io/en/latest/Commands.html。

podman generate

虽然 podman 的没有提供类似 docker 那样的 docker update --restart=always 重启策略。但是 podman 提供了另一个命令 podman generate systemd(V5 已弃用,该命令的弃用应该也是为了一定程度上脱离 systemd,而只关注容器本身),可以生成 systemd 服务文件来把容器交给 systemd 管理自启。当然也可以完全自己封装一个。使用方式:

1
podman generate systemd --name mycontainer --files --new

该命令会在当前执行命令的目录下生成一个 container-mycontainer.service 文件,我们只需要把该文件移动到 /etc/systemd/system/ 目录下然后使用 systemctl 去加入随系统自启即可。

对于 V5 版本,可以使用新工具:https://github.com/containers/podlet


本站由 江湖浪子 使用 Stellar 1.29.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。