什么是容器化?
作者
Stephanie Susnjara
Staff Writer
IBM Think
Ian Smalley
Staff Editor
IBM Think
什么是容器化?
容器化是指将软件代码与运行此代码所需的操作系统 (OS) 库和依赖项进行集体打包,以便创建可在任意基础设施上一致运行的单个轻量级可执行文件(称为容器)。
由于具有比虚拟机 (VM) 更高的可移植性和资源效率,容器已成为现代云原生应用程序事实上的计算单元。
容器化使开发人员能够更快速、更安全地创建和部署应用程序。使用传统方法时,开发人员需要在特定的计算环境中编写代码,当转移到新位置时,通常会产生错误和漏洞。例如,当开发人员将代码从台式计算机转移到虚拟机或从 Linux® 转移到 Windows 操作系统时,可能会发生这种情况。而容器化将应用程序代码与应用程序运行时所需的相关配置文件、库和依赖项捆绑在一起,因此消除了这一问题。这个单一的软件包或“容器”是从主机操作系统中抽象出来的。因此,它可以独立存在并且可以移植 — 能够在任何平台或云端运行,而且不会出现任何问题。
容器化和进程隔离的概念尽管已经诞生了几十年,但直到 2013 年开源 Docker 的出现,才加速了这项技术的采用。Docker 是一种行业标准,适用于采用简单开发工具和通用打包方法的容器。今天,越来越多的组织利用容器化技术来创建新的应用程序,并将现有的云应用程序进行现代化改造。
根据 Forrester1 的一份报告,74% 的美国基础设施决策者表示,他们的公司正在在本地或公有云环境中的平台即服务 (PaaS) 中采用容器。
容器是“轻量化”的,这意味着它们共享机器的操作系统内核,而且不会由于在每个应用程序内关联操作系统而产生开销。容器的容量本质上比虚拟机更小,需要的启动时间也更少。此功能允许以单个虚拟机所需的计算容量运行更多的容器。这一功能可提高服务器效率,进而降低服务器和许可成本。
最重要的是,容器化使应用程序能够在本地数据中心、混合云和多云环境中实现“一次编写,随处运行”。
这一可移植性可加快开发速度、防止云供应商锁定以及提供其他的显著优势,例如故障隔离、易于管理、简化安全性等等。
如下视频为容器化提供了进一步的说明:
容器化架构
容器化架构由四个基本组件层组成。
底层 IT 基础设施
底层 IT 基础设施是指包含物理计算资源(例如,台式计算机、裸机服务器)的基础层。
主机操作系统
该层运行于物理机或虚拟机上。操作系统负责管理系统资源,并为容器引擎提供运行时环境。
容器映像
容器引擎也称为运行时引擎,负责为容器映像(包含有关如何创建容器的指令的只读模板)提供执行环境。容器引擎在主机操作系统上运行,并为容器化应用程序执行资源虚拟化操作。
容器化应用程序
最后一层包含容器中运行的软件应用程序。
容器化的工作原理是什么?
容器可将应用程序封装为单个可执行软件包,而该软件包会将应用程序代码与其运行所需的所有相关配置文件、库和依赖项进行集体捆绑。
容器化应用程序是“隔离”的,这意味着它们不捆绑在操作系统的副本中。相反,开源容器运行时或容器引擎(例如 Docker 运行时引擎)安装在主机的操作系统上,并成为容器与同一个计算系统上的其他容器共享操作系统的管道。
其他容器层(例如,通用二进制文件 (bin) 和库)可在多个容器之间进行共享。此功能可消除在每个应用程序中运行操作系统所产生的开销,并使容器的容量更小、启动速度比虚拟机更快,从而提高服务器效率。将应用程序隔离为容器还可降低一个容器中的恶意代码影响其他容器或入侵主机系统的可能性。
从主机操作系统进行抽象可让容器化应用程序具有可移植性,且可在任意平台或云中统一、一致地运行。可轻松将容器从台式计算机传输到虚拟机 (VM),或从 Linux 传输到 Windows 操作系统。此外,容器还可在虚拟化基础设施或传统裸机服务器(无论是在本地还是在云数据中心内)上一致运行。
借助容器化,软件开发人员可以更快速、更安全地创建和部署应用程序,无论应用程序是传统的单体(单层软件应用程序)还是基于微服务架构而构建的模块化应用程序。开发人员可以从头开始构建新的基于云的应用程序作为容器化微服务,并将复杂的应用程序分解成一系列更小、更专业、更易于管理的服务。他们还可以将现有的应用程序重新打包到容器(或容器化微服务)中,以便更高效地使用计算资源。
在云端保持清醒头脑
获取每周 Think 时事通讯,了解有关在 AI 时代优化多云设置的专家指导。
立即订阅
虚拟化与容器化
人们常将容器与虚拟机 (VM) 进行比较,这是因为这两种技术均允许在单个环境中运行多种类型的软件(基于 Linux 或 Windows),从而大幅提升计算效率。
虚拟化利用了虚拟机管理程序,它是置于物理计算机或服务器上的一个软件层,且允许物理计算机将其操作系统和应用程序与硬件分离开来。借助虚拟化技术,多个操作系统和软件应用程序可同时运行并共享单个物理计算机或主机的资源(例如,CPU、存储和内存)。例如,IT 组织可在同一台服务器上同时运行 Windows 和 Linux 或多个操作系统版本,以及各种应用程序。
每个应用程序及其相关的文件系统、库和其他依赖项(包括操作系统 (OS) 的副本)均会集体打包为一个 VM。通过在一台物理机上运行多个虚拟机,可大幅节省资金、运营与能源成本。
另一方面,容器化可以更高效地使用计算资源。容器会创建单一可执行程序包,以便将应用程序代码及其运行时所需的所有依赖项捆绑在一起。不过,与虚拟机不同,容器不会捆绑在操作系统的副本中。相反,容器运行时引擎安装在主机系统的操作系统或“主机操作系统”上,并成为计算系统上的所有容器共享同一个操作系统的管道。
容器常被称为“轻量级”对象—它们会共享计算机的操作系统内核,且不会由于在每个应用程序内关联操作系统而产生开销(如同 VM 的情况)。其他容器层(通用二进制文件和库)也可在多个容器之间共享,因而容器的容量先天便比 VM 小,启动速度也更快。多个容器可在与单个 VM 相同的计算容量条件下运行,从而提高服务器效率并降低服务器与许可成本。
如下视频对容器与虚拟机进行了更深入的探索:
容器化的优点
容器化可为开发人员和开发团队提供巨大优点,尤其是在以下方面。
可移植性
容器会创建一个可执行软件包,此软件包是从主机操作系统中抽象出来的(不依赖主机操作系统或者不与其绑定)。因此,它是可移植的,并能够在任何平台或云端统一、一致地运行。
敏捷性:
开发和部署容器可以提高敏捷性,并使应用程序能够在最符合业务需求的云环境中运行。
速度
容器是“轻量化”的,这意味着它们共享机器的操作系统 (OS) 内核。此功能不但能够提高服务器效率,还可以降低服务器和许可成本,同时加快启动速度,因为无需启动操作系统。
故障隔离
每个容器化应用均为隔离状态,且独立于其他应用程序来运行。一个容器发生故障不会影响任何其他容器的继续运行。开发团队可在一个容器中发现并纠正任意技术问题,而无需在其他容器中停机。此外,容器引擎可利用任意操作系统安全隔离技术(如 SELinux 访问控制)来隔离容器内的故障。
高效率
在容器化环境中运行的软件可共享计算机的操作系统内核,而容器内的应用层则可跨多个容器共享。因此,容器的容量先天便比 VM 小,所需启动时间也较短,从而允许大量容器在与单个 VM 相同的计算容量条件下运行。此功能可提升资源优化并提高服务器效率,从而降低服务器与许可成本。
易于管理
容器化(尤其是与 Kubernetes 等容器编排平台配合使用时)可以自动执行并简化容器化应用程序的配置、部署和管理。
安全性
将应用程序隔离为容器先天便可防止恶意代码入侵影响其他容器或主机系统。此外,还可定义安全权限以自动阻止多余的组件进入容器,或限制与不必要的资源进行通信。
容器化平台和工具
随着基于容器的解决方案不断增长,对容器技术和软件代码打包方法相关标准的需求也应运而生。开放容器倡议 (OCI)2 是由 Docker 和其他行业领导者于 2015 年 6 月建立的一个 Linux 项目,它的出现是为了推广容器技术的通用、最小、开放标准和规范。从那时起,OCI 帮助扩大了开源引擎的选择,并使用户能够避免供应商锁定。开发人员还可以利用经过 OCI 认证的技术,以便能够使用各种开发运维工具构建容器化应用程序,并在自己选择的基础设施上一致地运行这些应用程序。
为澄清所有混淆之处,Docker 也指 Docker, Inc.3,而该公司会在 Docker 容器技术的基础上开发生产力工具。此外,它还与 Docker 开源项目4 有关,而 Docker, Inc. 和众多其他组织及个人均为该项目做出了贡献。
虽然 Docker 是最知名、使用频率最高的容器引擎技术,但更为广泛的生态系统已对 Containerd 和其他替代方案(如 CoreOS rkt、Mesos Containerizer、LXC Linux Containers、OpenVZ 和 crio-d)进行标准化。
AI 学院
利用混合云实现 AI 就绪
本课程由 IBM 资深思想领袖带领,旨在帮助企业领导者获得所需的知识,以便划分可以推动增长的 AI 投资的优先级。
转到视频集
容器编排和 Kubernetes
如今, ,一个组织可能拥有成百上千个容器,但各个团队几乎无法手动管理这么多的容器。而容器编排完全可以在这方面大显身手。
容器编排平台可安排并自动执行容器部署、联网、负载均衡、可扩展性和可用性等管理工作。
Kubernetes 是目前最受欢迎的容器编排工具,这是一项开源技术(最初由 Google 开源,基于他们名为 Borg 的内部项目),可以自动执行 Linux 容器功能。Kubernetes 可以与很多容器引擎配合使用,例如 Docker Engine。它还适用于任何符合开放容器倡议 (OCI) 的容器映像格式和运行时标准的容器系统。
虽然 Kubernetes 是行业标准,但也存在其他的常用容器编排平台,包括 Apache Mesos、Nomad 和 Docker Swarm。
要了解有关容器编排的更多信息,请观看此视频,其中解释了 Kubernetes 的工作原理:
容器化和云计算
微服务和容器化
容器化是应用程序现代化的其中一个组成部分。此流程是指将单体(旧版)应用程序转换为基于微服务架构而构建的云原生应用程序,而这些应用程序旨在能集成到任意云环境中。
早期的单体模型将软件应用程序与相关用户界面和底层数据库组合成单服务器平台上的单一单元中,而相比之下,微服务是一种更好的应用程序开发和管理方法。借助微服务,复杂的应用程序被分解成一系列更小、更专业的服务,每种服务都有自己的数据库和业务逻辑。微服务在通用接口(例如 API)和 REST 接口(例如 HTTP)之间进行通信。通过使用微服务,开发团队可以专注于更新应用程序的特定方面,而不会影响整个应用程序,这样就加快了开发、测试和部署速度。
微服务和容器化背后的概念是相似的。这两者都是软件开发实践,本质上都是将应用程序转换成若干组可移植、可扩展、高效率且易于管理的更小型服务或组件。
此外,将微服务与容器化结合使用时,效果也很好。容器为任何应用程序提供了轻量化封装,无论是传统的单体微服务还是模块化微服务。在容器内开发的微服务可以获得容器化的所有固有优势,例如可移植性。
总体而言,容器、微服务和云计算已相互融合,从而将应用程序开发和交付提升到一个新的水平。这些技术可简化 DevOps 工作流并支持持续集成和持续交付 (CI/CD) 管道,从而加快软件开发。这些下一代方法已为软件开发生命周期注入敏捷性、效率和可靠性,从而可更快地向用户和市场交付容器化应用程序和增强功能。
云迁移和容器化
各个组织不断向云端迁移,用户可以在云端快速、高效地开发应用程序。容器化已成为云迁移的关键业务用例,云迁移是指将数据、应用程序和工作负载从本地数据中心转移到基于云的基础设施或者从一个云环境转移到另一个云环境的过程。
云迁移是组织的混合云环境中的一个重要组成部分,此环境结合了本地、公有和私有云服务,以创建单一、灵活、经济高效的 IT 基础设施,从而支持跨云环境的工作负载管理并将这些管理工作自动化。
混合云和容器化
如今,可以从任何连接到互联网的设备访问基于云的应用程序和数据,因此团队成员可以随时随地远程工作。Amazon Web Services (AWS)、Google Cloud Services、IBM® Cloud 或 Microsoft Azure)等云服务提供商 (CSP) 会管理底层基础设施,以便为组织节省服务器和其他设备的成本,并提供自动化网络备份以提高可靠性。可以按需扩展云基础设施,并随着负载需求的变化动态调整计算资源、容量和基础设施。此外,CSP 还会定期更新产品,以使用户能够持续获得最新的创新技术,例如生成式 AI。
容器即服务 (CaaS)
很多顶级云服务提供商均提供容器即服务 (CaaS)。CaaS 本质上是基础设施即服务 (IaaS) 的一个子集,它介于云计算堆栈中的 IaaS 与平台即服务 (PaaS) 之间,从而可在 IaaS 提供的操控度与 PaaS 的简单性之间取得平衡。
CaaS 提供了一个基于云的平台,用户可以在其中简化基于容器的虚拟化和容器管理流程。CaaS 还提供了容器运行时、编排层和持久存储管理。2022 年,全球的 CaaS 市场价值接近 20 亿美元。5
容器化与无服务器
无服务器计算(无服务器)是一种应用程序开发和执行模型,可以帮助开发人员构建和运行应用程序代码,而无需配置或管理服务器或后端基础设施。
在无服务器计算中,云服务提供商会按需分配机器资源,以便代表其客户来维护服务器。具体而言,开发人员和 CSP 负责配置运行代码所需的云基础设施,并按需扩展或缩减基础设施。提供商采用即用即付的定价模式。
无服务器计算可让团队专注于编写代码而不是管理基础设施,从而可提高开发人员的工作效率。相比之下,容器提供更强的控制性和灵活性,从而有助于管理现有应用程序并将其迁移到云端。
容器化和安全性
容器化环境的安全实践需要采用一种跨越容器整个生命周期(包括开发、测试和部署)的策略。
这些实践必须应对所有堆栈层的问题,包括容器化平台、容器映像、编排平台以及个别容器和应用程序。
首先,容器安全策略必须围绕零信任框架来制定。该模型会对每个用户连接进行验证和授权,并确保此交互符合组织安全策略的条件化要求。零信任安全策略还通过使用来自尽可能多的数据源的上下文并根据动态策略来对每个设备、网络流和连接进行身份验证和授权。
随着越来越多的组织开始依赖容器化技术(包括编排平台),以便部署和扩展其应用程序,容器安全性已然成为一个越来越重要的问题。根据 Red Hat 的一份报告6,漏洞和错误配置是容器和 Kubernetes 环境的最大安全问题。
如前所述,容器化应用程序先天便具备一定程度的安全性,因为它们可作为隔离的进程来运行,且会独立于其他容器来运行。由于真正实现了隔离,因而此特性可防止任意恶意代码影响其他容器或入侵主机系统。但是,容器内的应用层常会跨不同容器来共享。就资源效率而言,这是一项优点,但它也为跨容器的干扰和安全漏洞打开了大门。共享操作系统也存在类似问题,因为多个容器可与同一主机操作系统相关联。针对通用操作系统的安全威胁可能会影响所有关联的容器;相反,容器泄露也可能会入侵主机操作系统。
但是,与容器映像自身相关的风险和漏洞的情况又是如何呢?强大的容器化策略包括一种“默认安全”方法,即安全性应为平台所固有的一项功能,而不是一个单独部署和配置的解决方案。为此,容器引擎支持底层操作系统中固有的所有默认隔离属性。您可定义安全权限以自动阻止多余的组件进入容器,或限制与不必要的资源进行通信。
例如,Linux 命名空间有助于为每个容器提供系统的隔离视图;这包括联网、挂载点、进程 ID、用户 ID、进程间通信和主机名设置。命名空间可以通过每个容器内的进程限制对任何此类资源的访问。通常无法从容器内访问不支持命名空间的子系统。管理员可以通过简单的用户界面轻松创建和管理每个容器化应用程序上的这些“隔离约束”。
此外,还有各种容器安全解决方案可用于在整个企业中自动进行威胁检测和响应。这些工具有助于监控和执行安全策略,并满足行业标准以确保数据流动的安全性。例如,安全管理软件工具可帮助实现 CI/CD 管道自动化、在进入生产环境之前阻止漏洞,并通过实时可见性来调查可疑活动。此方法属于 DevSecOps,它是一种应用与开发流程,且可在软件开发生命周期的每个级别自动集成安全实践。