一、Podman 是什么?
Podman
是一个基于 libpod
库开发的容器运行时,用于在 Linux
操作系统上管理和运行容器。与传统的 Docker
容器运行时不同,Podman
无需依赖 Docker
守护进程,它可以在不同的 Linux
发行版中独立运行。
Podman
是最流行的容器运行时之一,在 Github
上拥有 17.1K Star
,非常受欢迎。那么它有什么特别,又是为何能够受欢迎呢?一起来看看。
关于 podman
的资源:
- https://github.com/containers/podman
- https://github.com/containers/podman-compose
- https://github.com/containers/podman-desktop
二、Podman 的功能和特点
Podman
提供了与 Docker
类似的命令行接口,支持常见的容器管理功能,如启动、停止、重启和删除容器,以及构建、推送和拉取容器镜像等。Podman
还支持容器的网络和存储管理,可以使用 CNI
插件创建和管理容器的网络,支持使用多种存储驱动程序,如 overlayfs、btrfs 和 zfs
等。
Podman
的一个显著特点是它使用的是 rootless
模式,这意味着它可以在普通用户权限下运行,而不需要 root
权限。这有助于提高容器运行的安全性和可移植性。同时,Podman
支持通过 Pods
来管理一组相关的容器,这样可以方便地管理复杂的应用程序。
另外,Podman
还支持使用 systemd
来管理容器,这使得它可以更好地集成到 Linux
系统中,与其他系统服务一起运行和管理。
三、Podman 底层原理
作为一个容器运行时,Podman
的底层主要也是基于 Linux
的 Cgroup
和 Namespace
等技术,这里讲解一下涉及的主要技术点。
3.1、Namespace
Podman
使用 Linux
命名空间实现容器之间的隔离,如 pid(进程ID)、网络、IPC(进程间通信)、UTS(主机名和域名)和挂载等等。这些命名空间可以隔离不同容器的进程、文件系统、网络和主机名等等,从而实现容器之间的隔离。
Linux Namespace
是 Linux
内核中的一个功能,用于将系统资源(如进程、网络、文件系统、IPC等)隔离在不同的命名空间中,从而使得相同的系统资源在不同的命名空间中具有不同的视图。这样可以让不同的进程看到不同的系统资源,从而实现更好的隔离和安全性。
Linux Namespace 提供了以下命名空间:
- PID 命名空间:使得每个进程只能看到自己及其子进程的进程树;
- Network 命名空间:使得每个进程只能看到自己的网络接口和路由表,从而实现网络隔离;
- IPC 命名空间:使得每个进程只能看到自己和同一命名空间中的进程的进程间通信(IPC)机制;
- UTS 命名空间:使得每个进程只能看到自己的主机名和域名;
- 挂载命名空间:使得每个进程只能看到自己的文件系统挂载点和文件系统层次结构;
- 用户命名空间:使得每个进程只能看到自己和同一命名空间中的进程的用户和用户组。
Linux Namespace可以用于以下场景:
- 容器:通过使用不同的命名空间隔离容器中的进程、文件系统、网络等资源,从而实现轻量级虚拟化;
- 系统安全:通过使用不同的命名空间隔离系统资源,从而避免因为进程之间的相互影响而导致的安全问题;
- 调试:通过使用不同的命名空间,使得调试工具只能看到特定的进程和资源,从而提高调试效率。
3.2、Cgroups
Podman
使用 Linux cgroups
来限制和管理容器的资源使用情况,如 CPU、内存、I/O
等等。
Cgroups(control groups)
是 Linux
内核的一个功能,用于限制、隔离和控制系统资源的使用。Cgroups
允许将进程组织成一个或多个层次结构,每个层次结构都可以被分配一定数量的系统资源(如 CPU、内存、磁盘I/O
等),以便实现更好的系统资源管理和控制。
它可以限制 CPU
使用率、磁盘 I/O
、网络资源、进程树等,是一个非常强大的工具,可以让系统管理员更好地管理和控制系统资源的使用。在大型系统中,使用 Cgroups
可以有效地避免资源耗尽和进程之间的干扰,从而提高系统的稳定性和可靠性。
3.3、SELinux
Podman
使用 SELinux
来增强容器的安全性,它可以通过对容器进程的安全上下文进行限制,保证容器不会访问到宿主机上的敏感文件和资源。
SELinux
是一种强制访问控制(MAC
)安全机制,用于 Linux
操作系统。它是由美国国家安全局(NSA
)开发的,旨在增强操作系统的安全性和可靠性,提高系统的完整性和保密性。
SELinux
使用安全策略来管理访问控制规则,这些规则决定哪些进程可以访问哪些资源,以及如何访问这些资源。SELinux
安全策略基于标签(label
)机制,它给操作系统中的每个对象(如文件、进程、套接字等)分配一个唯一的标签。这个标签用于识别该对象的所有权、访问控制以及安全上下文。
与传统的访问控制模型不同,SELinux
将访问控制放在了应用程序之外,从而增强了操作系统的安全性。SELinux 提供了一个强大的安全机制,可以限制应用程序的访问权限,并确保在恶意应用程序或攻击者的情况下保护系统资源。
SELinux
在 Linux
发行版中已经成为标准安全机制,并且在很多服务器和企业环境中得到广泛应用。虽然使用 SELinux
需要一定的学习和配置成本,但是它能够提供更高的安全保障和系统可靠性,从而值得使用和学习。
3.4、OCI 标准
Podman
遵循 OCI (Open Container Initiative)
标准来定义和管理容器和镜像。
OCI(Open Container Initiative)是由 Docker、CoreOS 和其他主要技术公司发起的一个开放标准组织,旨在为容器提供一个开放、统一和标准的格式和运行时环境。
OCI
标准定义了一个容器的标准格式和运行时环境,其中包括:
- 容器镜像格式:OCI 定义了一个通用的容器镜像格式,即
OCI 镜像格式
。该镜像格式包含了应用程序和其所有依赖项,并将它们打包成一个容器镜像,以便于在不同的容器运行时环境中运行。 - 容器运行时环境:OCI 定义了一个通用的容器运行时环境接口,即
OCI 运行时规范
。这个规范定义了容器运行时环境所需的API、CLI
命令、配置和网络等方面的标准接口,以确保容器可以在不同的运行时环境中运行,同时保证兼容性和互操作性。 - 容器工具链:OCI 还定义了一个容器工具链规范,它定义了一组标准 CLI 命令,使得开发人员和系统管理员能够更方便地构建、管理和维护容器环境。
OCI
标准的出现是为了解决容器生态系统中的互操作性问题。在没有标准化之前,容器技术由不同的厂商和组织开发,容器镜像格式和运行时环境也各自不同,这给容器应用程序的部署和管理带来了很多挑战。通过制定标准,OCI 为容器技术的发展提供了一个更加开放、互操作和可持续的基础设施。
3.5、基于 Rootless
Podman
支持在没有 root
权限的情况下运行容器,这可以增强容器的安全性和可移植性。
Podman
实现 rootless
的方法是使用 Linux
的 user namespaces
功能。用户命名空间(user namespaces
)是 Linux
内核中的一种安全功能,它可以为每个用户提供一个独立的命名空间,使得用户在该命名空间中的操作不会影响到其他命名空间的用户。
Podman
在启动容器时,会创建一个新的用户命名空间,并在该命名空间中运行容器进程。这个命名空间中的用户可以使用它们自己的 UID
和 GID
,而不会影响到系统中的其他用户。同时,Podman
还使用了一些特殊的技术,如 userns-remap
,来保证容器中的进程能够正确地映射到主机上的用户和组。
Podman
通过以上这些技术来隔离、管理和保护容器和宿主机之间的资源和数据,从而提供安全、高效、可移植的容器环境。
四、Podman 有哪些优势?
与 Docker 相比,Podman
的一个优势是它可以在 rootless
模式下运行,这提高了容器的安全性,并且使得在共享计算机上运行容器更为方便。此外,Podman
的命令行接口与 Docker
类似,因此,如果你熟悉 Docker
,你会很快学会如何使用 Podman
。
与其他容器运行时相比,Podman
的一个优势是它与 systemd
的集成,这使得它可以更好地与 Linux
系统集成。另外,Podman
支持使用 Pods
来管理一组相关的容器,这使得在部署复杂应用程序时更为方便。同时,Podman
的可移植性也很高,它可以在各种 Linux
发行版和云平台上运行,使得容器应用程序的部署更加灵活和简单。
五、Podman 的安装使用
Podman
可以在各种 Linux
发行版上安装和使用,下面是 Podman
的安装和使用步骤:
5.1、安装 Podman
在大多数 Linux
发行版上,你可以使用系统包管理器来安装 Podman
。
例如,在 CentOS
和 Red Hat Enterprise Linux
上可以使用以下命令:
sudo yum install podman
在 Debian
和 Ubuntu
上可以使用以下命令:
sudo apt-get install podman
如果你使用的是其他 Linux
发行版,可以参考 Podman
官方文档中的安装指南。
- Podman 官方文档安装说明,https://podman.io/docs/installation
- Podman 教程,https://www.osgeo.cn/podman/Tutorials.html
5.2、运行第一个容器
安装完成后,你可以使用 Podman
来启动第一个容器。以下命令可以启动一个基于 Alpine Linux
的容器,并在容器中运行一个简单的命令:
podman run alpine echo "Hello, World!"
这将下载 Alpine Linux
镜像,并在容器中运行 echo
命令,输出 "Hello, World!"
。
5.3、查看容器
你可以使用以下命令来查看正在运行的容器:
podman ps
这将列出所有正在运行的容器,并显示容器的ID、状态、端口映射等信息。
5.4、停止和删除容器
你可以使用以下命令来停止和删除容器:
podman stop <container-id>
podman rm <container-id>
其中,是容器的 ID
,可以通过运行 podman ps
命令来获取。
5.5、构建和推送镜像
你可以使用以下命令来构建和推送容器镜像:
podman build -t <image-name> .
podman push <image-name>
其中,是镜像的名称和标签,例如 my-image:latest
。这将在当前目录中构建一个新的镜像,并将其推送到Docker Hub或其他容器镜像仓库中。
转载声明