对于企业开发者来说,一个常见的挑战是确保应用在不同环境中(从本地笔记本电脑到临时服务器和生产基础设施)可靠且连贯地运行。容器化是一种操作系统虚拟化形式,可直接解决此问题。它是一种将应用及其所有依赖项(例如库和配置文件)打包到单个隔离的且可执行的单元(称为容器)中的方法。这种方法提供了一致的环境,有助于确保在开发环境中正常运行的内容在生产环境中也能正常运行。
容器化是一种软件部署流程,将应用的代码与运行所需的所有文件和库捆绑在一起。
这种独立的软件包(即“容器”)是轻量级的,并且可移植,因为它不需要自己的客机操作系统。不过,它会共用主机操作系统的内核,同时在自己的隔离用户空间中运行。这种隔离意味着您可以在单个主机上运行多个容器,每个容器都有自己的一组依赖项,而无需担心它们之间会发生冲突。
容器化环境具有分层架构,从底层硬件开始,一直到应用本身。
容器化开发遵循一个分步逻辑流程,将应用从源代码转化为运行中的隔离实例。
首先,开发者会创建一个文件(通常是 Dockerfile)。此文件充当构建应用环境的 recipe 或一组说明。它指定了所需的一切条件,包括:
|
开发者按照文件中的说明,使用命令创建容器映像。此映像是一个静态、不可变且可移植的文件,充当应用的独立蓝图。它将应用代码及其所有依赖项封装到一个分层软件包中。可以将映像视为面向对象编程中的类,它是用于创建运行实例的模板。
构建完成后,容器映像会被推送到容器注册表。注册表是用于存储和管理映像的集中式存储库。像 Google 的 Artifact Registry 这样的私有安全注册表对于企业用途必不可少。将映像存储在注册表中,可方便团队共享、进行版本控制,并从生产环境中的任何服务器进行访问。
最后一步是创建映像的运行实例,即容器本身。系统会向容器引擎发送一条命令,以运行注册表中的特定映像。然后,该引擎使用主机操作系统的内核来执行以下操作:
|
容器化是现代云计算的基础技术,可实现各种架构模式。
概念 | 容器化的说明和作用 |
容器化是微服务架构的理想部署模型。每个容器封装一个独立的服务,让团队能够自主开发、部署和扩缩服务。 | |
容器可以简化将旧版应用迁移到云的过程。通过将应用“直接原样迁移”到容器中,您可以使其具有可移植性,可以随时在任何云提供商的基础设施上运行。 | |
容器可移植有助于确保应用在本地数据中心和公有云环境中的运行始终如一,为无缝混合云策略提供关键支持。 | |
这是一种像 Google Kubernetes Engine (GKE) 这样的云服务模型,可自动编排和管理容器。它剥离出了底层基础设施,让开发者可以专注于应用。 | |
容器可提供对操作系统环境和语言运行时的更多控制,而无服务器架构则以零服务器管理提供更高级别的抽象。这两种模式都是有效的,并且可以结合使用。(例如,容器通常用于运行无服务器工作负载。)例如,Cloud Run 结合使用容器化与无服务器架构。您可以在无服务器环境中部署容器映像。 | |
虚拟化通过创建拥有自身客机操作系统的完整虚拟机来实现硬件虚拟化。容器化通过对操作系统本身进行虚拟化,并共享主机操作系统内核,使容器更轻量、启动更迅速。 | |
容器映像的一致性使企业能够跨多个地理区域高保真地部署完全相同的应用制品。这有助于确保应用行为一致,并简化面向全球用户群的管理工作。 |
概念
容器化的说明和作用
容器化是微服务架构的理想部署模型。每个容器封装一个独立的服务,让团队能够自主开发、部署和扩缩服务。
容器可以简化将旧版应用迁移到云的过程。通过将应用“直接原样迁移”到容器中,您可以使其具有可移植性,可以随时在任何云提供商的基础设施上运行。
容器可移植有助于确保应用在本地数据中心和公有云环境中的运行始终如一,为无缝混合云策略提供关键支持。
这是一种像 Google Kubernetes Engine (GKE) 这样的云服务模型,可自动编排和管理容器。它剥离出了底层基础设施,让开发者可以专注于应用。
容器可提供对操作系统环境和语言运行时的更多控制,而无服务器架构则以零服务器管理提供更高级别的抽象。这两种模式都是有效的,并且可以结合使用。(例如,容器通常用于运行无服务器工作负载。)例如,Cloud Run 结合使用容器化与无服务器架构。您可以在无服务器环境中部署容器映像。
虚拟化通过创建拥有自身客机操作系统的完整虚拟机来实现硬件虚拟化。容器化通过对操作系统本身进行虚拟化,并共享主机操作系统内核,使容器更轻量、启动更迅速。
容器映像的一致性使企业能够跨多个地理区域高保真地部署完全相同的应用制品。这有助于确保应用行为一致,并简化面向全球用户群的管理工作。
可移植性和一致性
容器化的一大优势在于其“一次构建,随处运行”的能力。由于容器将应用及其依赖项一并打包,因此可创建一个可预测且一致的环境。这种一致性有助于消除常见的“在我的机器上能运行”的问题,确保应用在开发、测试和生产环境中的运行行为一致,无需依赖底层基础设施。
提高了速度和敏捷性
容器比传统虚拟机轻量得多,因为它们无需运行自己的客机操作系统。这使得容器可以在几秒钟内启动和停止,而非几分钟,从而显著加快开发周期,并推动实现更敏捷的 CI/CD 流水线。更快的构建和部署让团队能够更迅速地迭代应用。
资源利用效率提升
由于开销较低,容器可实现更高的资源利用率。您可以在单个主机操作系统上运行多个容器,从而实现比虚拟机更高的部署密度。这种高效的“装箱”方式可将应用更密集地部署在服务器上,使企业有望减少服务器占用空间及相关基础设施成本。
进程和依赖项隔离
每个容器都在其独立的用户空间中运行,并拥有独立的进程树和网络接口。这种隔离意味着,一个容器化应用的库和依赖项不会与同一主机上运行的其他应用发生冲突。这简化了依赖管理,还可通过限制受入侵应用的潜在影响来增强安全性。
简化运维管理
容器化将部署单元标准化。运维团队可以管理容器,而无需管理整台机器或专有的应用堆栈。这种统一的方法简化了部署、扩缩和监控任务,并为通过 Kubernetes 等编排平台实现强大的自动化能力奠定了基础。
快速扩缩
容器轻量且启动迅速,非常适合需要快速扩缩的应用。当应用需求激增时,可几乎瞬时预配新容器实例以应对负载。这种弹性可扩缩性有助于确保应用持续响应和可用,无需大量人工干预。
容器生态系统由多种协同运行的工具组成。