通用方案:Docker宿主机上所有容器不达终态时的应急处理方法

通用方案:Docker宿主机上所有容器不达终态时的应急处理方法

更新时间:2020-07-07 10:57:57

1. 概述

本文主要介绍在Docker宿主机上,所有容器不达终态时的应急处理方法。

1.1. 适用范围

  • 专有云V3,基础服务设备

    说明:本文适用于专有云V3.0.0~V3.10.0,包含V3.0.0版本及V3.10.0版本。

1.2. 风险说明

执行本方案前,服务已经异常,本方案的操作无风险。

1.3. 用户告知

  • 本方案为应急处理方法。
  • 文中的目标机器指异常的Docker宿主机。

2. 问题描述

在专有云环境中,Docker宿主机上所有Docker容器不达终态,需要参考本文进行应急处理。

3. 解决方案

3.1. 环境检查

参见以下步骤,进行环境检查。

  1. 在专有云环境中,默认开启SM功能,即天基自动拉起Docker容器的功能。需要参见以下KB,暂停该功能。
    • KB 87194 通用方案:专有云禁止天基启动App容器
  2. 确保目标机器上所有容器对应的备用节点均正常工作,未受到影响。

3.2. 实施步骤

参见以下步骤,进行应急处理。

步骤一:检查文件句柄

  1. 登录目标机器。
  2. 检查/var/log/docker日志文件。如果该日志文件中存在大量too many open files的告警信息,则根据目标机器的操作系统版本,参考对应命令,重启Docker服务。
    • 7U操作系统中使用systemctl restart docker命令重启Docker服务。
    • 5U或者6U操作系统中使用service docker restart命令重启Docker服务。
  3. Docker服务重启完成后,参考如下命令,尝试启动单个Docker容器。
    docker start [$Docker_ID]
    说明:[$Docker_ID]指单个Docker容器的ID。
  4. 如果可以正常启动单个容器,则参考环境检查,恢复SM功能。等待天基自动拉起目标机器上所有的容器。再参考如下KB,处理文件句柄过多的问题。
    • KB 112102 通用方案:专有云V3环境SSHTunnelClient进程打开文件句柄过多
  5. 如果上述步骤不起作用,则参考步骤二:清空libcontainer

步骤二:清空libcontainer

  1. 根据目标宿主机的操作系统版本,参考对应命令,停止Docker服务。
    • 7U操作系统中,使用systemctl stop docker命令,停止Docker服务。
    • 5U或者6U操作系统中,使用service docker stop命令,停止Docker服务。
  2. 参考如下命令,在/tmp目录创建备份目录。
    mkdir /tmp/libcontainerd_[$Date]
    说明:[$Date]指操作备份时的日期和时间。
  3. 与阿里云技术支持进行确认,是否可以清空/var/run/docker/libcontainerd目录。
  4. 如果可以清空该目录,则执行如下命令,将/var/run/docker/libcontainerd目录下的所有文件移动到备份目录。
    mv /var/run/docker/libcontainerd/* /tmp/libcontainerd_[$Date]
  5. 参见步骤1,将命令中的stop替换为start,启动Docker服务。
  6. 再次尝试启动单个Docker容器。
  7. 如果可以正常启动单个Docker容器,则参考环境检查,恢复SM功能。
  8. 如果上述步骤不起作用,则参考步骤三:检查Panic

步骤三:检查Panic

检查/var/log/docker日志。如果存在Panic记录,并且同时存在类似如下的报错信息,则该问题一般为异常关机导致的容器后台元数据损坏。此类问题无法修复。在确认该物理机上的服务角色均正常工作后,联系阿里云技术支持,通过Reclone对该物理机进行恢复。

bolt.(*freelist).allocate

如果仍然无法修复Docker宿主机上所有容器不达终态的问题,则需要通过SupportTools收集日志并提供给阿里云技术支持进行分析。关于如何获取该工具,请联系阿里云技术支持。

3.3. 结果验证

确认该Docker宿主机上的容器服务均已达终态,且能正常提供服务。

4. 回滚方案

执行本方案前,服务已经异常,无需回滚。

5. 补充说明

关于容器无法启动的排查思路,可参以下思维导图。