如何在Docker Swarm每个节点上运行2个容器实例
如何在Docker Swarm集群每个节点运行2个容器实例
Docker Swarm本身没有直接提供“每个节点固定N个副本”的内置配置,但可以通过以下两种方式实现需求:
方法一:创建两个Global模式服务
Global模式的服务会在每个集群节点上启动一个容器,因此只需创建两个配置相同(仅服务名不同)的Global服务,就能让每个节点运行2个目标容器实例。
命令行方式
分别创建两个Global服务:
docker service create --name my-service-1 --mode global your-image:tag docker service create --name my-service-2 --mode global your-image:tag
Docker Compose方式
通过Compose文件定义两个Global服务,统一部署:
version: '3.8' services: service-1: image: your-image:tag deploy: mode: global service-2: image: your-image:tag deploy: mode: global
执行部署命令:
docker stack deploy -c docker-compose.yml my-stack
这种方式的优势是自动适配节点数量变化,新增节点会自动启动两个容器;缺点是需要管理两个独立服务,监控时需同时关注两者状态。
方法二:结合节点标签与副本数配置
通过给节点打标签、限制单节点最大副本数,再按节点总数计算总副本数,实现每个节点运行2个容器。
步骤1:给目标节点打标签
为所有需要运行容器的节点添加统一标签:
docker node update --label-add service-target=true <节点ID>
步骤2:创建带约束的服务
假设集群中带service-target=true标签的节点总数为N,则总副本数设为2*N,同时配置单节点最大副本数为2:
# 先获取节点数量N N=$(docker node ls --filter label=service-target=true -q | wc -l) # 创建服务 docker service create --name my-service --replicas $((2*N)) \ --constraint node.labels.service-target==true \ --placement max_replicas_per_node=2 \ --placement-pref spread=node.id \ your-image:tag
这种方式的优势是仅需管理一个服务,运维更统一;缺点是节点数量变化时,需要手动重新计算并更新副本数,无法自动适配。
内容的提问来源于stack exchange,提问作者zarax
相关产品推荐
相关产品推荐

