介绍
如果您投资于 Web 开发领域,您可能已经听说过容器化及其所有优势,甚至可以通过使用众多可用的容器化解决方案之一来享受它们。 毫不夸张地说,软件容器化改变了世界,就像从裸机到虚拟机 (VM) 的变化一样。
什么是容器?
容器是一个软件包,其中包括它使用的所有操作系统工具(也称为依赖项)以作为标准单元运行。 容器化应用程序旨在可靠地运行,而不管主机上安装的依赖项如何。
容器的大小通常为几十兆字节,而不是常规的虚拟机,后者的时钟频率为几十千兆字节。 与完整的虚拟机相比,容器也几乎可以立即启动,并且使用的主机资源要少得多,同时无论它们在哪里运行,仍然提供类似的进程隔离和环境一致性。 他们如何设法实现所有这些好处?
在引擎盖下看
从技术角度来看,容器可以被认为是一种虚拟机。 关键的区别在于容器虚拟化发生在操作系统级别,而传统的管理程序虚拟化在硬件层。 换句话说,容器不是模仿硬件平台来运行完整的操作系统,而是模仿操作系统来运行应用程序。
因此,容器减少了专用于虚拟化所需资源的数量,并与主机共享其中一些资源。
容器可以被描述为一个标准的代码单元,因为它涉及封装应用程序及其依赖项,以确保它们无论计算环境如何都能可靠地运行。 鉴于与操作系统的所有交互都是虚拟化的,容器作为类似于传统虚拟机的独立进程运行。
容器格式的结构由 开放容器倡议 (OCI). 实现这些标准的最流行的容器化引擎是 Docker,它为容器的标准功能添加了几个有用的特性。 Docker 容器镜像是只读的,具有处理对虚拟文件系统的任何更改的读/写卷。 当旋转容器的多个副本时,它们使用相同的基本映像。 只有更改被单独存储,这大大减少了在同一台物理机器中处理数十或数百个容器所需的磁盘空间。
安全性和性能
允许容器实现这种非常低的资源使用的部分原因是它们共享主机的内核,尽管在进程级别进行了虚拟化。 这意味着危及操作系统内核稳定性的容器可能会影响主机或在其上运行的其他容器。
值得庆幸的是,即使在应用程序行为异常的情况下,容器也提供了从故障中恢复并缓解此类问题的方法。 由于基础映像仍然完好无损,因此可以自动将容器重新引导回已知的干净状态并立即继续处理请求。 由于启动时间以毫秒为单位,因此容器重启导致的任何停机时间几乎都不会引起注意。
编排
考虑到启动新容器是多么容易,它们使用的资源多么少,以及它们单独打包应用程序的能力如何,它们可以动态配置以处理特定任务,并在不再需要时关闭它们。 这种称为编排或云自动化的技术对于基础架构自动化和分布式应用程序非常有价值,并且在应用程序开发过程中同时运行大量测试。 当编排与传统虚拟化结合时,多个容器跨多个虚拟机运行,以更有效地使用数据中心的资源。
行业标准容器编排中最著名的两个名称是 Kubernetes 和 Docker Swarm。 两者都大规模地协调集群内的容器。 Kubernetes 最初由 Google 设计,现在由 Cloud 本机计算基金会。 不管名字可能暗示什么,Docker Swarm 并不是唯一可以处理 Docker 镜像的编排工具。 Kubernetes 最常与 Docker 镜像一起使用。
一般来说,Kubernetes 是一种更高级的工具,适用于高负载/高可用性工作负载,而 Docker Swarm 更易于配置和部署,安装简单。
数据持久性
正如我们刚刚看到的,容器最有价值的优势之一是可以轻松地创建和销毁大量容器。 但是,当容器被删除或从其原始映像重新启动时,保存在容器虚拟磁盘上的文件会丢失。 此外,由于容器彼此和主机操作系统之间是进程隔离的,因此这些文件在容器之外不容易访问。 这就引出了一个问题:一旦不再需要容器,如何存储持久数据以避免丢失?
文件存储
码头工人提供 多种方式 根据您的需要处理持久性文件存储。 最基本的类型是绑定挂载,它获取主机上的文件或目录并将其挂载到容器上。 绑定挂载是高性能的,可用于在容器内外共享数据。 但是,由于它们允许容器访问或更改主机文件系统上的重要文件,因此请谨慎使用绑定挂载。
因此,建议尽可能使用卷。 卷是专用于存储的容器,它可以同时挂载到许多其他容器,并且是 由 Kubernetes 支持. 当容器不再使用时,卷不会自动删除,因此它们的数据会保留在主机上,直到手动删除。
其他存储选项
卷和绑定挂载之间的区别主要取决于它们的底层功能,但对于容器来说,它们看起来与任何其他文件或目录相同。 但是,其他数据存储不一定遵循相同的结构,因此适用于不同的任务。
像这样的键值存储 等 在使用 Kubernetes 或 Docker 编排大量容器时,对于跟踪关键基础架构数据(例如配置、状态和元数据)非常有用。 数据像常规文件系统一样分层存储,但使用标准 HTTP 工具(例如 cURL)进行读写。 存储在 etcd 中的数据在集群的每个节点上都可用,而领导节点处理所有需要跨集群达成共识的决策,例如写入。
当领导者死亡或不再响应时,选举过程会自动发生,以防止领导者成为单点故障,即使在不可靠的环境中,etcd 也非常有弹性。
对于其他类型的结构化信息,数据库是最合适的选择。 该数据库可以存在于外部并通过网络接收来自容器的请求,但它也可以托管在容器中(数据库引擎和实际数据库存储在单独的容器卷中)以利用上面讨论的所有容器化优势。
容器的用途
容器的资源效率使其非常适合跨大量服务器进行编排和负载平衡,但容器也填补了频谱另一端的利基市场。 鉴于容器允许将应用程序依赖项标准化并从一个环境可靠地运行到另一个环境,它们非常适合在工作站上开发应用程序并顺利推出服务器更改。
鉴于容器与主机共享内核,在 Windows 工作站上运行为 Linux 制作的容器似乎是不可能的。 但多亏了额外的虚拟化工具,例如 适用于 Linux 的 Windows 子系统 和 超V, 适用于 Windows 的 Docker 无需创建完整的虚拟机即可运行 Linux 容器映像。 这意味着即使是混合开发环境也可以顺利运行并在开发人员和服务器之间共享代码。
在软件开发生命周期中将应用程序完全容器化还可以轻松创建其他工具,以便在进行更改后自动化测试和应用程序部署。 编排工具可以快速并行处理大量测试场景。
什么时候虚拟机比容器更受欢迎?
一些需要旧内核版本的遗留应用程序可能无法在容器中愉快地运行。 由于这种类型的应用程序的稳定性更为关键,因此完全虚拟化操作系统是迁移到基于云的环境的最佳选择,而无需维护老化和容易出现故障的硬件。
始终在完全虚拟机中运行不受信任的代码,以降低内核利用允许容器化恶意软件影响主机或在其上运行的其他容器的可能性。 这也适用于关键安全系统,其中漏洞可能是毁灭性的,无论其概率低。
结论
您准备好开始构建自己的容器化基础架构了吗? 查看我们的私有云产品以轻松编排多个容器主机,或联系我们的一位乐于助人的解决方案专家以找到适合您的完美设置。