Docker Swarm创建global模式服务反复在Ready与Shutdown状态循环如何解决
核心故障根因
你遇到的容器循环创建销毁问题的核心原因是使用的local-registry/ubuntu:07镜像默认没有前台常驻进程:
- Ubuntu基础镜像默认启动命令为
bash,无伪终端分配的后台运行场景下,bash执行完成后会直接正常退出,退出状态码为0,因此你观察到的任务退出状态是Complete而非错误退出 - Docker Swarm的global模式会持续保证满足约束的节点上有服务实例运行,容器退出后Swarm会自动重建新实例,就出现了Ready和Shutdown状态循环切换的现象
你在dockerd日志中看到的Error getting service xxx not found属于Swarm清理过期服务元数据的正常日志,和本次故障无关,无需额外处理。
除了核心原因外,还有两个可能的次要触发因素:
- 绑定目录
/project/m32/在异常节点sl-089上不存在、权限配置错误,导致容器启动失败退出 - 要暴露的310~313端口在
sl-089上已被其他进程占用,host模式发布端口时冲突导致容器启动失败
解决方案
1. 修复服务启动逻辑
在docker service create命令末尾添加前台常驻启动命令,先使用休眠命令验证服务可用性:
docker service create \ --mode global \ --mount type=bind,src=/project/m32/,dst=/root/m32/ \ --publish mode=host,target=310,published=310 \ --publish mode=host,target=311,published=311 \ --publish mode=host,target=312,published=312 \ --publish mode=host,target=313,published=313 \ --constraint "node.labels.m32 == true" \ --name m32 \ local-registry/ubuntu:07 \ sleep infinity
验证服务正常运行后,将sleep infinity替换为你实际的业务前台启动命令即可,注意业务进程必须前台运行,不能后台守护化。
2. 排查异常节点环境问题
如果修改启动命令后仍有循环重启问题,登录sl-089节点执行以下检查:
- 检查绑定目录状态:
ls -ld /project/m32/,确认目录存在且Docker运行用户有读写权限 - 检查端口占用情况:
ss -tulnp | grep -E ':(310|311|312|313)',确认四个端口无占用 - 检查镜像拉取权限:
docker pull local-registry/ubuntu:07,确认节点可以正常拉取镜像
3. 查看容器日志定位具体错误
如果以上步骤无法解决问题,查看异常退出容器的运行日志定位具体原因:
# 替换命令中的ID为你实际的退出容器ID,例如示例中的r6vibgptm5oc docker logs r6vibgptm5oc
内容的提问来源于stack exchange,提问作者user4948798
相关产品推荐
相关产品推荐

