内容简介:先说明:服务器上慎重,本地可以多折腾(小心volumn中存放的数据,是不是你原来直接存在image里了。如果不是,随意,大不了重新build)原文来自:https://blog.fundebug.com/2018/01/10/how-to-clean-docker-disk/其实主要就几个方式:
先说明:服务器上慎重,本地可以多折腾(小心volumn中存放的数据,是不是你原来直接存在image里了。如果不是,随意,大不了重新build)
原文来自:https://blog.fundebug.com/2018/01/10/how-to-clean-docker-disk/
其实主要就几个方式:
1. docker system命令
在 谁用光了磁盘?Docker System命令详解 中,我们详细介绍了 docker system 命令,它可以用于管理磁盘空间。
docker system df命令,类似于 Linux 上的 df 命令,用于查看 Docker 的磁盘使用情况:
docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 147 36 7.204GB 3.887GB (53%) Containers 37 10 104.8MB 102.6MB (97%) Local Volumes 3 3 1.421GB 0B (0%) Build Cache 0B 0B
可知,Docker镜像占用了 7.2GB 磁盘,Docker容器占用了 104.8MB 磁盘,Docker数据卷占用了 1.4GB 磁盘。
docker system prune命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。 docker system prune -a 命令清理得更加彻底,可以将没有容器使用Docker镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的Docker镜像都删掉了…所以使用之前一定要想清楚吶。
执行 docker system prune -a 命令之后,Docker占用的磁盘空间减少了很多:
docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 10 10 2.271GB 630.7MB (27%) Containers 10 10 2.211MB 0B (0%) Local Volumes 3 3 1.421GB 0B (0%) Build Cache 0B 0B
2. 手动清理Docker镜像/容器/数据卷
对于旧版的Docker(版本1.13之前),是没有docker system命令的,因此需要进行手动清理。这里给出几个常用的命
删除所有关闭的容器
docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm
删除所有dangling镜像(即无tag的镜像):
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
删除所有dangling数据卷(即无用的volume):
docker volume rm $(docker volume ls -qf dangling=true)
Fundebug 提供实时、专业的错误监控服务,为您的线上代码保驾护航,欢迎大家免费使用!
3. 限制容器的日志大小
有一次,当我使用1与2提到的方法清理磁盘之后,发现并没有什么作用,于是,我进行了一系列分析。
在Ubuntu上,Docker的所有相关文件,包括镜像、容器等都保存在 /var/lib/docker/ 目录中:
du -hs /var/lib/docker/ 97G /var/lib/docker/
Docker竟然使用了将近 100GB 磁盘,这也是够了。使用 du 命令继续查看,可以定位到真正占用这么多磁盘的目录:
92G /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53
由 docker ps 可知,nginx容器的ID恰好为 a376aa694b22 ,与上面的目录 /var/lib/docker/containers/a376aa694b22 的前缀一致:
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a376aa694b22 192.168.59.224:5000/nginx:1.12.1 "nginx -g 'daemon off" 9 weeks ago Up 10 minutes nginx
因此,nginx容器竟然占用了 92GB 的磁盘。进一步分析可知,真正占用磁盘空间的是nginx的日志文件。那么这就不难理解了。我们 Fundebug 每天的数据请求为百万级别,那么日志数据自然非常大。
使用 truncate 命令,可以将nginx容器的日志文件“清零”:
truncate -s 0 /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53/*-json.log
当然,这个命令只是临时有作用,日志文件迟早又会涨回来。要从根本上解决问题,需要 限制nginx容器的日志文件大小 。这个可以通过配置日志的 max-size 来实现,下面是nginx容器的docker-compose配置文件:
nginx: image: nginx:1.12.1 restart: always logging: driver: "json-file" options: max-size: "5g"
重启nginx容器之后,其日志文件的大小就被限制在 5GB ,再也不用担心了~
4. 重启Docker
还 有一次 ,当我清理了镜像、容器以及数据卷之后,发现磁盘空间并没有减少。根据 Docker disk usage 提到过的建议,我重启了Docker,发现 磁盘使用率从83%降到了19% 。根据高手 指点 ,这应该是与内核3.13相关的BUG,导致Docker无法清理一些无用目录:
it’s quite likely that for some reason when those container shutdown, docker couldn’t remove the directory because the shm device was busy. This tends to happen often on 3.13 kernel. You may want to update it to the 4.4 version supported on trusty 14.04.5 LTS.
The reason it disappeared after a restart, is that daemon probably tried and succeeded to clean up left over data from stopped containers.
我查看了一下内核版本,发现真的是3.13:
uname -r 3.13.0-86-generic
如果你的内核版本也是3.13,而且清理磁盘没能成功,不妨重启一下Docker。当然,这个晚上操作比较靠谱。
--EOF
没有拷贝的很全,比如作者说为什么用docker。说白了,想用就用呗,如果你有旧版本的系统要兼容。docker才是真心方便(不过一个image 2~300M还是挺纠结的。PHP+debian的镜像)
本站采用版权协议, 要求署名、非商业和保持一致. 本站欢迎任何非商业应用的转载, 但须注明出自"", 保留原始链接, 此外还必须标注原文标题和链接.
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。