Docker Swarm执行docker stack deploy后容器重复问题问询
解决Docker Swarm部署后容器重复的问题
我来帮你排查并解决这个容器重复的问题,结合你的1管理节点+1工作节点的Swarm集群、带约束的WordPress栈场景,可能的原因和对应解决方法如下:
可能的原因分析
- 服务副本数未显式定义:如果你的
docker-compose.yml没指定replicas,Swarm默认会给每个服务创建1个副本,但如果之前的部署有残留,或者调度逻辑出现异常,可能导致多容器共存。 - 旧栈部署残留:之前执行过
docker stack deploy但未彻底清理,新旧服务实例同时运行,看起来像是容器重复。 - 约束配置覆盖不全:你给wordpress加了worker节点约束,但mysql或backup服务没设置约束,可能在管理节点也启动了容器,让你误以为是wordpress容器重复。
- 节点角色配置异常:工作节点的
node.role可能被误设为manager,导致Swarm尝试在多个节点调度同一个服务。
分步解决方案
1. 先明确当前集群与服务状态
先执行命令确认节点角色是否正确:
docker node ls
再查看栈内各服务的运行情况,定位重复容器所属的服务和运行节点:
docker stack services myapp docker service ps myapp_wordpress docker service ps myapp_mysql docker service ps myapp_backup
2. 彻底清理旧栈残留
如果是旧部署残留导致的问题,先移除整个栈再重新部署:
docker stack rm myapp # 等待10秒让Swarm完成资源清理 sleep 10 # 重新部署栈 docker stack deploy -c ~/myapp/docker-compose.yml myapp
3. 完善docker-compose.yml配置
显式指定每个服务的副本数,并给需要的服务补充约束,避免不必要的调度:
services: wordpress: image: wordpress:latest deploy: replicas: 1 placement: constraints: - node.role == worker # 其他配置(端口、环境变量等)... mysql: image: mysql:5.7 deploy: replicas: 1 placement: constraints: - node.role == worker # 若允许mysql在管理节点运行可删除该约束 # 其他配置... backup: image: your-backup-image deploy: replicas: 1 placement: constraints: - node.role == worker # 其他配置...
4. 修正节点角色(若配置异常)
如果发现工作节点角色被误设为manager,执行以下命令修正:
# 从docker node ls的输出中获取工作节点ID docker node update --role worker <WORKER_NODE_ID>
5. 强制更新服务(调度异常时)
如果配置正确但仍有重复容器,强制让Swarm重新调度服务:
docker service update --force myapp_wordpress docker service update --force myapp_mysql docker service update --force myapp_backup
验证解决效果
部署或更新完成后,再次检查服务和容器状态:
docker stack services myapp # 在工作节点上执行,确认每个服务仅运行1个容器 docker ps
内容的提问来源于stack exchange,提问作者Ralph
相关产品推荐
相关产品推荐

