全局模式指服务在每台符合条件的swarm节点上运行且仅运行一个副本;需先初始化集群并确保节点ready,再用--mode global创建服务,支持约束调度与自动扩缩,docker compose单机模式不支持该语义。
在 docker swarm 模式下,“全局模式”(global mode)是指让服务在集群中**每台符合条件的节点上都运行且仅运行一个副本容器**。它不适用于普通 docker engine 或 docker compose(v2 默认不支持全局部署语义),必须在启用 swarm 的集群环境中配置。
前提:初始化或加入 Swarm 集群
确保所有目标宿主机已初始化为 Swarm 节点:
- 在管理节点执行:docker swarm init(获取 join token)
- 其他节点执行:docker swarm join --token
:2377 - 确认节点状态:docker node ls,应看到 Ready 状态的 worker 或 manager 节点
使用 docker service create 启动全局服务
通过 --mode global 参数声明服务为全局部署:
- 基础命令示例:docker service create --name log-collector --mode global alpine tail -f /dev/null
- 该命令会在当前集群中每个 Ready 的 worker 节点上启动一个容器
- 若只想在特定角色节点部署(如仅 worker),可加约束:--constraint 'node.role==worker'
- 若需排除某些节点(如管理节点不跑业务容器),可用:--constraint 'node.labels.type!=control'(需提前打 label)
验证与管理
检查是否每台宿主机都运行了一个实例:
- docker service ps log-collector —— 查看各副本分配到哪个节点
- docker ps(在任一宿主机上执行)—— 应仅看到一个该服务的容器(除非手动额外启动)
- 节点增减后,Swarm 会自动扩缩:新节点加入 Ready 状态后,服务立即调度一个新副本;节点下线后,副本自动迁移
注意:Docker Compose 不原生支持全局模式
标准 docker compose up 是单机编排工具,无法跨主机调度。若坚持用 Compose 语法实现类似效果,需借助:
- Swarm 模式下的 docker stack deploy(支持
deploy.mode: global) - 示例 docker-compose.yml 片段:
version: '3.8' services: agent: image: prom/node-exporter deploy: mode: global placement: constraints: - node.role == worker然后运行:docker stack deploy -c docker-compose.yml mymonitor











