容器技术概述
软件应用程序通常依赖于运行时环境提供的其他库、配置文件或服务。软件应用程序的传统运行环境是物理主机或虚拟机,应用程序依赖项作为主机的一部分安装。
例如,考虑一个 Python 应用程序,它需要访问实现 TLS 协议的公共共享库。传统上,系统管理员会在安装 Python 应用程序之前安装提供共享库的所需包。
传统部署的软件应用程序的主要缺点是应用程序的依赖项与运行时环境密切相关。
当对基本操作系统 (OS) 应用任何更新或补丁时,应用程序可能会中断。
例如,对 TLS 共享库的操作系统更新删除了 TLS 1.0 作为受支持的协议。这会破坏已部署的 Python 应用程序,因为它被编写为使用 TLS 1.0 协议进行网络请求。这迫使系统管理员回滚操作系统更新以保持应用程序运行,从而阻止其他应用程序使用更新包的好处。
因此,开发传统软件应用程序的公司可能需要进行全套测试,以保证操作系统更新不会影响主机上运行的应用程序。
此外,传统部署的应用程序必须在更新关联的依赖项之前停止。为了最大限度地减少应用程序停机时间,组织设计和实施复杂的系统以提供其应用程序的高可用性。在单个主机上维护多个应用程序通常变得很麻烦,并且任何部署或更新都有可能破坏组织的应用程序之一。
或者,可以使用容器部署软件应用程序。
容器是一组独立于系统其余部分的一个或多个进程。
容器提供了许多与虚拟机相同的好处,例如安全性、存储和网络隔离。容器需要的硬件资源要少得多,而且启动和终止都很快。它们还隔离了应用程序的库和运行时资源(例如 CPU 和存储),以最大限度地减少任何操作系统更新对主机操作系统的影响,如图1.1:容器与操作系统的差异中所述。
容器的使用不仅有助于提高托管应用程序的效率、弹性和可重用性,还有助于提高应用程序的可移植性。Open Container Initiative (OCI) 提供了一组定义容器运行时规范和容器映像规范的行业标准。镜像规范定义了构成容器镜像的文件和元数据包的格式。当您将应用程序构建为符合 OCI 标准的容器镜像时,您可以使用任何符合 OCI 标准的容器引擎来执行该应用程序。
有许多容器引擎可用于管理和执行单个容器,包括 Rocket、Drawbridge、LXC、Docker 和 Podman。Podman 在 Red Hat Enterprise Linux 7.6 及更高版本中可用,并在本课程中用于启动、管理和终止单个容器。
以下是使用容器的其他主要优势:
低硬件占用空间 容器使用 OS 内部功能来创建一个隔离的环境,在该环境中,使用命名空间和 cgroup(控制组)等 OS 设施管理资源。与虚拟机管理程序相比,这种方法最大限度地减少了 CPU 和内存开销。在 VM 中运行应用程序是一种与运行环境隔离的方法,但它需要大量的服务来支持容器提供的相同的低硬件占用空间隔离。
环境隔离 容器在封闭环境中工作,在该环境中对主机操作系统或其他应用程序所做的更改不会影响容器。由于容器所需的库是独立的,因此应用程序可以无中断地运行。例如,每个应用程序都可以存在于具有自己的库集的自己的容器中。对一个容器所做的更新不会影响其他容器。
快速部署 容器部署很快,因为不需要安装整个底层操作系统。通常,为了支持隔离,需要在物理主机或 VM 上安装新的操作系统,任何简单的更新都可能需要完全重启操作系统。容器重启不需要停止主机操作系统上的任何服务。
多环境部署 在使用单个主机的传统部署场景中,任何环境差异都可能破坏应用程序。但是,使用容器时,所有应用程序依赖项和环境设置都封装在容器映像中。
可重用性 无需设置完整的操作系统即可重复使用同一容器。例如,每个开发人员都可以使用提供生产数据库服务的同一数据库容器在应用程序开发期间创建开发数据库。使用容器,不再需要维护单独的生产和开发数据库服务器。单个容器映像用于创建数据库服务的实例。
通常,软件应用程序及其所有相关服务(数据库、消息传递、文件系统)都在单个容器中运行。这可能会导致与传统软件部署到虚拟机或物理主机相关的相同问题。在这些情况下,多容器部署可能更合适。
此外,容器是使用微服务进行应用程序开发的理想方法。每个服务都封装在一个轻量级且可靠的容器环境中,可以部署到生产或开发环境中。应用程序所需的容器化服务集合可以托管在一台机器上,无需为每个服务管理一台机器。
相比之下,许多应用程序不太适合容器化环境。例如,由于容器限制,访问内存、文件系统和设备等低级硬件信息的应用程序可能不可靠。