最流行的容器运行时 Podman,如何拿下 18K Star?

本文涉及的产品
访问控制,不限时长
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Podman 是最流行的容器运行时之一,提供了与 Docker 类似的命令行接口,支持常见的容器管理功能,如启动、停止、重启和删除容器,以及构建、推送和拉取容器镜像等。Podman 还支持容器的网络和存储管理,可以使用CNI插件创建和管理容器的网络,支持使用多种存储驱动程序,如 overlayfs、btrfs 和 zfs 等。

一、Podman 是什么?

Podman 是一个基于 libpod 库开发的容器运行时,用于在 Linux 操作系统上管理和运行容器。与传统的 Docker 容器运行时不同,Podman 无需依赖 Docker 守护进程,它可以在不同的 Linux 发行版中独立运行。

image.png

Podman 是最流行的容器运行时之一,在 Github 上拥有 17.1K Star,非常受欢迎。那么它有什么特别,又是为何能够受欢迎呢?一起来看看。

关于 podman 的资源:

二、Podman 的功能和特点

Podman 提供了与 Docker 类似的命令行接口,支持常见的容器管理功能,如启动、停止、重启和删除容器,以及构建、推送和拉取容器镜像等。Podman 还支持容器的网络和存储管理,可以使用 CNI 插件创建和管理容器的网络,支持使用多种存储驱动程序,如 overlayfs、btrfs 和 zfs 等。

Podman 的一个显著特点是它使用的是 rootless 模式,这意味着它可以在普通用户权限下运行,而不需要 root 权限。这有助于提高容器运行的安全性和可移植性。同时,Podman 支持通过 Pods 来管理一组相关的容器,这样可以方便地管理复杂的应用程序。

另外,Podman 还支持使用 systemd 来管理容器,这使得它可以更好地集成到 Linux 系统中,与其他系统服务一起运行和管理。

三、Podman 底层原理

作为一个容器运行时,Podman 的底层主要也是基于 LinuxCgroupNamespace 等技术,这里讲解一下涉及的主要技术点。

3.1、Namespace

Podman 使用 Linux 命名空间实现容器之间的隔离,如 pid(进程ID)、网络、IPC(进程间通信)、UTS(主机名和域名)和挂载等等。这些命名空间可以隔离不同容器的进程、文件系统、网络和主机名等等,从而实现容器之间的隔离。

Linux NamespaceLinux 内核中的一个功能,用于将系统资源(如进程、网络、文件系统、IPC等)隔离在不同的命名空间中,从而使得相同的系统资源在不同的命名空间中具有不同的视图。这样可以让不同的进程看到不同的系统资源,从而实现更好的隔离和安全性。

Linux Namespace 提供了以下命名空间:

  1. PID 命名空间:使得每个进程只能看到自己及其子进程的进程树;
  2. Network 命名空间:使得每个进程只能看到自己的网络接口和路由表,从而实现网络隔离;
  3. IPC 命名空间:使得每个进程只能看到自己和同一命名空间中的进程的进程间通信(IPC)机制;
  4. UTS 命名空间:使得每个进程只能看到自己的主机名和域名;
  5. 挂载命名空间:使得每个进程只能看到自己的文件系统挂载点和文件系统层次结构;
  6. 用户命名空间:使得每个进程只能看到自己和同一命名空间中的进程的用户和用户组。

Linux Namespace可以用于以下场景:

  1. 容器:通过使用不同的命名空间隔离容器中的进程、文件系统、网络等资源,从而实现轻量级虚拟化;
  2. 系统安全:通过使用不同的命名空间隔离系统资源,从而避免因为进程之间的相互影响而导致的安全问题;
  3. 调试:通过使用不同的命名空间,使得调试工具只能看到特定的进程和资源,从而提高调试效率。

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 提供了一个强大的安全机制,可以限制应用程序的访问权限,并确保在恶意应用程序或攻击者的情况下保护系统资源。

SELinuxLinux 发行版中已经成为标准安全机制,并且在很多服务器和企业环境中得到广泛应用。虽然使用 SELinux 需要一定的学习和配置成本,但是它能够提供更高的安全保障和系统可靠性,从而值得使用和学习。

3.4、OCI 标准

Podman 遵循 OCI (Open Container Initiative) 标准来定义和管理容器和镜像。

OCI(Open Container Initiative)是由 Docker、CoreOS 和其他主要技术公司发起的一个开放标准组织,旨在为容器提供一个开放、统一和标准的格式和运行时环境

OCI 标准定义了一个容器的标准格式和运行时环境,其中包括:

  1. 容器镜像格式:OCI 定义了一个通用的容器镜像格式,即 OCI 镜像格式。该镜像格式包含了应用程序和其所有依赖项,并将它们打包成一个容器镜像,以便于在不同的容器运行时环境中运行。
  2. 容器运行时环境:OCI 定义了一个通用的容器运行时环境接口,即 OCI 运行时规范。这个规范定义了容器运行时环境所需的 API、CLI 命令、配置和网络等方面的标准接口,以确保容器可以在不同的运行时环境中运行,同时保证兼容性和互操作性。
  3. 容器工具链:OCI 还定义了一个容器工具链规范,它定义了一组标准 CLI 命令,使得开发人员和系统管理员能够更方便地构建、管理和维护容器环境。

OCI 标准的出现是为了解决容器生态系统中的互操作性问题。在没有标准化之前,容器技术由不同的厂商和组织开发,容器镜像格式和运行时环境也各自不同,这给容器应用程序的部署和管理带来了很多挑战。通过制定标准,OCI 为容器技术的发展提供了一个更加开放、互操作和可持续的基础设施

3.5、基于 Rootless

Podman 支持在没有 root 权限的情况下运行容器,这可以增强容器的安全性和可移植性。

Podman 实现 rootless 的方法是使用 Linuxuser namespaces 功能。用户命名空间(user namespaces)是 Linux 内核中的一种安全功能,它可以为每个用户提供一个独立的命名空间,使得用户在该命名空间中的操作不会影响到其他命名空间的用户。

Podman 在启动容器时,会创建一个新的用户命名空间,并在该命名空间中运行容器进程。这个命名空间中的用户可以使用它们自己的 UIDGID ,而不会影响到系统中的其他用户。同时,Podman 还使用了一些特殊的技术,如 userns-remap,来保证容器中的进程能够正确地映射到主机上的用户和组。

Podman 通过以上这些技术来隔离、管理和保护容器和宿主机之间的资源和数据,从而提供安全、高效、可移植的容器环境。

四、Podman 有哪些优势?

podman pk docker

与 Docker 相比Podman
的一个优势是它可以在 rootless 模式下运行,这提高了容器的安全性,并且使得在共享计算机上运行容器更为方便。此外,Podman 的命令行接口与 Docker 类似,因此,如果你熟悉 Docker,你会很快学会如何使用 Podman

与其他容器运行时相比Podman 的一个优势是它与 systemd 的集成,这使得它可以更好地与 Linux 系统集成。另外,Podman 支持使用 Pods 来管理一组相关的容器,这使得在部署复杂应用程序时更为方便。同时,Podman 的可移植性也很高,它可以在各种 Linux 发行版和云平台上运行,使得容器应用程序的部署更加灵活和简单。

五、Podman 的安装使用

Podman 可以在各种 Linux 发行版上安装和使用,下面是 Podman 的安装和使用步骤:

5.1、安装 Podman

在大多数 Linux 发行版上,你可以使用系统包管理器来安装 Podman

例如,在 CentOSRed Hat Enterprise Linux 上可以使用以下命令:

sudo yum install podman

DebianUbuntu 上可以使用以下命令:

sudo apt-get install podman

如果你使用的是其他 Linux 发行版,可以参考 Podman 官方文档中的安装指南。

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或其他容器镜像仓库中。

转载声明

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。 &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
24天前
|
Kubernetes 监控 Cloud Native
|
1月前
|
存储 监控 Shell
docker的底层原理二:容器运行时环境
本文深入探讨了Docker容器运行时环境的关键技术,包括命名空间、控制组、联合文件系统、容器运行时以及分离的进程树,这些技术共同确保了容器的隔离性、资源控制和可移植性。
38 5
|
1月前
|
安全 Docker 容器
Docker中运行容器时Operation not permitted报错问题解决
【10月更文挑战第2天】Docker中运行容器时Operation not permitted报错问题解决
302 3
|
1月前
|
Kubernetes Docker 容器
容器运行时Containerd k8s
容器运行时Containerd k8s
38 2
|
2月前
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
|
2月前
|
存储 Docker 容器
containerd容器运行时快速入门使用指南
关于containerd容器运行时的快速入门使用指南,涵盖了镜像管理、容器管理、NameSpace管理、数据持久化、镜像推送至Harbor仓库以及Docker与Containerd集成等内容。
157 1
containerd容器运行时快速入门使用指南
|
1月前
|
应用服务中间件 Shell nginx
Docker容器运行
Docker容器运行
31 0
|
3月前
|
JSON JavaScript 开发者
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
【8月更文挑战第7天】Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
|
2月前
|
Shell Docker 容器
10-19|使用date命令: 你可以在容器内使用date命令来设置时间,但为了防止这个更改影响宿主机,你不能以特权模式运行容器。我没有加特权模式的时候,使用此命令告诉我没权限啊
10-19|使用date命令: 你可以在容器内使用date命令来设置时间,但为了防止这个更改影响宿主机,你不能以特权模式运行容器。我没有加特权模式的时候,使用此命令告诉我没权限啊
|
3月前
|
Kubernetes Shell 测试技术
在Docker中,可以在一个容器中同时运行多个应用进程吗?
在Docker中,可以在一个容器中同时运行多个应用进程吗?