Docker生态系统:通用组件简介
介绍
容器化是以可移植和可预测的方式分发和部署应用程序的过程。 它通过将组件及其依赖项打包到称为容器的标准化、隔离、轻量级流程环境中来实现这一点。 许多组织现在对设计可以轻松部署到分布式系统的应用程序和服务感兴趣,从而使系统能够轻松扩展并在机器和应用程序故障中幸免于难。 Docker 是一个为简化和标准化各种环境中的部署而开发的容器化平台,它在很大程度上促进了这种服务设计和管理风格的采用。 已经创建了大量的软件来构建这个分布式容器管理的生态系统。
Docker 和容器化
Docker 是当今最常用的容器化软件。 虽然存在其他容器化系统,但 Docker 使容器创建和管理变得简单,并与许多开源项目集成。
在这张图片中,您可以开始看到(以简化的视图)容器与主机系统的关系。 容器隔离各个应用程序并使用已被 Docker 抽象的操作系统资源。 在右侧的分解图中,我们可以看到容器可以“分层”构建,多个容器共享底层,减少资源使用。
Docker的主要优点是:
- 轻量级资源利用:容器不是虚拟化整个操作系统,而是在进程级别隔离并使用主机的内核。
- 可移植性:容器化应用程序的所有依赖项都捆绑在容器内,允许它在任何 Docker 主机上运行。
- Predictability:主机不关心容器内部运行的是什么,容器也不关心它在哪个主机上运行。 接口是标准化的,交互是可预测的。
通常,在设计使用 Docker 的应用程序或服务时,最好将功能分解到单个容器中,这种设计决策称为面向服务的架构。 这使您能够在未来轻松地独立扩展或更新组件。 拥有这种灵活性是人们对 Docker 进行开发和部署感兴趣的众多原因之一。
要了解有关使用 Docker 对应用程序进行容器化的更多信息,请单击 此处 。
服务发现和全局配置存储
服务发现是旨在使容器部署可扩展和灵活的整体战略的一个组成部分。 使用服务发现,容器可以在没有管理员干预的情况下发现它们被引入的环境。 他们可以找到必须与之交互的组件的连接信息,并且可以注册自己,以便其他工具知道它们可用。 这些工具通常还用作全局分布式配置存储,其中可以为基础架构中运行的服务设置任意配置设置。
在上图中,您可以看到一个示例流程,其中一个应用程序向发现服务系统注册其连接信息。 注册后,其他应用程序可以查询发现服务以了解如何连接到该应用程序。
这些工具通常被实现为简单的键值存储,分布在集群环境中的主机之间。 通常,键值存储提供用于访问和设置值的 HTTP API。 有些包括额外的安全措施,如加密条目或访问控制机制。 除了为新容器提供自我配置细节的主要功能外,分布式存储对于管理集群的 Docker 主机也是必不可少的。
服务发现存储的一些职责是:
- 允许应用程序获取连接到它们所依赖的服务所需的数据。
- 允许服务为上述目的注册其连接信息。
- 提供一个全局可访问的位置来存储任意配置数据。
- 根据任何集群管理软件的需要存储有关集群成员的信息。
一些流行的服务发现工具和相关项目是:
- etcd:服务发现/全球分布式键值存储
- consul:服务发现/全局分布式键值存储
- zookeeper:服务发现/全球分布式键值存储
- crypt: 加密 etcd 条目的项目
- confd:监视键值存储的更改并触发使用新值重新配置服务
要了解有关 Docker 服务发现的更多信息,请访问我们的指南 此处 。
网络工具
容器化应用程序适合于面向服务的设计,该设计鼓励将功能分解为离散组件。 虽然这使管理和扩展更容易,但它需要对组件之间网络的功能和可靠性有更多的保证。 Docker 本身提供了容器到容器和容器到主机通信所需的基本网络结构。
Docker 的原生网络功能提供了两种将容器连接在一起的机制。 第一个是公开容器的端口并可选地映射到主机系统以进行外部路由。 您可以选择要映射到的主机端口,或者允许 Docker 随机选择一个未使用的高端口。 这是提供对适用于大多数用途的容器的访问的通用方式。
另一种方法是允许容器通过使用 Docker “链接”进行通信。 链接的容器将获取有关其对应方的连接信息,如果配置为注意这些变量,则允许它自动连接。 这允许同一主机上的容器之间进行联系,而无需事先知道服务所在的端口或地址。
这种基本网络级别适用于单主机或紧密管理的环境。 然而,Docker 生态系统已经产生了各种专注于扩展运营商和开发人员可用的网络功能的项目。 通过其他工具提供的一些其他网络功能包括:
- 覆盖网络以简化和统一跨多个主机的地址空间。
- 虚拟专用网络适用于提供各种组件之间的安全通信。
- 分配每个主机或每个应用程序的子网划分
- 建立macvlan接口进行通信
- 配置自定义 MAC 地址、网关等。 为您的容器
一些涉及改进 Docker 网络的项目包括:
- flannel:覆盖网络,为每个主机提供一个单独的子网。
- weave:覆盖网络,描绘单个网络上的所有容器。
- pipework:用于任意高级网络配置的高级网络工具包。
要更深入地了解与 Docker 联网的不同方法,请单击 此处 。
调度、集群管理和编排
构建集群容器环境时需要的另一个组件是调度程序。 调度程序负责在可用主机上启动容器。
上图展示了一个简化的调度决策。 该请求是通过 API 或管理工具给出的。 从这里,调度程序评估请求的条件和可用主机的状态。 在此示例中,它从分布式数据存储/发现服务(如上所述)中提取有关容器密度的信息,以便可以将新应用程序放置在最不繁忙的主机上。
这个主机选择过程是调度程序的核心职责之一。 通常,它具有使该过程自动化的功能,管理员可以选择指定某些约束。 其中一些限制可能是:
- 将容器安排在与另一个给定容器相同的主机上。
- 确保容器没有与另一个给定容器放置在同一主机上。
- 将容器放置在具有匹配标签或元数据的主机上。
- 将容器放在最不忙的主机上。
- 在集群中的每个主机上运行容器。
调度器负责将容器加载到相关主机上,并负责启动、停止和管理进程的生命周期。
因为调度程序必须与组中的每个主机交互,所以通常还包括集群管理功能。 这些允许调度程序获取有关成员的信息并执行管理任务。 这个上下文中的编排一般是指容器调度和管理主机的结合。
一些用作调度程序和车队管理工具的流行项目是:
- fleet:调度器和集群管理工具。
- marathon:调度器和服务管理工具。
- Swarm:调度器和服务管理工具。
- mesos:主机抽象服务,为调度器整合主机资源。
- kubernetes:能够管理容器组的高级调度程序。
- compose:用于创建容器组的容器编排工具。
要了解更多关于 Docker 的基本调度、容器分组和集群管理软件,请单击 here。
结论
到目前为止,您应该已经熟悉了与 Docker 生态系统相关的大多数软件的一般功能。 Docker 本身以及所有支持项目提供了一种软件管理、设计和部署策略,可以实现大规模的可扩展性。 通过了解和利用各种项目的功能,您可以执行足够灵活的复杂应用程序部署,以应对可变的操作要求。