©
This document uses PHP Chinese website manual Release
要在 Docker Engine 处于群集模式时部署应用程序映像,请创建一个服务。在某些更大的应用程序中,服务通常会成为微服务的图像。服务示例可能包括 HTTP 服务器,数据库或您希望在分布式环境中运行的任何其他类型的可执行程序。
在创建服务时,您可以指定要使用哪个容器映像以及要在正在运行的容器中执行哪些命令。您还可以定义该服务的选项,包括:
群体将在群体外提供服务的端口
该服务的覆盖网络连接到群中的其他服务
CPU和内存限制和保留
滚动更新政策
要在群中运行的图像副本的数量
将服务部署到群集时,群集管理器接受服务定义作为服务的所需状态。然后它将该群中的节点上的服务作为一个或多个副本任务进行调度。这些任务在群中的节点上彼此独立运行。
例如,假设您想要在 HTTP 侦听器的三个实例之间进行负载平衡。下图显示了具有三个副本的 HTTP 侦听器服务。监听者的三个实例中的每一个都是群中的一个任务。
容器是一个孤立的过程。在群模式模型中,每个任务只调用一个容器。任务类似于调度程序放置容器的“插槽”。一旦容器处于活动状态,调度程序就会识别出该任务处于运行状态。如果容器未通过健康检查或终止,则任务将终止。
任务是群体中的调度的原子单位。当您通过创建或更新服务来声明所需的服务状态时,协调器通过调度任务来实现所需的状态。例如,您可以定义一个服务,指示协调器始终保持运行 HTTP 侦听器的三个实例。协调者通过创建三个任务来做出响应。每个任务都是调度程序通过产生容器来填充的插槽。容器是任务的实例化。如果 HTTP 侦听程序任务随后失败其运行状况检查或崩溃,则该协调器会创建一个新的副本任务,以生成一个新的容器。
任务是一个单向机制。它通过一系列状态单调进行:分配,准备,运行等。如果任务失败,则协调器删除任务及其容器,然后创建一个新任务以根据服务指定的期望状态进行替换。
Docker 群集模式的基础逻辑是通用调度器和协调器。服务和任务抽象本身并不知道它们实现的容器。假设你可以实现其他类型的任务,例如虚拟机任务或非集装箱化的任务。调度程序和协调器对于任务的类型是不可知的。但是,当前版本的 Docker 仅支持容器任务。
下图显示了 swarm 模式如何接受服务创建请求并为工作节点调度任务。
服务可以被配置为使得群中当前没有节点可以运行其任务。在这种情况下,服务保持在状态pending
。以下是一些服务可能保持在状态的几个示例pending
。
注意:如果您的唯一目的是阻止部署服务,请将服务扩展为0而不是尝试将其配置为保留在服务中pending
。
如果所有节点都处于暂停或耗尽状态,并且您创建了一个服务,它将处于等待状态,直到某个节点可用。实际上,第一个可用的节点将获得所有的任务,因此在生产环境中这不是一件好事。
您可以为服务保留特定数量的内存。如果群中没有节点具有所需的内存量,则该服务将保持等待状态,直到有可用节点运行其任务。如果你指定一个非常大的值,比如500 GB,那么这个任务将永远处于等待状态,除非你真的有一个可以满足它的节点。
您可以对服务实施布局约束,并且在给定的时间内约束可能无法得到遵守。此行为说明您的任务的要求和配置与群体的当前状态并不紧密相关。作为群体的管理员,您声明群体的期望状态,并且经理与群体中的节点一起工作以创建该状态。您不需要微管理群集上的任务。复制和全局服务有两种类型的服务部署,即复制和全局。对于复制服务,指定要运行的相同任务的数量。例如,您决定部署一个具有三个副本的HTTP服务,每个副本服务于相同的内容。全局服务是在每个节点上运行一项任务的服务。没有预先指定的任务数量。每次将节点添加到swarm中时,编排器都将创建一个任务,并且调度程序将该任务分配给新节点。全球服务的良好候选者是监控代理,要在群集中的每个节点上运行的防病毒扫描程序或其他类型的容器。下图显示了三个服务的黄色副本和灰色的全局服务。
了解更多
了解群集模式节点如何工作。
了解PKI如何在群集模式下工作。