Podman:更安全、轻量的容器化,Docker过时了?
00 分钟
2023-6-15
2023-8-25
category
tags
type
status
slug
date
summary
icon
password
💡
Docker 的一个缺点是它有一个中央守护进程,它以 root 用户的身份运行,这对安全有影响。但这正是 Podman 的用武之地。Podman 是一个 无守护进程容器引擎,用于开发、管理和在你的 Linux 系统上以 root 或无 root 模式运行 OCI 容器。

💡 在工作中,我遇到了一个挑战:需要将服务部署到甲方的内网服务器上。甲方是某个国家的通信运营商,服务器有着严格的规定、限制条件很多,无法使用root账号,禁止使用sudo命令,无法访问外网,也无法安装类似RabbitMQ这类常用的中间件。而其中最棘手的问题是,对方运营告知我们,他们不允许在系统中安装Docker。
这给我们带来了巨大的困扰。
notion image
 
然而幸运的是,Podman闪亮登场,为我们提供了绝佳的解决方案。
作为一个无需Root权限的容器运行时工具,Podman让我们能够在甲方服务器上安装和运行所需的组件,完美地解决了我们的问题。现在,我们可以放心地继续开发和部署,为用户提供稳定高效的服务。
 
notion image

什么是Podman

notion image
提到容器技术,我们很自然地会想到Docker,毕竟它是目前非常流行的容器技术。在最新的CentOS 8操作系统中内置了另一种容器技术——Podman。
Podman是一个开源项目,在Github上已经获得了12k+的星标,几乎可以在所有主流的Linux平台上使用。它是一个无守护进程的容器引擎,专为在Linux系统上开发、管理和运行OCI(Open Container Initiative)容器和容器镜像而设计。

什么是OCI

OCI代表Open Container Initiative(开放容器倡议),它是一个行业标准化组织,旨在推动容器技术的开放标准和互操作性。OCI的目标是定义容器运行时(runtime)和容器镜像(image)的规范,以确保不同容器工具和平台之间的兼容性。
在容器化领域,容器运行时负责管理和运行容器,而容器镜像则是包含应用程序及其所有依赖项的打包格式。OCI规范定义了容器运行时和容器镜像的结构、格式和接口,使得不同的容器工具(如Podman、Docker等)都可以按照这些规范创建和管理容器。
通过采用OCI规范,容器工具和平台可以实现互操作性,即使用一个容器工具创建的容器可以在另一个容器工具中运行,而无需进行额外的适配或修改。这为开发者和运维人员提供了更大的灵活性和选择性,使他们能够在不同的容器环境中无缝地迁移和管理应用程序。
因此,OCI的出现对于容器化技术的发展起到了重要的推动作用,它为容器工具的互操作性和标准化提供了基础,并促进了容器生态系统的繁荣发展。无论是Podman还是Docker,它们都遵循OCI规范,以确保容器的可移植性和互操作性。
值得一提的是,Podman提供了与Docker兼容的命令行工具,甚至可以简单地将docker命令别名为podman,这样如果你熟悉Docker,就可以轻松上手Podman了。
 
notion image

Podman vs. Docker:区别与共通点

Podman和Docker是两种常见的容器运行时工具,它们在体系结构和运行方式上有一些区别。让我们来详细比较它们。
notion image

体系结构

  • Docker:Docker采用了客户端-服务器架构。Docker客户端负责与Docker守护进程进行通信,守护进程负责管理容器的创建、运行和销毁。
  • Podman:Podman采用了无守护进程的体系结构。每个Podman容器都是一个独立的进程,没有守护进程来管理容器。这种架构使得Podman更加轻量且适合于多个容器之间的隔离。

运行方式

  • Docker:Docker使用Docker引擎作为容器运行时。它依赖于守护进程来管理容器的生命周期,并提供了一组命令行工具(如docker rundocker stop等)来与守护进程进行交互。
  • Podman:Podman直接在Linux操作系统上运行容器,无需依赖守护进程。它提供了与Docker兼容的命令行工具,可以直接使用类似的命令(如podman runpodman stop)来管理容器。
 

Podman对比Kubernetes

kubernetes(k8s) 是目前最流行的容器编排工具, 集群管理工具, 生态很完善, 也很"重", pod 的概念就来自 k8s , 虽然 podman 也是管理 pod, 但是远远不及 k8s 的编排功能, 同时 podman 也没有集群管理功能,如果需要管理集群, 需要第三方工具完成.
所以 podman 定位也不是编排和集群管理工具, 紧紧是一个 pod 和容器的管理工具. 所以不是一个级别的东西, 这里不做太多的比较.

Podman的优势和使用场景

Podman具有更安全、更轻量、更适用于生产环境的特性。

1.安全性

Podman提供了高级安全性,无需特权用户,减少潜在安全风险。通过命名空间和用户命名空间的隔离,容器内的进程无法对宿主系统造成威胁。Podman的安全机制确保容器的安全性,同时简化权限管理,使容器技术更灵活易用。
Podman利用命名空间隔离系统资源,即使容器以root权限运行,也被映射为非特权用户,保证了宿主系统的安全。使用用户命名空间,容器内的进程伪装为非特权用户,即使容器被攻破,宿主系统仍然安全。Podman在安全性和方便性方面表现突出,减少潜在安全风险,简化权限管理。
需要注意,在实际应用中,尽管Podman无需root权限运行容器,仍需进行特定配置和权限管理,以确保合法访问特定资源。Podman根据情况进行设置和管理,保证安全性。
notion image

2.轻量性

Podman以轻盈灵活的特性脱颖而出。它在资源消耗和启动时间上表现出色,能够更有效地利用服务器资源。Podman的轻量特性在开发和测试环境中尤为方便,能够快速创建和销毁容器,加快开发周期。
在测试应用程序时,Podman能够快速启动多个容器实例,提供高效的开发和测试体验。你可以快速进行不同配置和版本的应用程序测试,加速问题排查和功能开发。
Podman在部署场景中也具备优势。在云端或分布式环境中部署大规模应用程序时,Podman能够快速启动和扩展容器实例,提供高度的灵活性和效率。
综上所述,Podman的轻量性使其成为开发者和管理员的理想选择。它在资源利用和开发效率上具备独特优势,让我们能够更轻松地管理和运行容器,提高工作效率并节省成本。
notion image

3. 适用于生产环境

Podman在生产环境中展现出许多优势,使其成为首选的容器化工具。让我们来看看这些优势是如何帮助我们的。
首先,Podman以其更好的稳定性和可靠性而脱颖而出。它采用了一种聪明的策略,避免使用守护进程,从而降低了单点故障的风险,提高了整个容器环境的稳定性。
此外,Podman采用了标准的Open Container Initiative(OCI)规范,这意味着它与其他容器运行时和工具具备良好的兼容性。这种一致性和互操作性使得Podman能够与不同的容器生态系统紧密配合,提供稳定可靠的解决方案。
在生产环境中,稳定性和可靠性是至关重要的。我们需要一个可信赖的容器化工具,能够持续稳定地运行我们的应用程序。Podman正是这样一个选择,它具备高度的稳定性和可靠性,确保我们的生产环境能够平稳运行,应对各种挑战。
notion image
 

Podman的劣势

虽然Podman在许多方面比Docker更适合云原生环境,但它也存在一些劣势:

1.生态系统成熟度

Podman的生态系统相对较新,尚未达到Docker的成熟程度。例如,某些特定的插件或工具可能在Docker中已经有成熟的解决方案,但在Podman中可能还没有类似的功能。这可能对那些有特定需求的用户来说是一个劣势。例如,假设你需要使用特定的监控工具来监视和管理容器,你可能会发现在Docker的生态系统中有更多的选项和支持。

2.镜像管理

Podman的镜像管理相对较简单,可能不够适应复杂的镜像操作需求。例如,假设你的应用程序需要定期构建和推送多个镜像版本,并且需要进行高级的镜像层管理和优化,这时候可能会发现Podman的功能和工具相对有限,与Docker相比较少。这可能导致在复杂镜像操作方面的一些限制。

3.Windows和macOS支持

Podman在Windows和macOS平台的支持相对较弱,主要集中在Linux环境下。如果你需要在非Linux平台上使用容器,特别是在开发环境中,Docker可能是更好的选择。例如,如果你是一个开发人员,并且希望在本地的Windows机器上运行和测试容器化的应用程序,Docker提供了更完善和稳定的Windows平台支持。

4.用户社区和文档资源

Docker作为市场上广泛使用的容器化工具,拥有庞大的用户社区和丰富的文档资源。这使得在使用Docker时,你可以更容易地找到解决问题的方案、参与讨论和获取支持。相比之下,Podman的用户社区和文档资源相对较少,可能需要更多的自主探索和尝试来解决问题。
notion image

Podman的使用

Podman与Docker在容器管理、网络配置等方面有很多相似之处,同时Podman也和Docker一样提供了一套完整的RestfulAPI,仅从 docker 和 podman 两个命令提供的功能来讲,它们功能交集很大,podman 官方甚至推荐 alias docker=podman 来过渡,这意味着如果你熟悉Docker,那么使用Podman也会变得轻而易举。

安装Podman

查看Podman信息

容器

Podma提供了和Docker相似的命令行工具来管理容器。你可以使用这些命令来创建、启动、停止和删除容器,就像操作Docker一样。这种相似性使得你可以使用类似的语法和命令来管理容器,无需重新学习和适应新工具。
容器相关的常用命令

镜像

另外,Podman也支持使用Docker镜像。这意味着你可以使用Docker命令从Docker Hub下载镜像,并在Podman中使用这些镜像。Podman支持与Docker兼容的镜像格式,这为你提供了更多选择,无论是在Docker还是Podman中使用哪种工具都没有问题。
镜像相关命令:

网络

在网络配置方面,Podman和Docker也有相似的功能。它们都支持创建自定义网络,并允许容器连接到这些网络中。你可以使用Podman或Docker来创建网络,然后将容器连接到这些网络中,实现容器之间的通信。这种相似性使得你能够在两者之间进行无缝切换,而无需调整网络配置。
网络相关命令

数据卷

 

Podman Compoese

Podman提供了类似于Docker Compose的功能,称为Podman Compose。Podman Compose允许您使用一个YAML文件来定义和管理多个相关容器的组合。它简化了多容器应用程序的部署和管理,并提供了一种简单的方式来定义容器之间的关系、网络设置、卷挂载等。
以下是一个使用Podman Compose的示例:
假设您有一个Web应用程序,由一个Nginx容器和一个后端应用程序容器(如Node.js或Python)组成。您可以创建一个名为docker-compose.yaml的文件,并在其中定义这两个容器的配置:
在这个示例中,我们定义了两个服务:nginxappnginx服务使用官方的Nginx镜像,并将主机的端口80映射到容器的端口80。它还挂载了一个自定义的nginx.conf配置文件到容器的/etc/nginx/nginx.conf路径上。nginx服务依赖于app服务,这意味着当启动这个组合时,app服务会先启动。
app服务使用了一个自定义的构建上下文(context)和Dockerfile来构建镜像。它将主机的端口3000映射到容器的端口3000,并挂载了一个名为app的目录到容器的/app路径上。
要使用Podman Compose来启动这个组合,只需在命令行中运行以下命令:
Podman Compose会读取docker-compose.yaml文件,并根据配置启动和管理相应的容器。您可以使用类似于Docker Compose的命令,如podman-compose ps查看容器状态,podman-compose stop停止容器等。ash
 

写在最后

CENTOS8操作系统内置的Podman正成为推动Podman成为主流容器化解决方案的先锋。Podman相比Docker在各个方面具备优势,特别是作为无需Root权限的容器化工具的价值。
Podman的轻量性使其在资源受限的环境中更加高效,并加快了开发和测试环境的工作周期。在生产环境中,Podman通过避免使用守护进程提高了稳定性和可靠性,并与其他容器运行时和工具兼容,提供更好的互操作性。对于云原生应用开发和部署,Podman能够与Kubernetes等容器编排工具集成,提供灵活和高效的部署方案。
然而,我们也要认识到Podman相对于Docker存在一些劣势。Podman的生态系统相对较新,可选择的工具和资源较少;镜像管理功能相对简单,缺少一些高级功能和工具;对Windows和macOS平台的支持相对较弱;用户社区和文档资源相对较少。在考虑使用Podman时,需要综合考虑这些劣势。
总的来说,CENTOS8内置的Podman展示了其作为主流容器化解决方案的潜力。它在轻量性、稳定性和互操作性方面具备优势,为开发者和管理员提供了更多的选择和灵活性。然而,需要权衡其相对较新的生态系统和其他劣势。
 
就到这了,老唐下班了,明天继续努力!
 
notion image

参考

上一篇
吸引力法则 | 一个让你心想事成的秘密
下一篇
兵家至圣 —《孙子兵法》