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