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