Docker - 清理Docker占用的磁盘空间
通过docker重新发布一个线上jar包时,报错如下:
failed to copy files: failed to copy file: Error processing tar file(exit status 1): write /xx.jar: no space left on device
Unable to find image 'xx:latest' locally
docker: Error response from daemon: pull access denied for xx, repository does not exist or may require 'docker login': denied: requested access to the resource is denied.
See 'docker run --help'.
给出提示是 :设备上没有剩余空间,docker加载镜像空间不足。
Docker一个不大不小的问题,会比较消耗磁盘空间。如果Docker一不小心把磁盘空间全占满了,服务也就宕掉了。
1、Docker System命令
docker默认存放镜像地址为 /var/lib/docker
在进行资源清理之前我们有必要搞清楚 docker 都占用了哪些系统的资源。这需要综合使用不同的命令来完成
通过
sudo docker info 命令查看(显示系统级别的信息,比如容器和镜像的数量等)
sudo docker info:显示系统级别的信息,比如容器和镜像的数量等。docker container ls:默认只列出正在运行的容器,-a 选项会列出包括停止的所有容器。docker image ls:列出镜像信息,-a 选项会列出 intermediate 镜像(就是其它镜像依赖的层)。docker volume ls:列出数据卷。docker network ls:列出 network。
还可借助如下命令查看磁盘使用情况
df -h 查看磁盘使用情况(服务器内存大小)
df -i 查看inode使用情况
du -sh *
查看当前目录下各个文件及目录占用空间大小
df -h 查看磁盘使用情况(服务器内存大小)
df -i 查看inode使用情况
df -h /var/lib/docker 命令 查看 docker中剩余空间,发现使用 了 100%
df -h /var/lib/docker
我们也可以参考文章《谁用光了磁盘?Docker System命令详解》,文中详细介绍了Docker System命令,它可以用于管理磁盘空间。
docker system df 命令,类似于Linux上的df命令,用于查看Docker的磁盘使用情况:
docker system df
该命令列出了 docker 使用磁盘的 4 种类型
Images: 所有镜像占用的空间,包括拉取的镜像、本地构建的镜像
Containers: 运行中的容器所占用的空间(没运行就不占空间),其实就是每个容器读写层的空间
Local Volumes: 本地数据卷的空间
Build Cache: 镜像构建过程中,产生的缓存数据
最后一列RECLAIMABLE,是指可清理的
从上图看出,Docker镜像占用了1.793GB磁盘,Docker容器占用了2.088GB磁盘,Docker数据卷Local Volumes占用了0B磁盘
docker system df -v 命令可以进一步查看单个image镜像、container容器空间占用细节,以确定是哪个镜像、容器或本地卷占用过高空间
docker system df -v
解决方案:
docker system prune 命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)
docker system prune -a 命令清理得更加彻底,可以将没有容器使用Docker镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的Docker镜像都删掉了……所以使用之前一定要想清楚
#docker system prune 命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)
docker system prune已停止的容器(container)
未被任何容器所使用的卷(volume)
未被任何容器所关联的网络(network)
所有悬空镜像(image)或
#docker system prune -a 命令清理得更加彻底,可以将没有容器使用Docker镜像都删掉
docker system prune -a
执行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
或者 通过 df -h /var/lib/docker 命令 查看 docker中剩余空间,发现只使用了 10%
2、/var/lib/docker/overlay2 磁盘爆满
[root@xx xx-core]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 16G 0 16G 0% /dev
tmpfs 16G 16K 16G 1% /dev/shm
tmpfs 16G 1.6G 15G 11% /run
tmpfs 16G 0 16G 0% /sys/fs/cgroup
/dev/mapper/centos_temp--mini--centos7-root 92G 92G 20K 100% /
/dev/sda1 1014M 182M 833M 18% /boot
tmpfs 3.2G 0 3.2G 0% /run/user/0
/dev/mapper/vggroup-lv_data 2.0T 80G 2.0T 4% /data
overlay 92G 92G 20K 100% /var/lib/docker/overlay2/7bab26bb2bb4634174aed26787be242a917ca7db8e26081866ca863a4b891111/merged
overlay 92G 92G 20K 100% /var/lib/docker/overlay2/05bc176d2823f6e0c4258649ca749438eaa29e7be5c7ac19c50bd64a9fbcb9e3/merged
overlay 92G 92G 20K 100% /var/lib/docker/overlay2/81dc3e155397c16fc961eef7dcd99ebfd37a96d9b81e4be0636ed0ade8f9a67a/merged
overlay 92G 92G 20K 100% /var/lib/docker/overlay2/f61ae4177cae509eb3886b1e225951d376c0dffe446d43b1d8ce0d6eeb965ab4/merged
overlay 92G 92G 20K 100% /var/lib/docker/overlay2/115c4531e8eccc2ca6bbc4e84090a361b2458d28c07b5da2e4a46eeb66e425c7/merged
overlay 92G 92G 20K 100% /var/lib/docker/overlay2/43883c34f85a329a0eca43e5c1c18fe5f4285ab5c8a70af1a9674fa4e2bd6dc8/merged
overlay 92G 92G 20K 100% /var/lib/docker/overlay2/6b7de766ac8c18097313329c449771e3f3b681efd2c916c966671070d4c7dc1a/merged
overlay 92G 92G 20K 100% /var/lib/docker/overlay2/047a0c4788b63d6fdaefb7fae9b3715057e4101243492709311aa5263373121e/merged
/var/lib/docker/image/overlay2:存储镜像管理元数据的目录,以使用存储驱动命名。
/var/lib/docker/overlay2: docker镜像存储的联合挂载根目录
overlay2表示Docker的存储驱动,可参考
Docker存储驱动之OverlayFS简介_styshoo的博客-CSDN博客
容器/镜像等都会存在这个目录下,当量大的时候就会占满硬盘,也可参考官网
Use the OverlayFS storage driver | Docker Documentation
overlay 分区是 Docker 的虚拟文件系统,其真实的文件系统是 /dev/vda1
1、无用的镜像和容器太多
使用以下命令大致看下情况
docker system df -v
# 用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及无tag的镜像。
docker system prune# 可以将没有容器使用 Docker 镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的Docker镜像都删掉了
docker system prune -a
2、容器输出的日志太大
这种情况往往是容器长时间运行,容器打印了大量的日志未清理,占据了大量磁盘空间。比如之前运行的一个Jenkins容器,运行几个月后,打印的日志占了近10个G的磁盘。这种情况下清理日志文件就行了
容器的日志文件在/var/lib/docker/containers/{containerId}下
查看文件的大小
du -h --max-depth=1
在该目录下,会存在以目录名为前缀,以“-json.log”为后缀的目录文件;可以删除日志文件,也可调整应用程序让打印的日志保持在某种大小
上述方法不行,可
1、首先找到overlay2目录
cd /var/lib/docker/overlay2
2、查看文件的大小
du -h --max-depth=1
找到比较大的文件
3、查看占用空间的pid,以及对应的容器名称
[root@xx overlay2]# docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}' | grep "43883c34f85a329a0eca43e5c1c18fe5f4285ab5c8a70af1a9674fa4e2bd6dc8"
125440, /energy-task-mgl, /var/lib/docker/overlay2/43883c34f85a329a0eca43e5c1c18fe5f4285ab5c8a70af1a9674fa4e2bd6dc8/work
4、解决方法(会删除对应的容器和对应镜像)
docker stop energy-task-gd && docker rm energy-task-gd && docker rmi image_id
再使用df -h 查看
df -h
网上很多误导说是overlay的原因,然后去迁移路径什么的。其实和overlay没关系(它的usage和真实的disk usage相同),它只是一个docker的虚拟文件系统,真实的文件系统是前者/dev/vda1,可以看到路径所指为根目录,所以你要去找是哪里出现了垃圾;如下
(1)日志文件。如nginx日志,配置的时候就应该给个日志限制,防止不断增长
大文件占用了 /dev/vda1 分区。这个分区一般是挂载在 “/” 下面。
可以重点关注下面几个目录:
- /var/tmp
- /var/log
- /root
(2)/tmp 。 这个路径下可能藏了很多例如python安装模块产生的临时文件,注意定时清理
3、手动清理Docker镜像/容器/数据卷
对于旧版的Docker(版本1.13之前),是没有Docker System命令的,因此需要进行手动清理。这里给出几个常用的命令:
docker rmi [image]或 docker image rm [image]
支持的子命令如下:
-f, -force:
强制删除镜像,即便有容器引用该镜像
-no-prune:
不要删除未带标签的父镜像
删除所有关闭的容器:
docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm
删除所有dangling镜像(即无tag的镜像):
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
dangling是一种特殊的,不会再被使用到的镜像,docker有专门清理dangling镜像的命令
docker image prune -f
删除所有dangling数据卷(即无用的Volume):
docker volume rm $(docker volume ls -qf dangling=true)
4、自动化删除none标签镜像或异常容器
配置自动化删除,在对应的机器上配置crontab
1. crontab -e
2. 添加如下指令(分别在凌晨前删除none标签的镜像和异常退出的容器)
59 23 * * * docker rmi -f `docker images | grep '' | awk '{print $3}'`59 23 * * * docker rm `docker ps -a | grep Exited | awk '{print $1}'
5、限制容器的日志大小
有一次,当我使用1与2提到的方法清理磁盘之后,发现并没有什么作用
我们使用 docker 镜像创建容器时,docker会创建一些目录,如:
/var/lib/docker/containers/<容器ID> 目录,如果容器使用了默认的日志模式,那么该容器的日志会以 JSON 形式保存在此目录下
/var/lib/docker/overlay2 目录,该目录包含容器的读写层,如果容器使用自己的文件系统保存了数据,那么这些数据就会写到此目录下
Containers 包含的我们容器自身的容量、产生的数据容量、产生的日志容量
# 查看所有容器下日志的大小
find /var/lib/docker/containers/ -name *-json.log |xargs du -sh
# 写个空文件到容器日志中
cat /dev/null > /var/lib/docker/containers/2d2f01c90365bd6926bcc01f9fb17d399eb2ebecb0bd3c808ee5b6c11ae4083d/2d2f01c90365bd6926bcc01f9fb17d399eb2ebecb0bd3c808ee5b6c11ae4083d-json.log
# 将某个日志文件清零Docker - 清理Docker占用的磁盘空间相关推荐
- 清理微信占用大量磁盘空间
1.打开微信选择"三-设置" 2.点击"文件管理",看见微信文件的默认保存位置,选择"打开文件夹" 3.找到C:\新建文件夹\WeChat ...
- [转帖]Docker 清理占用的磁盘空间
Docker(二十七)-Docker 清理占用的磁盘空间 https://www.cnblogs.com/zhuochong/p/10076599.html docker system docker ...
- 如何清理Docker占用的磁盘空间?
摘要:用了Docker,好处挺多的,但是有一个不大不小的问题,它会一不小心占用太多磁盘,这就意味着我们必须及时清理. 作为一个有信仰的技术公司,我们Fundebug的后台采用了酷炫的全Docker化架 ...
- 如何清理Docker占用的磁盘空间? 1
摘要:用了 Docker,好处挺多的,但是有一个不大不小的问题,它会一不小心占用太多磁盘,这就意味着我们必须及时清理. 作为一个有信仰的技术公司,我们Fundebug的后台采用了酷炫的全 Docker ...
- 【已解决】docker overlay2占用大量磁盘空间处理方法
在使用docker容器的时候遇到了容量上的问题,做一个记录 处理方式1: 在使用docker时,往往会出现磁盘空间不足,导致该问题的通常原因是因为docker中部署的系统输出了大量的日志内容. 此时, ...
- docker overlay2占用大量磁盘空间处理方法
在使用docker时,往往会出现磁盘空间不足,导致该问题的通常原因是因为docker中部署的系统输出了大量的日志内容. 此时,可通过手动或定时任务进行清除. 针对/var/lib/docker/ove ...
- docker查找占用主机磁盘空间最大的容器
docker查找占用主机磁盘空间最大的容器 1.背景 有时候我们一台主机上部署了多个容器,而且对部分数据做了持久化,时间长了,数据会越来越多,相应的可能会造成磁盘空间不足?那么我们如何,找出占用磁盘空 ...
- Docker Desktop删除镜像后磁盘空间未减少
感谢:windows docker磁盘占用问题,删除镜像但还是占用着磁盘空间的解决方案_weixin_43271225的博客-CSDN博客_docker删除镜像磁盘未释放 因为 windows 中的 ...
- Windows 的 docker 删除容器后 WSL2 磁盘空间不释放的问题
Windows 的 docker 删除容器后 WSL2 磁盘空间不释放的问题 1.起因及原因 2.解决 2.1 找到要压缩的虚拟磁盘文件 2.2 关闭 Docker Desktop 2.3 压缩虚拟磁 ...
最新文章
- Java非阻塞I/O模型之NIO说明
- php笔记之-PHP文件系统
- 【前端】你打console.log要花几秒?
- 排序算法 —— 插入排序
- python 字符串报错 but no encoding declared
- 前端学习(148):html和xhtml的区别
- “编程能力差,90%输在了数学上!”CTO:多数程序员都是瞎努力!
- Linux服务之httpd基本配置详解
- ftl 展示图片_视频号变迁的内容展示逻辑
- mysql substring函数截取值后赋给一个declare变量
- 字节跳动1/3员工不支持取消大小周!库克称iPhone将采用可回收材料生产;清华博士接亲被要求现场写代码|极客头条...
- php装curl拓展出错
- python 返回函数,偏函数,装饰器,itertools,collections,dir()type()
- php 伪静态 获取当前页面路径_php url伪静态过程详解
- matlab 神经识别取整数_Matlab取整
- bt采集蜘蛛,开源版
- 互联网裁员形势严峻,2019年程序员的发展空间还有多大?
- 一个很实用的造数工具—Spawner Data Generator
- 内窥镜去反光的论文整理(转)
- f7功能键使用计算机,F1到F12都代表什么 电脑键盘上F1-F12键的用法
热门文章
- 加载动态库失败(loadLibrary返回为空)的几种解决办法
- mysql中的exists嵌套_基于mysql 的exists 嵌套查询的详解
- 交换友情链接的注意事项
- java取款_JAVA实现账户取款和存款操作
- 2023.1.2(总结)
- Ubuntu配置编译环境jack-server问题解决
- html与js项目引入react框架之Hook
- 易语言之X64位内存注入DLL技术
- python中char是什么_char是Python的内置函数吗,python,之内
- 论文翻译及笔记 --Visual Place Recognition: A Survey