[转]What are containers (container-based virtualization or containerization)?
容器是一种可以虚拟打包和隔离应用程序以进行部署的软件。 容器可以共享对操作系统 (OS) 内核的访问,而无需传统的虚拟机 (VM)。
容器技术起源于 1960 年代的分区,以及 1970 年代作为 Unix 的一部分开发的 chroot 进程隔离。 它的现代形式表现为应用程序容器化,如 Docker,和系统容器化,如 LXC(Linux Containers)。 这两种容器样式都使 IT 团队能够从底层基础架构中抽象出应用程序代码,从而简化版本管理并实现跨各种部署环境的可移植性。
容器镜像包括在操作系统运行时通过容器引擎执行的信息。 容器化应用程序可以由多个容器镜像组成。 例如,一个 3 层应用程序可以由前端 Web 服务器、应用程序服务器和数据库容器组成,它们各自独立执行。 容器本质上是无状态的,不保留会话信息,尽管它们可以用于有状态的应用程序。 一个容器映像的多个实例可以同时运行,并且新实例可以替换失败的实例,而不会中断应用程序的运行。 开发人员在开发和测试期间使用容器,并且越来越多的 IT 运营团队在实时生产 IT 环境中部署在容器上,这些容器可以在裸机服务器、VM 和云上运行。
容器如何工作
容器包含运行所需软件所需的组件。 这些组件包括文件、环境变量、依赖项和库。 主机操作系统限制了容器对物理资源的访问,例如 CPU、存储和内存,因此单个容器不能消耗主机的所有物理资源。
容器image文件是应用程序或服务的完整、静态和可执行版本,并且因技术而异。 Docker 镜像由多个层组成,这些层从一个基础镜像开始,其中包含在容器中执行代码所需的所有依赖项。 每个image在静态不变层之上都有一个可读/可写层。 因为每个容器都有自己特定的容器层来定制特定的容器,所以可以在多个容器中保存和重用底层image层。 开放容器倡议 (OCI) image由清单、文件系统层和配置组成。 OCI image有两个操作规范:运行时和image规范。 运行时规范概述了文件系统包的功能,这些文件包含性能和运行时所需的所有数据。 image规范包含在 OCI 容器中启动应用程序或服务所需的信息。
容器引擎执行image,许多组织使用容器调度程序和/或编排技术(如 Kubernetes)来管理部署。 容器具有很高的可移植性,因为每个镜像都包含在容器中执行代码所需的依赖项。 例如,容器用户可以在测试期间在 Amazon Web Services (AWS) 云实例上执行相同的image,然后在本地戴尔服务器上执行生产,而无需更改容器中的应用程序代码。
容器与虚拟机
容器与服务器虚拟化的不同之处在于,虚拟化架构模拟了硬件系统。 每个虚拟机都可以在独立的环境中运行操作系统,并通过抽象的方式呈现给应用程序,以替代物理机。 虚拟机管理程序从池化 CPU、内存、存储和网络资源中模拟硬件,这些资源可以由多个 VM 实例多次共享。
![](https://img.haomeiwen.com/i15531792/0ceb1a58ee4764bf.png)
VM 可能需要大量资源开销,例如内存、磁盘和网络输入/输出 (I/O),因为每个 VM 都运行一个操作系统。 这意味着虚拟机可能很大,并且比容器创建所需的时间更长。 因为容器共享操作系统内核,所以只需一个操作系统实例就可以运行多个独立的容器。 与用于 VM 或物理应用程序安装的操作系统相比,支持容器的操作系统也可以更小,功能更少。
应用容器和系统容器
应用容器,例如 Docker,封装了应用程序在操作系统上运行所需的文件、依赖项和库。 应用容器使用户能够为多个独立的应用程序或构成单个应用程序的多个服务创建和运行单独的容器。 例如,应用程序容器非常适合微服务应用程序,其中构成应用程序的每个服务彼此独立运行。
系统容器(例如 LXC)在技术上与应用容器和虚拟机相似。 系统容器可以运行操作系统,类似于操作系统封装在虚拟机上的运行方式。 然而,系统容器并不模拟系统的硬件——相反,它们的操作类似于应用容器,用户可以安装不同的库、语言和系统数据库。
容器的好处
由于容器与主机共享相同的操作系统内核,因此容器比需要单独操作系统实例的 VM 更高效。
容器比其他应用程序托管技术具有更好的可移植性:它们无需更改代码, 就可以在相同操作系统的主机之间移动。 这种将应用程序操作代码封装在容器中的做法,无需管理客户操作系统环境变量或库依赖项。
容器化的支持者指出,与传统虚拟化相比,这种方法的主要优势是内存、CPU 和存储效率的提高。 由于容器没有虚拟机所需的开销,例如单独的操作系统实例,因此可以在同一基础架构上支持更多容器。 一个普通的物理主机可以支持几十个虚拟机或数百个容器——但是,在实际操作中,主机、容器和虚拟机的大小是高度可变的,取决于特定应用程序的需求。
对容器感兴趣的一个主要因素是它们在整个应用程序生命周期中是一致的。 这促进了敏捷环境并促进了新方法,例如持续集成 (CI) 和持续交付 (CD)。 它们的启动速度也比虚拟机快,这对于分布式应用程序很重要。
容器的缺点
容器化的一个潜在缺点是缺乏与主机操作系统的隔离。 由于容器共享一个主机操作系统,与基于管理程序的虚拟化相比,安全威胁更容易访问整个系统。 解决此安全问题的一种方法是从运行在 VM 上的操作系统中创建容器。 这种方法确保,如果在容器级别发生安全漏洞,攻击者只能访问该 VM 的操作系统,而不能访问其他 VM 或物理主机。
容器化的另一个缺点是缺乏操作系统的灵活性。 在典型部署中,每个容器必须使用与基本操作系统相同的操作系统,而虚拟机管理程序实例具有更大的灵活性。 例如,在基于 Linux 的主机上创建的容器无法运行 Windows Server 操作系统的实例或旨在在 Windows Server 上运行的应用程序。
监控可见性可能是另一个问题。 在服务器上运行多达数百个或更多容器时,可能很难看到每个容器中发生了什么。
为了解决容器的运营挑战,有许多正在开发中,或者已经完成开发的的技术及开源项目, 这些项目来自容器本身或其他供应商,包括安全跟踪系统、基于日志数据的监控系统以及监督运营的协调器和调度器。
常见容器用途
容器经常与微服务和云配对,但对单个应用程序和本地数据中心也有好处。
容器非常适合与微服务一起使用,因为构成应用程序的每个服务都打包在一个独立可扩展的容器中。 例如,微服务应用程序可以由容器化服务组成,这些服务可以生成警报、记录数据、处理用户识别并提供许多其他服务。 每个服务都在相同的操作系统上运行,同时保持单独隔离。 每项服务都可以扩展和缩减以响应需求。 云基础设施专为这种弹性、无限扩展而设计。
传统的单片应用程序架构被设计成程序中的所有代码都写在一个可执行文件中。 单体应用程序不像分布式应用程序那样容易扩展,但它们可以被容器化。 例如,Docker 对传统应用程序进行现代化改造 (MTA) 可帮助用户将单体应用程序按原样转换为 Docker 容器,通过调整、 完全重建和重新架构 等方法, 实现更好的扩展。
容器工具和平台提供商
许多供应商提供容器平台和容器管理工具,例如云服务和编排器。 Docker 和 Kubernetes 是容器技术领域的知名产品,这些技术支撑着许多其他产品。
Docker 是一个开源应用程序容器平台,专为 Linux 以及最新支持的 Windows、Apple 和大型机操作系统而设计。 Docker 利用资源隔离功能(例如 cgroups 和 Linux 内核)来创建隔离容器。 Docker 是一家以销售企业支持的容器托管和管理产品而成立的同名公司。 2019 年 11 月,该公司将 Docker Enterprise 业务出售给了 Mirantis。
Microsoft 提供容器化技术,包括 Hyper-V 和 Windows Server 容器。 这两种类型的创建、维护和操作类似,因为它们使用相同的容器映像。 但是,服务在隔离级别方面有所不同。 Windows Server 容器中的隔离是通过命名空间、资源控制和其他技术实现的。 Hyper-V 容器通过在轻量级 VM 中运行的容器实例提供隔离,这使得产品更像是一个系统容器。
由 Google 创建的开源容器编排器 Kubernetes 已成为容器编排的事实标准。 它将容器组织到节点上的 Pod 中,这些 Pod 是托管资源。 Kubernetes 可以自动化、部署、扩展、维护和以其他方式操作应用程序容器。 大量产品基于 Kubernetes 开发,并具新加功能和/或支持,例如 Rancher、Red Hat OpenShift 和 Platform9。
除了 Kubernetes,还可以使用其他容器编排工具,例如 D2iQ(以前称为 Mesosphere)的 DC/OS 和 Docker Swarm。 Mirantis 最初打算专注于 Kubernetes,现在计划支持和改进 Swarm 的企业版,同时开源社区版仍然存在。
主流的云供应商都提供各种容器即服务 (CaaS) 产品,包括 Amazon Elastic Container Service (ECS) 和 Elastic Kubernetes Service (EKS)、AWS Fargate、Google Kubernetes Engine (GKE)、Microsoft Azure Container Instances (ACI) )、Azure Kubernetes 服务 (AKS) 和 IBM Cloud Kubernetes 服务等等。 容器也可以部署在公共或私有云基础设施上,而无需使用云供应商提供的专用容器产品。
容器的未来
除了应用程序开发和测试,企业逐渐增加了容器软件的生产部署。 对于大多数组织来说,他们的重点已经转移到容器编排上,尤其是大多数供应商现在都支持的 Kubernetes。 随着组织整合其 IT 运营流程和工具集,他们需要更精细的控制来监控和保护容器内的内容。
容器软件的采用正在扩展到 IT 的各个领域,从安全到网络再到存储。 一些组织正在计划如何在容器和 Kubernetes 上部署有状态的应用程序,例如数据库和机器学习应用程序,以确保与无状态应用程序一起进行一致的管理。 一些容器和容器编排的早期采用者已经开始超越容器功能和编排,并计划将哪些容器基础设施作为更广泛的敏捷或 DevOps 转换的一部分使他们能够做。 示例包括开发人员自助服务器接口、内置 CI/CD、GitOps、服务网格、多云管理和多租户安全、无服务器和事件驱动计算。 一种潜在的趋势是将容器和 Kubernetes 的使用扩展到网络边缘,以便在不同位置和各种设备上远程部署和管理软件。 然而,这仍然是一个早期趋势。
网友评论