最流行的容器运行时 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或其他容器镜像仓库中。

转载声明

相关实践学习
通过workbench远程登录ECS,快速搭建Docker环境
本教程指导用户体验通过workbench远程登录ECS,完成搭建Docker环境的快速搭建,并使用Docker部署一个Nginx服务。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
3天前
|
Kubernetes 搜索推荐 Docker
K8S容器运行时弃用Docker转型Containerd
K8S容器运行时弃用Docker转型Containerd
94 0
|
3天前
|
Oracle 关系型数据库 数据库
|
3天前
|
Docker 容器
Docker学习笔记三:如何运行一个容器?
Docker学习笔记三:如何运行一个容器?
Docker学习笔记三:如何运行一个容器?
|
6月前
|
Kubernetes Java 容器
如何获取k8s容器里运行的jar包
如何获取k8s容器里运行的jar包
180 0
|
6月前
|
Linux Docker 容器
Docker容器运行Linux
Docker容器运行Linux
|
7月前
|
Kubernetes 流计算 容器
Flink on k8s的话,怎么在容器运行前初始化一些脚本?
Flink on k8s的话,怎么在容器运行前初始化一些脚本?
51 1
|
6月前
|
存储 传感器 物联网
如何在Docker中配置Mosquitto MQTT代理,以便在容器化环境中运行和管理MQTT通信
如何在Docker中配置Mosquitto MQTT代理,以便在容器化环境中运行和管理MQTT通信
329 0
如何在Docker中配置Mosquitto MQTT代理,以便在容器化环境中运行和管理MQTT通信
|
7月前
|
关系型数据库 MySQL Devops
docker容器刚启动就停止 — 运行mysql 报错 mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
docker容器刚启动就停止 — 运行mysql 报错 mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
279 0
|
3天前
|
Linux 开发者 Docker
如何构建在 Docker 容器中运行命令?
【1月更文挑战第6天】
64 0
|
3天前
|
NoSQL Redis Docker
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
20 0

热门文章

最新文章