了解 Podman 和 Docker 之间的差异

容器化现在风靡一时。 Docker 于 2014 年推出,现已成为最流行的容器管理工具。 后来,在 2018 年,Red Hat 推出了 Podman 作为 Docker 的替代品。

既然 Docker 和 Podman 都打算做同样的事情,那么让我们看看一个比另一个有什么优势。

先了解“容器化”

假设您是组织中的 IT 人员。 您被告知要部署各种关键任务软件。 如果软件 一个 和软件 具有相同的依赖项但需要相同依赖项的不同版本? 或者更糟糕的是,如果软件的依赖性怎么办? 一个 与软件的依赖冲突 ?

在这种情况下,您可以将它们部署在单独的虚拟机中。 但这消除了它的可扩展性因素。 运行两个虚拟机 [on the same hardware],该软件仅继承了系统总计算能力的 50%。 将必要的软件数量从 2 个增加到 10 个,你就会明白这有多荒谬了。

虚拟机的一个固有缺点是它还运行一个成熟的操作系统。 在这种情况下,这是一个净负值。 如果您有十个运行 RHEL 的虚拟机,那么您就有十个相同二进制文件的副本,从而低效地占用了您的 RAM。 即使是最小的安装仍然会导致 每个 VM 超过 4GB 的磁盘空间。

因此,您可以拥有一个容器映像,而不是一个非常低效的虚拟机(在该虚拟机中拥有完整的操作系统、软件及其依赖项)(在此特定场景中)。 这些容器镜像只有软件和它的依赖打包在一起。 额外的好处是这些容器图像的大小通常小于 300MB!

问题在于虚拟机的性质。 创建虚拟机时,硬件会被虚拟化。 这意味着 CPU、RAM、存储和其他资源是虚拟化的。 这必然会产生明显的开销。

同时,通过容器,软件(你的操作系统)被虚拟化了。 与传统虚拟机相比,这具有较低的开销。

那么为什么我需要 Docker 或 Podman?

您可能使用过 Oracle 的 VirtualBox 过去管理虚拟机。 VirtualBox 允许您创建、启动、停止、暂停、修改甚至删除虚拟机。 这也是 Docker 和 Podamn 所做的,但对于容器化软件。

虽然 Docker 和 Podman 有不同的理念,但它们都可以帮助您管理容器。 因此,现在让我们来看看它们有何不同,以及哪一个最适合您的用例。

Docker 与 Podman

正如我之前提到的,Docker 和 Podman 都是容器管理软件,并且在这方面表现出色。 当 Red Hat 宣布 Podman 作为 Docker 的替代品时,他们说 Podman 兼容 Docker 的命令行界面. 这意味着,从 Docker 迁移到 Podman 不需要对现有代码进行任何重大更改。 这也意味着您可以只替换 docker 命令与 podman 它只是工作™。

但是它们仍然有一些关键的根本区别,所以让我们来看看它们。

1. daemon-based vs. daemon-less

使 Docker 和 Podman 与众不同的主要区别在于它们在您的系统上运行的方式。

Docker 的核心作为守护进程运行 (dockerd)。 意思是,它总是在后台运行,管理容器。 同时,Podman 就像您的普通程序一样; 一旦您使用 Podman 执行操作(启动/停止容器),它就会退出。

Docker 基于守护进程的方法为您带来以下好处:

  • 允许您在系统启动时轻松自动启动容器。
  • 由于 Docker 本身就是一个守护进程,因此不需要像 systemd 这样的外部服务管理器。

这并不意味着 Podman 不好。 以下是 Podman 相对于 Docker 提供的好处:

  • 如果 Docker 守护进程崩溃,则容器处于不确定状态。 这可以通过使 Podman 无守护进程来防止。
  • 您可以使用 systemd 来管理您的容器。 与 Docker 相比,这为您提供了几乎无限的可配置性。
  • 使用 systemd 挂钩 Podman 还允许您以最少的停机时间更新正在运行的容器。 您还可以从任何不良更新中恢复。

2. 安全

使用 Podman 而不是 Docker 的最大理由是安全性(嗯,有点)。 Podman 被定位为比 Docker 更安全的替代品。

在我看来,如果你有点安全意识,Podman 的两个主要功能会吸引你。 之前,我提到过 Docker 和 Podman 之间的主要区别因素是 Podman 不作为守护进程运行。

Podman 的第二个主要特点是它可以在没有 root 访问权限的情况下运行容器。 这是什么意思? 这意味着您不需要超级用户权限来管理容器。

如果你像我一样有网络安全焦虑,为什么应该使用 Podman 而不是 Docker,我有三个论点。

参数 1:dockerd 以 root 身份运行

正如您现在已经知道的那样,Docker 的核心作为“系统守护进程”运行,即作为由 root 用户。

我已经说明了拥有一个守护进程的好处,但是运行一个守护进程作为 root 用户也有一些安全问题。

首先,如果 Docker 守护进程 (dockerd) 受到损害,您将留下一个攻击者可以获得 root 访问权限的系统。 你当然不想要那个,是吗?

使用 Podman 的优势在这里可见。 Podman 没有运行守护进程。 并且当然对root访问没有任何严格的要求。 这将我们带到了第二个论点。

论点 2:Podman 支持无根容器

如果您以某种方式了解 Podman,您可能还听说过它支持在没有 root 访问权限的情况下运行容器。

这当然是非常正确的,并且对安全性非常有利。

让我们假设 Docker 守护进程是安全的。 现在假设您使用的容器镜像存在安全漏洞。 但这并不为开发商所知。

如果此映像正在由 root 用户,你是 索尔.

使用 Podman,您无需任何 root 权限即可运行容器。 这意味着,即使容器镜像存在安全漏洞,也只有拥有该容器的用户会受到威胁。 该系统上的其他用户仍然是安全的,尤其是 root 用户。

Docker 最近获得了对容器无根执行的支持,但它缺少一些功能。 也就是说,没有 AppArmor 支持。 AppArmor 是 Debian 和 Ubuntu 的默认强制访问控制 (MAC) 系统。

参数 3:自动更新图像

当然这不可能是一个功能,对吧? 嗯,是的。

考虑我提出的第二个论点,略有不同。 在这种情况下,假设开发人员知道安全漏洞。 因此,他们发布了公告,并且已经可以使用修补的图像。

都好? 嗯,是的,也不是。 Docker 没有内置自动更新机制。“Podman 也没有。那又怎样?”

我同意,甚至 Podman 都没有内置自动更新机制。或者是吗? 这取决于您如何定义“内置”。 由于 Podman 没有自己的守护进程,因此它无法定期检查更新。

但是,Podman 作为 Red Hat 产品,与 systemd 集成得非常好。

⚠️我提出的论点并不意味着 Docker 不安全,每个人都应该使用 Podman。 没有什么是 100% 安全的. 但我的论点确实突出了一些需要注意的地方!

我在另一篇文章中介绍了自动更新 Podman 容器。 这是使用 systemd 完成的。 它在下面链接。

3. 多合一 vs 隔离

读到这里之后,您可能已经意识到 Docker 有一种“一体化”的方法,而 Podman 是……不同的。

这对 Docker 用户意味着什么? 对于 Docker 用户,您只需要在系统中安装 Docker 二进制文件。 这 docker 命令可用于构建图像,发布图像(到注册表,如 hub.docker.com) 和管理容器。

但是在 Red Hat 的产品中,有三个独立的二进制文件。 要构建图像,您可以使用 buildah 命令。 如果您想将图像发布到注册表,例如 hub.docker.com, 使用 skopeo 命令。 如果要管理容器,请使用 podman 命令。

如果你想要一个像 Docker 这样的一体化解决方案,还是来自 Red Hat 的隔离解决方案,取决于你的偏好。 两者都做他们的设计。

如果您正在寻找一种方法 在 Ubuntu 上安装 Podman,这是一个很好的资源。

4. 码头工人群

当您想使用多个物理/虚拟机扩展容器时,Docker Swarm 非常方便。 您可以将多台计算机置于“群”之下,它们会有特定的用途。 您可以让一个 swarm 只处理数据库请求,而另一个 swarm 为 Web 服务器提供服务。

虽然 Podman 中明显没有此功能。 但是,您可以使用 Kubernetes 实现相同的目标。 我认为 Kubernetes 比 Docker Swarm 使用更广泛,如果需要多台机器的可扩展性,Kubernetes 可以最好地满足您的需求。

结论

Docker 几乎是容器的代名词。 Podman 由 Red Hat 创建,旨在扩展其容器化工具的供应并克服 Docker 的一些缺点。 与 docker 命令兼容还可以更轻松地从 Docker 迁移到 Podman,而不必忘记您的 Docker 知识。

并不是说 Docker 没有在改进自己。 在这方面添加无根是一个标志。

总的来说,这取决于你想使用什么。 就个人而言,我喜欢 Podman。 您可以从我在这里介绍的所有 Podman 教程中猜到这一点。