如何通过Docker Stack部署节点专属镜像服务,避免重复部署
问题分析
你当前的循环部署方式存在核心问题:每次执行docker stack deploy都会更新栈内同一个service1服务的配置,前两次部署的配置会被最后一次覆盖,最终只会在node3上部署对应镜像的实例,无法实现三个节点各部署对应镜像实例的目标。
解决方案
方案1:在Compose文件中定义独立服务
直接在compose.yml中为每个节点创建专属服务,每个服务绑定对应镜像和节点约束,一次部署即可完成所有节点的配置:
version: '3' services: service1-node1: image: username/image:node1 deploy: replicas: 1 placement: max_replicas_per_node: 1 constraints: - node.labels.with_imgTag==node1 restart_policy: condition: on-failure service1-node2: image: username/image:node2 deploy: replicas: 1 placement: max_replicas_per_node: 1 constraints: - node.labels.with_imgTag==node2 restart_policy: condition: on-failure service1-node3: image: username/image:node3 deploy: replicas: 1 placement: max_replicas_per_node: 1 constraints: - node.labels.with_imgTag==node3 restart_policy: condition: on-failure
执行部署命令:
docker stack deploy -c compose.yml stack-4-service-1
每个服务会独立部署到对应节点,且max_replicas_per_node:1确保每个节点仅运行一个对应实例,不会互相干扰。
方案2:单独创建每个节点的服务
如果不想修改Compose文件,也可以直接用docker service create命令分别为每个节点创建服务:
# 部署node1对应实例 docker service create \ --name service1-node1 \ --replicas 1 \ --constraint 'node.labels.with_imgTag==node1' \ --max-replicas-per-node 1 \ --restart-condition on-failure \ username/image:node1 # 部署node2对应实例 docker service create \ --name service1-node2 \ --replicas 1 \ --constraint 'node.labels.with_imgTag==node2' \ --max-replicas-per-node 1 \ --restart-condition on-failure \ username/image:node2 # 部署node3对应实例 docker service create \ --name service1-node3 \ --replicas 1 \ --constraint 'node.labels.with_imgTag==node3' \ --max-replicas-per-node 1 \ --restart-condition on-failure \ username/image:node3
关键说明
- 不要重复部署同一个服务:
docker stack deploy对同一个栈内的同名服务会执行配置更新,而非新增实例,这是你当前方案失效的核心原因。 - 每个节点绑定专属服务:通过独立服务或独立创建命令,确保每个节点的镜像和约束绑定唯一,避免配置覆盖。
内容的提问来源于stack exchange,提问作者jislam
相关产品推荐
相关产品推荐

