You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:45:00