虽然 docker swarm 支持自动扩容部署,但是为了服务的稳定性、可靠性,有的时候甲方巴巴会要求一定要服务分散部署在不同的服务器上。
使用默认的部署方式,虽然副本为 N,但是部署的 N 个服务可能落在同一台服务器上。
在 Docker Swarm中,要让服务(service)的两个副本(replica)分别运行在不同的主机上,你需要做的是在部署服务时,使用 --constraint 标志来指定资源限制,例如主机的标签(labels)等都是可以的。
首先,确保你的两台主机已经加入到Docker Swarm集群中,并且每台主机有一个独特的标签来区分。可以通过以下命令给主机添加标签:
docker node update --label-add <key>=<value> <node-id>
然后,当你部署服务时,可以使用 --constraint 标志来指定副本运行的主机标签。例如,如果你有两台主机,一台标签为 host=node1,另一台标签为 host=node2,你可以这样部署服务。
docker service create --replicas 2 --name my-service --constraint 'node.labels.host==node1' my-image
docker service create --replicas 2 --name my-service --constraint 'node.labels.host==node2' my-image
如果使用的yml
文件来编排的服务,则修改文件内容如下:
version: '3.8'
services:
my-service:
image: my-image
deploy:
mode: replicated
replicas: 2
placement:
constraints:
- "node.labels.host == node1"
- "node.labels.host == node2"
在部署服务前,确保已经标记了相应的节点:
docker node update --label-add host=node1 <NODE1_ID>
docker node update --label-add host=node2 <NODE2_ID>
这样,每个副本都会被调度到一个符合指定标签的节点上。如果你有多于两台主机,并且每个副本都需要在不同的主机上运行,你可能需要为每个副本指定不同的标签约束。
请注意,如果没有足够的节点来满足所有约束条件,服务可能会创建失败或者只能运行在部分节点上。因此,集群中节点的数量和资源容量至关重要。