如何使用 Podman 创建容器?
如今,我们经常听到 **容器** 和 **虚拟机 (VM)** 这些术语,如果你是一个初学者,很难区分这些术语以及功能相似、几乎做同样工作的技术。
在本篇综合教程中,我们将以简单易懂的方式解释 **什么是容器**、**什么是容器引擎**,最后,我们将安装并使用 **Podman** 作为容器技术来运行我们的第一个容器。
什么是容器?
要理解什么是容器,让我们举个例子,假设我们有一个使用 PHP 版本 8 的应用程序。每个版本都有自己的库和依赖项。我们需要在我们的机器上下载并安装所有这些内容,这没有问题。接下来,我们有一个使用不同版本的另一个应用程序,它与第一个应用程序完全不同,使用它自己的库和二进制文件。现在,如果我们尝试下载这些软件包,我们会收到错误消息,因为我们在第一个应用程序中已经有了相同但版本不同的软件包,从而导致名为 **版本不匹配** 的错误,并且会遇到很多麻烦。
为了解决这个问题,我们可以将应用程序分开,每个应用程序放在它自己的文件夹中,并带有它自己的库和依赖项,但这在操作上并不实用。
第二个解决方案是使用虚拟机 (VM),因此我们在单独的虚拟机中设置每个应用程序,首先设置操作系统,然后设置应用程序所需的 PHP 和其他依赖项。对于另一个应用程序,我们也执行相同的操作,总共要运行两个应用程序,我们需要设置两个虚拟机,每个虚拟机都有自己的资源。这在成本方面令人讨厌且昂贵。这种方法运行了一段时间,直到我们有了现在所谓的容器。
因此,容器在这里提供的解决方案是,我们获取第一个应用程序及其自己的库和依赖项,将其放入容器(盒子)本身,给这个盒子命名,并将其保存到某个位置。我们可以将其带到任何操作系统并运行它,没有任何问题,因为它与操作系统隔离;我们只需要为它设置环境。
我们需要设置的环境就是我们所说的 **容器运行时环境**。
请查看此插图,以了解我们目前所处的阶段 -
这个运行时环境是为容器提供其正常运行所需的一切的层。只要此层存在,容器(我们的盒子)就能在任何地方或任何我们使用的操作系统上都能正常工作,这并不重要。即使硬件也不重要,除了体系结构之外。
例如,我们不能将使用 x86_64 体系结构构建的内容拿到树莓派上运行,因为体系结构不同。否则,我们可以做任何我们想做的事情;唯一需要的是相同的体系结构。
现在问题是,这个运行时环境究竟是什么?如果您还记得我们之前说过的话,当我们需要使用虚拟机设置一个新的应用程序时,我们首先设置操作系统,然后安装应用程序运行所需的所有依赖项。好吧,当我们运行应用程序时,这个运行时也会做同样的事情,就像它在操作系统内部运行一样。
好的,现在我们了解了这一层是如何工作的,但它最初是如何构建的呢?
容器在后台是如何工作的?
在 Linux 中,我们有一些叫做 **命名空间** 的东西,您可以将其想象成监狱。任何进入这个“监狱”的东西都无法出去;应用程序也是如此。如果我们在这个命名空间中运行它,它就无法出去,并且与外部隔离。
容器使用的另一项功能是 **cgroups**,这是另一个 Linux 概念,它基本上允许我们控制容器内进程使用的资源。因此,使用 cgroups,我们可以为容器设置资源。
容器使用的另一个重要概念是 **SELinux**,它允许我们控制容器的安全性和访问权限。
还有其他部分,但现在,我们可以只关注这三个部分(Linux 命名空间、cgroups、SELinux)并了解每个部分的作用。
容器和微服务
让我们再举一个例子,假设我们有一个包含许多部分和服务的应用程序。在容器出现之前,我们会将所有这些部分放在一个虚拟机中运行。但是,如果出现问题,我们必须测试整个应用程序才能找到它。我们将此操作称为故障排除,这很难,因为我们不知道问题的确切位置,因此我们检查整个应用程序。
另一个痛苦的操作是,如果我们对某一部分进行了一些修改,我们需要检查整个应用程序以确保我们所做的更改有效,因为所有内容都是相互关联的。我们需要确保我们所做的更改对应用程序的其余部分是正确的。
现在,为了解决这个问题,容器的作用是允许我们将应用程序的每个部分分离到一个单独的容器中独立运行。这使得故障排除更容易,因为如果一个容器(在本例中为服务)出现问题,我们可以直接转到它并修复它,而无需依赖其他容器。如果我们对应用程序的一部分进行了更改,我们只需要测试负责该部分的容器,而不是整个应用程序。
我们将这种分离容器和服务的运作称为微服务,这意味着每个服务都在它自己的容器中。下图显示了它是如何工作的
在此示例中,我们有两个不同的应用程序在运行时环境中运行,每个应用程序都有自己的服务。
容器和扩展
让我们再看一个场景,假设我们有一个正在运行的应用程序,在某个时刻,我们进行了一次促销活动,导致许多用户涌入我们的应用程序。这可能会导致问题,因为应用程序的设置无法为所有用户提供服务。为了解决这个问题,我们需要创建更多虚拟机来处理高流量,这些虚拟机将包含所有二进制文件和代码。为了演示这一点,让我们看这个插图。
让我们理解这个例子:我们有两个虚拟机运行我们的应用程序,因为我们获得了大量流量,所以我们通过添加另一个虚拟机来扩展。
这会占用大量资源;在某些情况下,应用程序本身可能很小,但要运行它,您需要一个消耗大量资源的虚拟机。随着我们不断发展和流量增加,我们可能会耗尽机器资源,此时我们需要另一台机器,等等。
您可能会看到一个名为 Hypervisor 的层,我们没有解释。基本上,这一层允许我们在我们的主机器上运行虚拟机。
如果您注意到此示例中,为了扩展应用程序,我们扩展了整个应用程序,这毫无用处。使用微服务架构,如果我们有一个包含许多组件的应用程序,我们可能只需要扩展流量较大的部分,而不是整个应用程序。
如果我们使用容器,我们可以做到这一点,因为正如我们之前所说,每个组件都在一个单独的容器中。我们只需要获取流量较大的组件并扩展它。
容器引擎
既然您已经了解了我们为什么需要容器以及它是如何工作的,那么让我们学习如何在我们的机器上使用容器技术。为了实现这一点,您需要我们所说的容器引擎。
有许多容器引擎平台允许我们运行容器,其中一个您可能听说过的是 Docker,这是一个流行且广泛使用的平台。但在我们的教程中,我们将使用另一个名为 **Podman** 的平台,它与 Docker 类似,但具有更多功能和能力。
结论
本文是对容器技术的介绍,包括它在 Linux 上的工作原理以及您应该了解哪些内容才能轻松地使用它。