Docker Swarm集群中容器无法正常关闭问题排查求助
Docker Swarm容器状态卡住问题排查与修复方案
排查步骤
- 第一步排查Docker daemon运行日志:执行
journalctl -u docker -f --since "10m ago",重点检索容器停止阶段的报错信息,这类问题90%以上是dockerd无法正常向容器进程发送停止信号、或等待容器退出超时导致的状态不同步。 - 第二步排查宿主机内核日志:执行
dmesg -T,检查是否有overlay2/aufs存储驱动报错、cgroup资源泄漏、OOMkill记录、进程IO hang等底层异常。 - 第三步验证Docker版本:执行
docker version确认当前集群的Docker版本,Docker 19.03~20.10的部分早期小版本存在已知的Swarm服务状态同步bug,是这类问题的高发诱因。 - 第四步检查服务停止配置:执行
docker inspect <服务ID> | grep StopSignal确认服务配置的停止信号,若使用了自定义停止信号但容器内进程没有对应处理逻辑,会导致容器无法响应停止请求,永久卡在运行状态。 - 第五步定位容器进程状态:执行
ps aux | grep <卡住容器ID的前6位>,查看对应的宿主机进程是否处于D状态(不可中断睡眠)、或已成为僵尸/孤儿进程,这类进程无法被内核正常终止,会直接导致dockerd的清理流程卡住。
修复方案
- 临时紧急清理方案:无需重启Docker daemon,找到卡住容器对应的宿主机进程ID后执行
kill -9 <进程ID>,进程退出后dockerd会自动同步容器状态为已停止。注意:操作前请确认该容器已无业务流量接入,避免影响在线服务 - 版本bug修复:如果确认是Docker版本的已知问题,将集群所有节点的Docker升级到20.10.18及以上稳定版,或19.03.15的最终维护版,可解决绝大多数Swarm状态同步类bug。
- 存储驱动优化:若当前使用已废弃的aufs存储驱动,统一替换为overlay2驱动,aufs存在大量文件锁冲突、容器资源清理失败的已知问题,替换后可大幅降低这类故障概率。
- 服务配置优化:为所有Swarm服务配置合理的停止宽限时间,执行
docker service update --stop-grace-period 30s <服务名>,超出宽限时间后dockerd会自动发送SIGKILL信号强制终止进程,避免无限等待进程响应停止信号。 - 内核参数优化:在所有集群节点的
/etc/sysctl.conf中添加如下配置,执行sysctl -p生效,避免cgroup泄漏、PID不足导致的容器清理失败:kernel.pid_max=4194303 vm.max_map_count=262144 - IO hang类问题修复:如果排查发现容器进程处于D状态,优先检查节点挂载的共享存储、本地磁盘的IO可用性,D状态进程基本都是IO hang导致,修复存储异常后进程即可恢复可终止状态。
内容的提问来源于stack exchange,提问作者Anthony Richir
相关产品推荐
相关产品推荐

