介绍
除了开发应用程序在每个环境中做出适当响应的实际工作外,您还可能面临跟踪依赖性、扩展应用程序和更新单个组件的问题,而不会影响整个应用程序。
Docker 集装箱化和面向服务的设计试图解决许多这些问题. 应用程序可以分成可管理的功能组件,单独包装,并在不规则的架构上轻松部署。
在本指南中,我们将讨论集装箱化的好处,以及Docker如何帮助解决上述许多问题,Docker是分布式集装箱部署的核心组件,可提供易于扩展和管理。
Linux 集装箱化的简短历史
集装箱化和隔离不是计算领域的新概念,一些类似Unix的操作系统已经利用成熟的集装箱化技术十多年来。
在Linux,LXC中,形成后续集装箱化技术的基础的构建块在2008年被添加到内核中。LXC结合了使用内核cgroups(允许分离和跟踪资源利用)和namespaces(允许群组分离,以便它们无法相互看到
)来实现轻量级的过程隔离。
后来,Docker被引入为简化创建和管理容器所需的工具的一种方式,最初使用LXC作为默认执行驱动程序(此后为此开发了一个名为libcontainer
的库)。
虽然我们将在本文中讨论的一些主题更为一般,但我们将主要关注Docker集装箱化,因为它具有压倒性的流行性和标准采用。
集装箱化带来了什么图像
容器为开发人员和系统管理员/操作团队带来了许多非常有吸引力的好处。
其中一些最大的好处在下面列出。
抽象主机系统远离集装箱应用程序
集装箱的目的是完全标准化,这意味着集装箱使用定义的界面连接到主机和容器外面的任何东西。集装箱应用程序不应该依赖或关心底层主机的资源或架构的细节,这简化了有关操作环境的开发假设。
易于扩展
主机系统和容器之间的抽象性的一个好处是,鉴于正确的应用设计,扩展可以简单而简单。
开发人员可以在工作站上运行几个集装箱,而这个系统可以在一个阶段或测试区域水平扩展,当集装箱进入生产时,它们可以再次扩展。
简单的依赖管理和应用程序版本化
容器允许开发人员将应用程序或应用程序组件和其所有依赖组件组合为一个单元。 主机系统不必担心运行特定应用程序所需的依赖组合。
主机系统和操作团队不再负责管理应用程序的依赖需求,因为除了依赖相关容器之外,它们都应该包含在容器本身。
极其轻量级、孤立的执行环境
虽然集装箱不提供与虚拟化技术相同的隔离和资源管理水平,但它们从交易中获益的是极其轻量级的执行环境。集装箱在流程级别上被隔离,共享主机的内核。
共享层次
如果多个容器基于同一层,它们可以共享底层,而无需重复,从而为后续图像使用极少的磁盘空间。
构成性和可预测性
Docker 文件允许用户定义创建新容器图像所需的确切操作,这样您就可以将执行环境写成代码,如果需要的话将其存储在版本控制中。
使用 Dockerfiles 进行可重复、一致的构建
虽然可以使用交互式流程创建容器图像,但在知道必要的步骤后,最好在 Dockerfile 中放置配置步骤。
Dockerfiles是令人难以置信的有用和相当容易掌握. 他们提供的一些好处是:
- 易于版本化:Dockerfiles本身可以承诺进行版本控制,以追踪更改并扭转任何错误
- 可预测性:从Dockerfile中构建图像有助于从图像创建过程中删除人为错误
- 责任性:如果您计划共享图像,通常是提供创建图像的Dockerfile作为其他用户审核过程的方式是一个好主意。
Dockerfiles 是自动化容器图像构建的一个很好的工具,以建立可重复的过程。
集装箱应用的架构
在设计用于集装箱内部署的应用程序时,首要关注的领域之一是应用程序的实际架构,一般来说,在实施面向服务的设计时,集装箱应用程序最有效。
以服务为导向的应用程序将系统的功能分解为通过明确界面相互通信的分离组件,容器技术本身鼓励这种类型的设计,因为它允许每个组件独立扩展或升级。
实施此类设计的应用程序应具有以下品质:
- 他们不应该关心或依赖于主机系统的任何细节
- 每个组件都应该提供一致的API,消费者可以使用它来访问服务
- 每个服务在初始配置过程中应该从环境变量中获取提示
- 应用数据应存储在集装卷或数据容器上
这些策略允许每个组件独立交换或升级,只要API被维持,它们还借助于专注的水平可扩展性,因为每个组件可以根据所经历的瓶颈进行扩展。
每个组件通常可以定义合理的默认值,而不是硬编码特定的值,该组件可以将这些值用作倒退值,但应该更喜欢它可以从其环境中收集的值。
将配置从实际容器中移除并将其放置到环境中,可以轻松改变应用程序行为,而不会重建容器图像。 它还允许单个设置影响多个组件实例。
使用 Docker 注册表用于集装箱管理
一旦您的应用程序被分成功能组件并配置为适当地响应环境中的其他容器和配置标志,下一步通常是通过注册表提供您的容器图像。
有各种Docker注册表可用于此目的. 有些是公共注册表,任何人都可以查看和使用已参与的图像,而其他注册表是私人。
结论
Docker 提供了分布式集装箱部署所必需的基本构建组件. 通过将应用程序组件包装到自己的集装箱中,水平扩展成为旋转或关闭每个组件的多个实例的简单过程。
虽然集装箱应用提供必要的流程隔离和包装来协助部署,但还有许多其他组件是必要的,以便在分布式主机集群中妥善管理和扩展集装箱。