- A+
要在集群中部署镜像,创建一个服务。在一些更大的应用上下文中,服务通常称之为微服务。服务可能是一个HTTP服务器、数据库、或者分布式环境中运行的任何其他可执行的程序。
在创建服务时,可以指定要使用的容器镜像以及容器中要运行的命令。服务还可以定义下面选项:
- 集群要对外服务的端口
- 在集群中用于服务之间相连的overlay网络
- 滚动更新策略
- 集群总运行的副本数量
服务、任务和容器
当将服务部署到集群时,管理者将服务定义视为服务所需状态。然后将服务调度为一个或多个副本任务。这些任务在集群的节点上彼此独立运行。
例如下图有三个副本的HTTP服务,每个服务实例就是一个任务。
容器是一个独立的进程。在swarm模型中,每个任务调用一个容器。任务类似于插槽,调度器将容器放入其中。一旦容器运行,调度器认为该任务处于运行状态。如果容器出现健康监测失败或者终止,那么任务也终止。
任务和调度
任务是集群内调度的原子单位。当创建或者更新服务声明所需的服务状态时,协调者通过调度任务来实现这些所需的状态。
任务是一个单向机制,通过这些状态单独进行:分配、准备、运行等等。如果任务失败,协调者将删除任务以及容器,然后根据服务指定的所需状态创建一个新的任务来代替它。
Docker swarm模式的基础逻辑是通用调度器和编排器。
下图显示集群如何接受服务创建请求并将任务调度到工作节点上。
待处理的服务
一个服务可以这样配置,使得当前集群中的节点不能运行其任务。在这种情况下,服务仍处于待处理状态。
以下是服务可能保留在待处理状态的示例:
- 如果所有节点被暂停或Drain,并且你创建一个服务,将被挂起,知道节点可用。实际上,第一个可用的节点将会获得所有的任务,这在生产环境中不是件好事。
- 可以为服务预留特定数量的内存。如果集群中没有节点满足所需的内存量,则服务将处于待处理状态,知道可用的节点运行其任务。如果指定了非常大的值,则任务将永久挂起,除非确实有一个满足该条件的节点。
- 可以对服务施加放置约束,并且可能无法在给定时间履行约束。
此行为说明您的任务的要求和配置与当前的群组状态并不紧密。作为集群管理员,你可以声明集群所需状态,并且管理者可以使用集群中的节点来创建该状态。在集群中你不需要微管理任务。
如果你唯一的目的是阻止部署服务,请将服务扩展为0,而不是尝试将其配置成保持待处理状态。
副本和全局服务
有两种类型的服务部署:副本和全局。
对于副本服务,指定要运行的相同任务的数量,每个副本都是相同的内容。
全局服务是在每个节点上运行一个任务的服务。不需要预先指定任务数量。每当将一个节点添加到集群中,协调者将创建一个任务,并且调度器将任务分配给该新加入的节点。全局服务最好是监控代理、反病毒扫描程序等等想要在集群中每个节点上运行的容器。
下图显示三个副本服务(黄色)和全局服务(灰色):
# 在swarm模式下运行Docker Engine
当首次安装并使用Docker Engine时,默认情况下swarm模式是禁用的。当启用swarm模式时,可以使用docker service 服务管理命令。
有两种方式在swarm模式下运行引擎:
- 创建一个新的集群
- 加入现有集群
在生成环境中,集群模式提供具有集群管理功能的容错平台,以保证服务的可靠运行。
