Container 是一个轻量级的独立包,它封装了一个完整的运行时环境,包括应用程序及其依赖项(库、二进制文件和任何其他配置文件),从而提高了应用程序的可移植性、可扩展性、安全性和敏捷性。
容器受到开发人员和运营商的欢迎,因为它们提供了一种直接的方式来部署和管理应用程序,而不管目标环境如何。他们 通过改进开发和运营团队之间的交接来促进DevOps 和 DevSecOps实践。
容器高效地消耗资源,实现高密度和资源利用率。尽管容器几乎可以用于任何应用程序,但它们经常与微服务相关联 ,其中多个容器运行单独的应用程序组件或服务。组成应用程序的容器通常使用容器编排平台(例如 Kubernetes )进行协调和管理。
容器是通过将来自一个或多个存储库的多个映像的应用程序以及任何库或其他应用程序依赖项打包来创建的,从而消除了可移植性和兼容性问题。
容器与虚拟机
每个虚拟机 (VM) 运行一个操作系统的完整或部分实例,而多个容器共享一个操作系统实例。容器包括运行应用程序所需的一切,使多个容器化应用程序能够在单个主机系统上独立运行。因为可以在一个虚拟机中运行多个容器, 所以这两种技术可以一起使用
使用容器有什么好处?
使用容器构建应用程序可以加速新功能的交付并鼓励持续创新的环境。好处包括:
敏捷。改进的开发人员敏捷性推动了生产力的提高和应用程序开发的速度。容器简化 了CI/CD管道,是DevOps 团队和微服务部署 的理想选择 。
可扩展性和高可用性。使用 Kubernetes,容器部署可以随着工作负载需求的变化而自动扩展或缩减,从而提高应用程序的可用性。
便携性。与虚拟机相比,容器消耗的资源更少,重量也更轻。容器化应用程序与基础架构无关,无论部署在何处,它们的运行方式都是相同的。
弹性。容器化应用程序与操作系统和其他容器隔离和抽象;一个容器可以在不影响其他正在运行的容器的情况下发生故障。
容器标准
容器格式和运行时环境的标准由开放容器倡议 (OCI) 控制,该项目成立于 2015 年,旨在创建开放的行业标准。OCI 目前提供两种规范:运行时规范(runtime-spec)和图像规范(image-spec)。
容器安全
容器需要改变安全策略的实施和管理方式。应使用DevSecOps方法尽可能将安全性构建到容器生命周期中 。安全团队与开发和运营团队合作,调整现有的治理和合规策略,以适应新工具和对应用程序生命周期的更改。
容器自动化
手动工作会减慢开发团队的速度。容器自动化使开发人员能够专注于代码而不是打包。容器镜像是分层构建的。使用自动化的容器构建方法,每当层更改时,只需更新该层。例如,如果只需要更新系统库,则只需重建包含库的层。由于其他层保持不变,因此减少了测试和验证负担,使更新的容器能够更快、更频繁地投入生产。
Docker
自 2013 年推出以来,Docker 几乎是容器的代名词,并且继续被用于构建容器镜像。Docker 环境包括容器运行时以及容器构建和镜像管理。因为 Docker 构建了一个 OCI 标准的容器镜像,所以 Docker 镜像将在任何符合 OCI 的容器运行时上运行。
Kubernetes
Kubernetes 是一种开源容器编排器,已成为事实上的标准。Kubernetes 通过声明性配置和自动化来自动化容器的部署、负载平衡、资源分配和安全实施。它使容器化应用程序保持在所需状态下运行,确保它们具有可扩展性和弹性。容器编排有助于管理容器生命周期的复杂性。这对于具有大量容器的分布式应用程序尤其重要。
Kubernetes 正在转向容器运行时接口 (CRI),它支持更广泛的容器运行时集,并在不同运行时之间实现顺畅的互操作性。 2020 年 12 月宣布弃用 Docker 运行时 与 Kubernetes 一起使用。
容器用例
对于开发人员
- 提高跨不同平台和配置的应用程序可移植性,以便在一个语言编译器或解释器版本上开发的代码可以在后续版本上完美运行,无需修改。
- 开发人员无需在相同的基础架构上进行开发、测试和部署,因此在笔记本电脑上编写代码的开发人员可以确信应用程序将在任何其他基础架构上按需要运行,无论是本地服务器还是基于云的 VM .
- 促进 CI/CD 等敏捷开发流程,加快代码接受和部署。
用于 IT 运营
- 通过以轻量级方式与其他应用程序隔离来提高应用程序的安全性。
- 跨不同操作系统版本、网络拓扑或存储配置以及云平台的容器化应用程序的无缝迁移。
- 通过使多个应用程序容器在单个操作系统实例上运行来提高 IT 效率。由于容器的大小通常为数十兆字节,而虚拟机的大小通常为十吉字节或更多吉字节,因此可以在单个服务器实例上运行大量容器。
通过在几毫秒而不是几分钟内启动额外的容器实例来启动虚拟机,从而提供极高的按需可扩展性。