容器化是将软件代码与运行代码所需的操作系统 (OS) 库和 依赖项打包在一起,创建一个可在任何基础架构上一致运行的轻量级可执行文件(即容器)。 与虚拟机 (VM) 相比,容器具有更高的可移植性和资源效率,现已成为现代云原生应用的实际计算单元。
容器化使开发人员能够更快、更安全地创建和部署应用。 使用传统方法时,代码是在特定计算环境中开发的,如果转移到新位置,通常会导致错误。 例如,如果开发人员将代码从桌面计算机转移到虚拟机或从 Linux 转移到 Windows 操作系统,通常会导致错误。 容器化通过将应用代码与运行代码所需的相关配置文件、库和依赖项捆绑在一起,消除了这个问题。 这个单一软件包(也就是“容器”)从主机操作系统中提取出来,因此它是独立的,可移植到任何平台或云上运行,而不会产生任何问题。
容器化和进程隔离的概念提出已有数十年之久,而 2013 年开源 Docker 引擎的出现,则加快了这种技术的采用进程,这是一种容器行业标准,包含简单的开发者工具和一套通用的打包方法。 如今,组织越来越多地使用容器化来创建新应用,并面向云环境对现有应用进行现代化改造。 最近的一项 IBM 调查 (PDF, 1.4 MB) 显示,61% 的容器采用者报告称,他们在过去两年里构建的新应用中有 50% 或更多的应用使用容器;64% 的采用者预计在未来两年内将有 50% 或更多的现有应用会被放入容器中。
容器通常被称为是“轻量级”的,这意味着它们共享机器的操作系统内核,从而消除了在每个应用中关联操作系统的开销。 本质上,容器所需的计算容量比虚拟机小,启动时间也更短,因此运行一个虚拟机所需的计算容量可运行大量的容器。 这有助于提高服务器效率,降低服务器和许可成本。
也许最重要的是,容器化支持应用“一次编写,随处运行”。 这种可移植性加速了开发进程,防止被云供应商锁定,同时提供了其他显著优势,如故障隔离、易管理性、简化的安全性等(见下文)。
容器将应用封装为单一的可执行软件包,将应用代码与运行代码所需的所有相关配置文件、库和依赖项捆绑在一起。 容器化应用是“隔离的”,因为它们不会捆绑在操作系统的副本中。 在主机操作系统上会安装开源运行时引擎(如 Docker 运行时引擎),该引擎成为容器在同一计算系统上与其他容器共享操作系统的管道。
其他容器层(如公共 bin 和库)也可以在多个容器之间共享。 这避免了在每个应用中运行操作系统的开销,使得容器的计算容量更小,启动速度更快,从而提高服务器效率。 将应用隔离为容器还会减少一个容器中存在恶意代码从而影响其他容器或入侵主机系统的机会。
通过从主机操作系统中抽象出来,使得容器化应用具备了可移植性,能够在任何平台或云端以统一方式运行。 容器可以很方便地从桌面计算机转移到虚拟机 (VM),或从 Linux 转移到 Windows 操作系统,它们以统一方式,在本地或云端的虚拟化基础架构或传统的“裸机”服务器中运行。 这可确保软件开发人员继续使用自己最熟悉的工具和流程。
这就是为什么企业迅速采用容器化作为出色应用开发和管理方法的原因所在。 容器化使开发人员能够更快、更安全地创建和部署应用,无论应用是传统的单体式应用(单层软件应用),还是基于微服务架构而构建的模块化应用。 我们可采用容器化的微服务方式,从头构建基于云的新应用,将复杂的应用分解成一系列易于管理的小型专用服务。 现有的应用可以重新打包到容器(或容器化的微服务)中,进而更有效地使用计算资源。
容器化为开发人员和开发团队带来了显著效益。 具体包括以下优势:
可移植性:容器创建可执行的软件包,它是从主机操作系统中提取出来的(不依赖于主机操作系统),因此可移植到任何平台或云端,并以统一的方式运行。
敏捷性:用于运行容器的开源 Docker 引擎建立了容器的行业标准,并提供简单的开发者工具和统一的打包方法,且同时适用于 Linux 和 Windows 操作系统。 容器生态系统已开始支持由“开放式容器倡议”(OCI) 所管理的容器。 软件开发人员可以继续使用敏捷方法或 DevOps 工具和流程,快速开发和增强应用。
速度:我们通常说容器是“轻量级”的,这意味着它们共享机器的操作系统 (OS) 内核,并且不会因这种额外的开销而陷入困境。 这不仅提高了服务器效率,还降低了服务器和许可成本,同时有助于缩短启动时间,这是因为无需引导操作系统。
故障隔离:每个容器化应用都相互隔离且独立运行。 一个容器发生故障并不会影响任何其他容器的继续运行。 开发团队可以发现并纠正一个容器中的任何技术问题,而不需要停止运行其他容器。 此外,容器引擎还可利用任何操作系统安全隔离方法(如 SELinux 访问控制),隔离容器中的故障。
效率:在容器化环境中运行的软件共享机器的操作系统内核,并且一个容器中的应用层可与其他容器共享。 因此,本质上,容器所需的计算容量比虚拟机小,启动时间也更短,运行一个虚拟机所需的计算容量可运行大量的容器。 这有助于提高服务器效率,降低服务器和许可成本。
易于管理:容器编排平台可自动安装、扩展和管理容器化工作负载和服务。 容器编排平台有助于简化管理任务,例如扩展容器化应用,推出应用的新版本,以及提供监视、日志记录和调试等功能。 Kubernetes 可能是最受欢迎的容器编排系统,这种开源技术最初由 Google 提供,基于其内部项目 Borg,一开始用于自动执行 Linux 容器功能。 Kubernetes 可与许多容器引擎(如 Docker)一起工作,但它也能够与任何符合“开放式容器倡议”(OCI) 的容器映像格式和运行时标准的容器系统一起工作。
安全性:将应用以容器形式隔离起来,本质上可防止恶意代码影响其他容器或主机系统。 此外,可定义安全许可权,自动阻止不需要的组件进入容器,或者限制与不必要资源的通信。
用户对于基于容器的解决方案的兴趣和使用量快速增长,因此需要制定有关容器技术和软件代码打包方法的标准。 Docker 和其他行业领导者于 2015 年 6 月建立的“开放式容器倡议”(OCI) 旨在推广有关容器技术的最低程度的通用开放标准和规范。 因此,OCI 正在帮助拓宽开源引擎的选择范围。 用户不会被特定供应商的技术所套牢,而是可以充分利用 OCI 认证的技术,使用一系列多样化的 DevOps 工具构建容器化应用,并在自己选择的基础架构上以统一方式运行这些应用。
现如今,Docker 是最知名、使用人数最多的容器引擎技术之一,但它并不是唯一可用选项。 生态系统正在使容器以及其他替代方案(如 CoreOS rkt、Mesos Containerizer、LXC Linux Containers、OpenVZ 和 crio-d)日渐实现标准化。 这些技术的功能和默认配置各不相同,但通过坚持采用与时俱进的 OCI 规范,可确保这些解决方案与供应商无关并通过认证,既可在多种操作系统上运行,也可在多个环境中使用。
各种规模的软件企业都开始将微服务作为出色的应用开发和管理方法。与较早的单体式模式将应用软件与关联的用户界面和底层数据库结合到单个服务器平台上的单一单元中不同, 微服务另辟蹊径,将复杂应用分解成一系列更小、更专业化的服务,每个服务都具有自己的数据库和业务逻辑。 然后,微服务通过公共接口(如 API)和 REST 接口(如 HTTP)相互通信。 通过使用微服务,开发团队可以集中精力更新应用的特定领域而不影响整体,从而加快开发、测试和部署流程。
微服务和容器化背后的概念相似,都是软件开发实践,本质上是将应用转换为一系列可移植、可扩展、高效而且更易于管理的小型服务或组件。
而且,微服务和容器化结合起来使用效果更好。 容器为任何应用提供轻量级的封装,无论是传统的单体式应用,还是模块化的微服务。 在容器内开发的微服务,可获得容器化的所有内在优点,比如在开发流程和供应商兼容性方面的可移植性优点(不会被供应商套牢),以及开发人员敏捷性、故障隔离、服务器效率、安装自动化、缩放和管理以及安全层等优点。
如今的通信正迅速迁移到云端,用户可在此快速高效地开发应用。 团队成员可通过任何与互联网连接的设备访问基于云的应用和数据,从而能够远程随时随地开展工作。 云服务提供商 (CSP) 管理底层基础架构,这节省了组织的服务器和其他设备的成本;此外,CSP 还提供自动化网络备份功能,进一步增强了可靠性。 云基础架构可按需扩展,根据负载需求的变化,动态调整计算资源、容量和基础架构。 在此基础上,CSP 定期更新产品,使用户能够持续获得最新的创新技术。
容器、微服务和云计算正共同努力,将应用开发和交付提升到传统方法和环境无法企及的新水平。 这些下一代方法显著提高了软件开发生命周期的敏捷性、效率、可靠性和安全性,使应用和增强功能可以更快地交付给最终用户和市场。
容器化应用具有一层内在的安全防护,因为它们可以作为隔离的进程运行,并且可以独立于其他容器运行。 这是真正的隔离,可以防止任何恶意代码影响其他容器或入侵主机系统。 但是,容器中的应用层通常在容器之间共享。 在资源效率方面,这是在做加法,但也打开了容器间相互干扰和安全漏洞的大门。 由于多个容器可与同一主机操作系统关联,因此共享操作系统也是个问题。 公共操作系统面临的安全威胁可能会影响所有关联的容器,反之,容器安全违规也可能会威胁到主机操作系统。
容器映像本身怎么样呢? 容器内打包的应用和开源组件如何提高安全性? 包括 Docker 在内的容器技术提供商仍在积极应对容器安全挑战。 容器化采用“默认安全”的方法,认为平台具备固有的安全性,无需单独部署和配置解决方案。 为此,容器引擎支持底层操作系统固有的所有默认隔离属性。 可定义安全权限,自动阻止不需要的组件进入容器,或限制与不必要资源的通信。
例如,Linux 名称空间有助于向每个容器提供系统的隔离视图;这包括网络、安装点、进程标识、用户标识、进程间通信和主机名设置等。 名称空间可用于限制通过每个容器内的进程对其中任何资源的访问。 通常,无法在容器中访问没有名称空间支持的子系统。 管理员可通过简单的用户界面,在每个容器化应用上轻松创建和管理这些“隔离约束”。
研究人员正致力于进一步加强 Linux 容器的安全性,并提供了广泛的安全解决方案,用于在整个企业中自动进行威胁检测和响应,监控和强制执行合规性以满足行业标准和安全策略要求,确保通过应用和终端的数据流的安全等等。
人们常常将容器与虚拟机 (VM) 做比较,因为这两种技术都通过支持在单一环境中运行多种类型的软件(基于 Linux 或 Windows),实现显著的计算效率。 然而,容器技术正逐渐证明,它能够比虚拟化技术带来更显著的效益,因此迅速成为 IT 专业人士所青睐的技术。
虚拟化技术支持多个操作系统和软件应用同时运行,共享单一物理计算机的资源。 例如,IT 组织可在同一服务器上同时运行 Windows 和 Linux 或多个版本的操作系统,以及多个应用。 每个应用及其相关文件、库和依赖项(包括操作系统的副本)都打包在一起,成为一个虚拟机。 通过在单一物理机器上运行多个虚拟机,可以节约大量资本、运营和能源成本。
有关虚拟化的更多概述,请观看视频“2019 年虚拟化现状”和“虚拟化:完整指南”。
而另一方面,容器化使用计算资源的效率更高。 容器创建了单一可执行软件包,将应用代码与运行代码所需的所有相关配置文件、库和依赖项捆绑在一起。 但与虚拟机不同,容器并非捆绑在操作系统副本中。 相反,容器运行时引擎安装在主机系统的操作系统上,成为计算系统上所有容器共享同一操作系统的管道。
如前所述,我们通常说容器是“轻量级”的,因为它们共享机器的操作系统内核,避免了在每个应用中关联操作系统的开销(虚拟机就是这种情况)。 其他容器层(公共 bin 和库)也可在多个容器之间共享,这使得容器本身的计算容量比虚拟机更小,而且启动速度更快。 用于运行单一虚拟机的计算容量可运行多个容器,因此有助于提高服务器效率,进一步降低服务器和许可成本。
Red Hat OpenShift on IBM Cloud 在公有云和混合云环境中使用 OpenShift,着力提高运行速度,增强市场响应能力,改善可扩展性和可靠性。
借助 IBM Cloud Satellite,您可以随时随地在本地、边缘和公有云环境中启动一致的云服务。
以无服务器工作负载的形式运行容器映像、批处理作业或源代码,而无需调整规模、部署、联网或扩展