解决docker容器删除后处于Removal In Progress 状态不释放

解决docker容器删除后处于Removal In Progress 状态不释放

解决docker容器删除后处于Removal In Progress 状态不释放

纯干货分享
http://jiangjiang.space 回忆书签,转载请注明出处,谢谢

1. 环境:

Docker : DockerCE 17.6 , Docker 1.12
存储: devicemapper-dirct
OS: CentOS Linux release 7.3.1611

2.问题

今日发现, 在删除容器后, 容器状态长期处于 Removal In Progress状态, 无法删除。
通过命令:

   docker rm -f $(docker ps -a -q)
  #或者 
   docker  stop  $(docker ps -a -q)
   docker  rm $(docker ps -a -q)
  #都会出现这种情况

容器状态长期处于

  CREATED             STATUS                PORTS       
  2 days ago          Removal In Progress   

重启docker不起作用,状态变为dead。
参考网上执行

 docker rm $(docker ps -aq -f status=dead) 
# 或者
 docker system prune
# 全部没有作用

重启机器后能释放,但是这是生产环境不能接受的。

3. 分析

在删除容器时总是会报容器使用的文件系统无法umount, 但是实际手工运行umount后并不能起作用。
因此猜测是有进程抓住了这个文件系统。

通过命令:

# 报错为此docker卷无法umount
/var/lib/docker/devicemapper/mnt/85ced908cf8fcc4704a581fcc84724b5f6de232610b28e40b2be6f1ff159ead7
# 搜索所有进程是否有打开此卷的
grep -l 85ced908cf /proc/*/mountinfo
/proc/18683/mountinfo

# 看这个进程是什么进程

ps -f 18683
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
ntp      18683     1  0 03:33 ?        Ss     0:00 /usr/sbin/ntpd -u ntp:ntp -g

# 很惊讶竟然是ntp
# ntpd 会打开所有挂在的卷,原因和原理还不得而知。但是能确定的是ntpd阻止了容器卷的umount,同时容器删除动作就hang住了
# 停掉ntpd
systemctl stop ntpd

# 卷被释放了 
grep -l 85ced908cf /proc/*/mountinfo

# 成功删除
rm -rf/var/lib/docker/devicemapper/mnt/85ced908cf8fcc4704a581fcc84724b5f6de232610b28e40b2be6f1ff159ead7

纯干货分享
http://jiangjiang.space 回忆书签,转载请注明出处,谢谢

4. 解决

通过systemd启动docker时增加挂在参数,避免其它进程挂在docker的卷。

#手工编辑
/etc/systemd/system/multi-user.target.wants/docker.service

# 在 Service 段最后加入私有挂在参数
[Service]
MountFlags=private

# 重新加载systemd
systemctl daemon-reload

# 重启docker
systemctl restart docker.service

问题就这样愉快的解决了,困扰我一个月的时间.
虽然解决了但是个中缘由还不清楚,继续调查。
纯干货分享
http://jiangjiang.space 回忆书签,转载请注明出处,谢谢

5.后续

查阅网上有文章说docker增加如下属性可以避免这种情况, 还未验证,暂时记录在这里

        "dm.use_deferred_deletion=true",
        "dm.use_deferred_removal=true",

https://docs.docker.com/engine/reference/commandline/dockerd/#options-per-storage-driver