假设我有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如果它被移除,则不要重新点亮另一个图像。
这当前可行吗?
答案 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
这样的命令的原因。您通过描述所需的状态来驱动该机制。
要回答您的原始问题,是的,可以删除任务,可以通过更新所需的服务状态来完成。