Docker stack部署时如何将指定容器调度到预设固定主机上
解决方案
核心实现思路
Docker Swarm 可通过deploy.placement.constraints配置项定义服务的调度约束,强制服务只能部署到符合条件的节点上,有两种常用实现方案:
方案1:直接绑定节点IP(适合小规模场景快速配置)
直接在Compose文件中为每个服务添加IP匹配约束即可,修改后的完整Compose如下:
version: '3.8' networks: same-network: driver: overlay # 跨节点通信必须使用overlay网络 services: # 注意原配置缺失顶层services字段,需补充 ser1-service: image: ser1 networks: - same-network ports: - 9057:7057 entrypoint: ["java","-jar","ser1.jar"] deploy: placement: constraints: # 强制调度到IP为123的节点 - node.ip == 123 ser2-service: image: ser2 networks: - same-network ports: - 9052:7052 entrypoint: ["java","-jar","ser2.jar"] deploy: placement: constraints: # 强制调度到IP为456的节点 - node.ip == 456
注意:Swarm模式下container_name配置不生效,会自动按服务名+副本序号生成容器名,可直接删除该配置。
方案2:节点标签绑定(适合多服务多节点的大规模场景)
该方案可实现服务与节点的绑定关系配置解耦,后续调整绑定规则无需修改Compose文件:
- 首先在Manager节点为对应节点打自定义标签:
# 先查询所有节点的名称/ID docker node ls # 给IP123的节点打绑定标签 docker node update --label-add service.bind=ser1 <IP123对应的节点名称/ID> # 给IP456的节点打绑定标签 docker node update --label-add service.bind=ser2 <IP456对应的节点名称/ID> - 修改Compose中的约束规则,匹配对应节点标签即可:
deploy: placement: constraints: - node.labels.service.bind == ser1
镜像自动下载配置
只要将所有服务镜像推送到私有镜像仓库,所有Swarm节点配置好该私有仓库的访问权限,Swarm调度服务到对应节点时,如果节点本地没有对应镜像,会自动触发拉取操作,无需提前手动下载镜像。
内容的提问来源于stack exchange,提问作者irshad.ahmad
相关产品推荐
相关产品推荐

