目录
Service介绍
要在Docker引擎处于群集模式时部署image,需要创建一个Service(服务)。
创建一个服务时,指定要使用哪个容器镜像,以及要在正在运行的容器中执行哪些命令。还可以为服务定义选项,包括:
- 群集所在的端口使服务在群集外部可用
- 一个覆盖网络,用于服务连接到群中的其他服务
- CPU和内存限制和保留
- 滚动更新策略
- 要在群集中运行的映像副本的数量
Services, tasks, and containers
当部署服务到 swarm,swarm manager接收你对服务期望状态的定义。然后它为服务在 swarm 中的节点调度一个或多个副本任务。这些任务在 swarm 的节点上彼此独立地运行。
例如假设你想负载均衡三个 HTTP 服务器实例。下面的图表展示了三个 HTTP 服务器副本。
三个 HTTP 实例中的每一个是 swarm 中的一个任务。
容器是一个独立的进程。在swarm模式模式中,每个task只调用一个容器。task类似于调度程序放置容器的“插槽”。一旦容器处于活动状态,调度程序就会识别出任务处于运行状态。如果容器未通过健康检查或终止,则任务终止。
Tasks and scheduling
任务是 swarm 内调度的原子单位。当你通过创建或更新服务声明一个期望状态的服务,调度器通过调度任务来实现期望的状态。例如,你指定一个服务始终保持运行三个HTTP 实例。调度器就创建三个任务。每个任务运行一个容器。容器是任务的实例化。如果一个 HTTP 容器之后出现故障停止,此任务被标志为失败,调度器就会创建一个新的任务来生成一个新容器
任务是一个单向机制。它单向地执行一系统状态,assigned,prepared, running 等。如果一个任务失败了,调度器就会删除这个任务和它的容器,然后创建一个新的任务来替换它。
下面的图表显示 swarm 模式是如何接收服务创建请求和调度任务到 worker 节点的。
Replicated and global services
有两种类型的services部署,副本和全局
- Replicated services
你可以指定运行相同任务的数量。例如,你决定部署三个 HTTP 实例的副本,每个提供相同的内容。 - global services
在每个节点上运行一个相同的任务。不需要预先指定任务的数量。每次增加一个节点到 swarm 中,协调器就会创建一个任务,然后调度器把任务分配给新节点。
下图表示用黄色表示拥有三个副本的 Replicated service,用灰色表示了一个global service
task 状态
Docker允许你创建可以启动任务的服务。服务是对所需状态的描述,任务完成这项工作。在集群节点上按以下顺序调度工作:
- 使用docker service create或UCP web UI或CLI创建服务。
- 请求被发送到Docker manager节点。
- Docker manager节点将服务安排在特定节点上运行。
- 每个服务可以启动多个任务。
- 每个任务都有一个生命周期,有像NEW、PENDING和COMPLETE这样的状态。
任务是运行一次直至完成的执行单元。当一个任务停止时,它不会再次执行,但是一个新的任务可能会取而代之。
任务在许多状态中前进,直到它们完成或失败。任务在新状态中初始化。任务通过许多状态向前推进,而它的状态不会后退。例如,任务永远不会从COMPLETE变为RUNNING。
task的生命周期
NEW 任务在初始化状态
PENDING 正在分配任务所用的资源
ASSIGNED Docker分配任务给节点
ACCEPTED 任务被工作节点接受。如果工作节点拒接任务,状态将会转变成REJECTED
PREPARING Docker正在准备任务
STARTING Docker正在开启任务
RUNNING 任务正在执行
COMPLETE 任务结束,不带错误代码
FAILED 任务结束,带着错误代码
SHUTDOWN Docker请求任务关闭
REJECTED 工作节点拒绝任务
ORPHANED 节点宕机时间太长
REMOVE 该任务不是终端,但相关服务已被删除或缩小
查看task状态
运行docker service ps 去得到任务状态。CURRENT STATE字段显示了任务状态以及该任务存在时间
```script
$ docker service ps webserver
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
owsz0yp6z375 webserver.1 nginx UbuntuVM Running Running 44 seconds ago
j91iahr8s74p \_ webserver.1 nginx UbuntuVM Shutdown Failed 50 seconds ago "No such container: webserver.…"
7dyaszg13mw2 \_ webserver.1 nginx UbuntuVM Shutdown Failed 5 hours ago
```
操作
部署一个Service到swarm
执行下面的命令
[root@localhost ~]# docker service create --replicas 1 --name helloworld alpine ping www.baidu.com 7k5nx2b4zj8at0aohqfj6lcqw overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged
- docker service create 创建服务
- --name service的名字
- --replicas指定一个service有几个实例运行
查看运行的service
[root@localhost ~]# docker service list ID NAME MODE REPLICAS IMAGE PORTS 7k5nx2b4zj8a helloworld replicated 1/1 alpine:latest
查看service的详细信息
[root@localhost ~]# docker service inspect --pretty helloworld (or ServiceID) ID: 7k5nx2b4zj8at0aohqfj6lcqw Name: helloworld Service