原文地址 blog.tangly1024.com
Docker 的一个缺点是它有一个中央守护进程,它以 root 用户的身份运行,这对安全有影响。但这正是 Podman 的用武之地。Podman 是一个 无守护进程容器引擎,用于开发、管理和在你的 Linux 系统上以 root 或无 root 模式运行 OCI 容器。
序
💡 在工作中,我遇到了一个挑战:需要将服务部署到甲方的内网服务器上。甲方是某个国家的通信运营商,服务器有着严格的规定、限制条件很多,无法使用 root 账号,禁止使用 sudo 命令,无法访问外网,也无法安装类似 RabbitMQ 这类常用的中间件。而其中最棘手的问题是,对方运营告知我们,他们不允许在系统中安装 Docker。
这给我们带来了巨大的困扰。
然而幸运的是,Podman 闪亮登场,为我们提供了绝佳的解决方案。
作为一个无需 Root 权限的容器运行时工具,Podman 让我们能够在甲方服务器上安装和运行所需的组件,完美地解决了我们的问题。现在,我们可以放心地继续开发和部署,为用户提供稳定高效的服务。
什么是 Podman
提到容器技术,我们很自然地会想到 Docker,毕竟它是目前非常流行的容器技术。在最新的 CentOS 8 操作系统中内置了另一种容器技术——Podman。
Podman 是一个开源项目,在 Github 上已经获得了 22k + 的星标,几乎可以在所有主流的 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 了。
Podman vs. Docker:区别与共通点
Podman 和 Docker 是两种常见的容器运行时工具,它们在体系结构和运行方式上有一些区别。让我们来详细比较它们。
Docker 与 Podman 的结构区别
体系结构
-
Docker:Docker 采用了客户端 - 服务器架构。Docker 客户端负责与 Docker 守护进程进行通信,守护进程负责管理容器的创建、运行和销毁。
-
Podman:Podman 采用了无守护进程的体系结构。每个 Podman 容器都是一个独立的进程,没有守护进程来管理容器。这种架构使得 Podman 更加轻量且适合于多个容器之间的隔离。
运行方式
-
Docker:Docker 使用 Docker 引擎作为容器运行时。它依赖于守护进程来管理容器的生命周期,并提供了一组命令行工具(如
docker run、docker stop等)来与守护进程进行交互。 -
Podman:Podman 直接在 Linux 操作系统上运行容器,无需依赖守护进程。它提供了与 Docker 兼容的命令行工具,可以直接使用类似的命令(如
podman run、podman stop)来管理容器。
Podman 对比 Kubernetes
Kubernetes(k8s) 是目前最流行的容器编排工具, 集群管理工具, 生态很完善, 也很 "重"。pod 的概念就来自 k8s , 虽然 podman 也是管理 pod, 但是远远不及 k8s 的编排功能, 同时 Podman 也没有集群管理功能,如果需要管理集群,需要第三方工具完成。
所以 Podman 定位也不是编排和集群管理工具, 紧紧是一个 pod 和容器的管理工具. 所以不是一个级别的东西, 这里不做太多的比较.
Podman 的优势和使用场景
Podman 具有更安全、更轻量、更适用于生产环境的特性。
1. 安全性
Podman 提供了高级安全性,无需特权用户,减少潜在安全风险。通过命名空间和用户命名空间的隔离,容器内的进程无法对宿主系统造成威胁。Podman 的安全机制确保容器的安全性,同时简化权限管理,使容器技术更灵活易用。
Podman 利用命名空间隔离系统资源,即使容器以 root 权限运行,也被映射为非特权用户,保证了宿主系统的安全。使用用户命名空间,容器内的进程伪装为非特权用户,即使容器被攻破,宿主系统仍然安全。Podman 在安全性和方便性方面表现突出,减少潜在安全风险,简化权限管理。
需要注意,在实际应用中,尽管 Podman 无需 root 权限运行容器,仍需进行特定配置和权限管理,以确保合法访问特定资源。Podman 根据情况进行设置和管理,保证安全性。
2. 轻量性
Podman 以轻盈灵活的特性脱颖而出。它在资源消耗和启动时间上表现出色,能够更有效地利用服务器资源。Podman 的轻量特性在开发和测试环境中尤为方便,能够快速创建和销毁容器,加快开发周期。
在测试应用程序时,Podman 能够快速启动多个容器实例,提供高效的开发和测试体验。你可以快速进行不同配置和版本的应用程序测试,加速问题排查和功能开发。
Podman 在部署场景中也具备优势。在云端或分布式环境中部署大规模应用程序时,Podman 能够快速启动和扩展容器实例,提供高度的灵活性和效率。
综上所述,Podman 的轻量性使其成为开发者和管理员的理想选择。它在资源利用和开发效率上具备独特优势,让我们能够更轻松地管理和运行容器,提高工作效率并节省成本。
3. 适用于生产环境
Podman 在生产环境中展现出许多优势,使其成为首选的容器化工具。让我们来看看这些优势是如何帮助我们的。
首先,Podman 以其更好的稳定性和可靠性而脱颖而出。它采用了一种聪明的策略,避免使用守护进程,从而降低了单点故障的风险,提高了整个容器环境的稳定性。
此外,Podman 采用了标准的 Open Container Initiative(OCI)规范,这意味着它与其他容器运行时和工具具备良好的兼容性。这种一致性和互操作性使得 Podman 能够与不同的容器生态系统紧密配合,提供稳定可靠的解决方案。
在生产环境中,稳定性和可靠性是至关重要的。我们需要一个可信赖的容器化工具,能够持续稳定地运行我们的应用程序。Podman 正是这样一个选择,它具备高度的稳定性和可靠性,确保我们的生产环境能够平稳运行,应对各种挑战。
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 的用户社区和文档资源相对较少,可能需要更多的自主探索和尝试来解决问题。
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**的文件,并在其中定义这两个容器的配置:
在这个示例中,我们定义了两个服务:**nginx**和**app**。
**nginx**服务
使用官方的 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 展示了其作为主流容器化解决方案的潜力。它在轻量性、稳定性和互操作性方面具备优势,为开发者和管理员提供了更多的选择和灵活性。然而,需要权衡其相对较新的生态系统和其他劣势。
就到这了,老唐下班了,明天继续努力!