解决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