是否可以在泊坞窗(泊坞窗群)中删除任务?

时间:2018-08-29 19:22:19

标签: docker docker-swarm

假设我有3张复制的图片:

docker service create --name redis-replica --replicas=3 redis:3.0.6

考虑到有两个连接的节点(包括管理器),并且运行命令docker service ps redis-replica会产生以下结果:

ID                  NAME                  IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
x1uumhz9or71        redis-replica.1       redis:3.0.6         worker-vm            Running             Running 9 minutes ago                        
j4xk9inr2mms        redis-replica.2       redis:3.0.6         manager-vm       Running             Running 8 minutes ago                                    
ud4dxbxzjsx4        redis-replica.3       redis:3.0.6         worker-vm       Running             Running 9 minutes ago  

您可以看到所有任务都在运行。

我有一个要解决的情况:

假设我要删除redis上的worker-vm容器。当前有两个,但是我想做一个。

我可以通过进入worker-vm,并通过docker rm删除容器来做到这一点。但是,这带来了一个问题:

一旦docker swarm发现其中一个任务已关闭,它将立即在另一个节点(管理者或工作者)上吐出另一个redis图像。结果,我将始终执行3个任务。

这不是我想要的。假设我要强迫docker如果它被移除,则不要重新点亮另一个图像。

这当前可行吗?

1 个答案:

答案 0 :(得分:0)

在Swarm模式下,由协调器为您安排任务。任务是调度的单位,每个任务恰好调用一个容器。

实际上,这意味着您不应该手动管理任务。 Swarm会为您解决这个问题。

您需要描述所需的服务状态,如果您有展示位置偏好设置,则可以在--placement-pref命令中使用docker service。您可以指定副本数等。例如

docker service create \
  --replicas 9 \
  --name redis_2 \
  --placement-pref 'spread=node.labels.datacenter' \
  redis:3.0.6

您可以使用放置约束(https://docs.docker.com/engine/reference/commandline/service_create/#specify-service-constraints---constraint来限制将要放置任务的节点集。这是Docker文档中的示例:

$ docker service create \
  --name redis_2 \
  --constraint 'node.labels.type == queue' \
  redis:3.0.6

我认为这是控制任务最接近的解决方案。

一旦您描述了放置约束/首选项,Swarm将确保服务的实际状态与您在create命令中描述的所需状态一致。描述所需的状态后,您不应再管理任何其他详细信息。

例如,如果您通过杀死容器来更改实际状态,则Swarm将重新调整服务状态以使其与所需状态再次保持一致。这是您卸下容器时发生的情况。

要更改所需的状态,可以使用docker service update命令。

关键是任务不等于容器。从技术上讲,它们仅调用一个容器,但它们并不相等。任务就像一个调度槽,调度程序在此放置容器。

Swarm调度程序管理任务(不是您),这就是为什么没有docker task这样的命令的原因。您通过描述所需的状态来驱动该机制。

要回答您的原始问题,是的,可以删除任务,可以通过更新所需的服务状态来完成。