docker compose 本身不支持跨物理机调度或容器漂移,它仅适用于单机开发与测试;实现跨机漂移需改用 docker swarm 集群编排,通过 service 部署、健康检查、重启策略、分布式卷插件及高可用方案协同完成。

Docker Compose 本身不支持跨物理机调度或容器漂移——它是一个单机编排工具,设计目标是本地开发与测试环境的一键启停。所谓“在不同物理机间漂移”,必须脱离 Compose 原生能力,转向集群级编排系统(如 Docker Swarm 或 Kubernetes),再通过合理配置实现服务级弹性迁移。下面分三步讲清关键路径和实操要点。
第一步:认清 Compose 的边界,改用 Swarm 模式启动集群
Compose 文件(docker-compose.yml)可复用,但需升级为 Swarm service 模式部署:
- 在每台目标物理机上安装 Docker,并初始化 Swarm 集群:
docker swarm init --advertise-addr;其他节点执行docker swarm join加入 - 将原有
docker-compose.yml改写为支持 Swarm 的格式(例如添加deploy策略、去掉不兼容字段如links) - 使用
docker stack deploy -c docker-compose.yml myapp替代docker-compose up,此时服务由 Swarm manager 统一调度
第二步:配置服务漂移的关键策略
真正让容器“自动迁移到健康节点”的能力来自 Swarm 的调度器与健康机制,重点配置以下几项:
-
重启策略:设为
restart_policy: condition: on-failure或any,配合delay和max_attempts避免抖动 -
部署模式:用
mode: replicated+replicas: 3,或mode: global强制每节点一个实例;Swarm 会在节点宕机后自动在可用节点重建任务 -
健康检查:在 service 中定义
healthcheck,例如curl -f http://localhost:8080/actuator/health || exit 1,Swarm 依赖它判断实例是否存活 -
资源约束:设置
resources: limits: memory: 512M,避免因资源争抢导致调度失败或假死
第三步:保障状态服务的漂移一致性(含数据卷)
无状态服务漂移较简单;有状态服务(如数据库、缓存)需额外处理数据可访问性:
- 不要用默认
local卷驱动——它绑定宿主机路径,无法跨机 - 改用支持分布式存储的插件卷,例如:
docker plugin install rexray/rexray,然后在 compose 中声明:driver: rexray,并指定云盘/NFS 后端 - 卷创建时加标签约束(如
node.labels.storage==ssd),确保新节点满足挂载条件 - 若用 MySQL 等单主服务,仅靠卷漂移不够,必须搭配高可用方案(如 MHA、Patroni)+ VIP 或 DNS 切换,否则应用层仍会感知中断
本质上,Docker Compose 不是漂移工具,而是配置载体;真正的漂移能力来自 Swarm 的控制平面、健康探活、服务发现与存储插件协同。把 Compose 当作“配置说明书”,把 Swarm 当作“执行大脑”,才能落地跨物理机的可靠迁移。











