docker垃圾清理
一.docker镜像与容器删除
docker images #查看所以镜像
docker ps #查看正在运行的容器
docker ps -a #查看所有容器(无论是否在运行)
docker ps -a -q #加上-q只显示id
docker stop 容器名或id #停止容器
docker rm 容器名或id #删除容器
docker rm -f 容器名或id #强制删除容器
docker rmi 镜像名加上标签或id #删除镜像
docker rmi -f 镜像名加上标签或id #强制删除镜像
docker rmi $(docker images | grep "<none>" )
#使用grep匹配删除所有为none的容器
docker rmi $(docker images -q)
# 要删除全部image
二.docker磁盘空间清理
1.使用docker system清理
docker system df命令查看docker占用的磁盘空间,类似linux的df命令
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 18 6 2.508GB 1.892GB (75%)
Containers 19 2 275.8MB 275.8MB (99%)
Local Volumes 95 3 140.9kB 140.9kB (100%)
Build Cache 0 0 0B 0B
可以看到,Docker镜像占用了2.5GB磁盘,Docker容器占用了275.8MB磁盘,Docker数据卷占用了一点磁盘。
docker system prune命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。
docker system prune -a命令清理得更加彻底,可以将没有容器使用Docker镜像都删掉。这个很危险,一般不用
2. 手动清理Docker镜像/容器/数据卷
对于旧版的Docker(版本1.13之前),是没有docker system命令的
对于docker而言,一点点的容器镜像空间是没有多少的,日志是大头
所以删除日志才是王道(删之前要考虑清楚哦)
在linux上,Docker的所有相关文件,包括镜像、容器等一般都保存在/var/lib/docker/目录中:
使用du命令查看占用
du -hs /var/lib/docker/
3.4G /var/lib/docker/
刚建立不是很多,但是还是有点大的
使用du命令继续查看,可以定位到真正占用这么多磁盘的目录
3.4G /var/lib/docker/overlay2
发现是overlay2占用的,overlay2 是 Docker 默认的存储驱动之一,主要用于管理容器的文件系统层(Layer)
它存储的是 镜像层和容器层的数据,这个一般不直接清理,通过删除容器和镜像清理
但是上次在云服务器上有个服务宕机了,一查发现是空间不够导致数据库连不上,赶紧释放了一些资源
后面发现是/var/lib/docker/containers占了200多G
发现是一个比赛平台的日志占用了190多G这就对了,每天请求这么多,日志不多才怪
使用truncate命令,可以将容器的日志文件“清零”:
truncate -s 0 /var/lib/docker/containers/容器id/*-json.log
当然,这个命令只是临时有作用,日志文件迟早又会涨回来。要从根本上解决问题,需要限制容器的日志文件大小。这个可以通过配置日志的max-size来实现,可以通过容器的docker-compose配置文件
我是gzctf平台,为 gzctf 和 db 服务添加 logging 配置:
logging:
driver: "json-file"
options:
max-size: "10g"
max-file: "3"
重启容器之后,其日志文件的大小就被限制在30GB,分三个文件,再也不用担心了!
在重启docker,刷新磁盘状态
三、Docker目录/var/lib/docker/containers文件太大
Docker在不重建容器的情况下,日志文件默认会一直追加,时间一长会逐渐占满服务器的硬盘的空间,内存消耗也会一直增加,我们要加以控制
1. 查出占用磁盘较大的文件
Docker 的日志文件存在 /var/lib/docker/containers 目录中,通过下面的命令可以将日志文件夹根据升序的方式罗列出来。
sudo du -d1 -h /var/lib/docker/containers | sort -h
2. 清理单个文件
感觉哪个容器的日志太大就清理哪个
sudo sh -c "cat /dev/null > 文件的决定地址"
这只是临时解决的方式,最好是创建容器时就控制日志的大小.
启动容器时,我们可以通过参数来控制日志的文件个数和单个文件的大小
# max-size 最大数值
# max-file 最大日志数
$ docker run -it --log-opt max-size=10g --log-opt max-file=3 redis
#在dockerfile目录内
一两个容器还好,但是如果有很多容器需要管理,这样就很不方便了,最好还是可以统一管理
3. 全局配置
创建或修改文件 /etc/docker/daemon.json,并增加以下配置
{
"log-driver":"json-file",
"log-opts":{
"max-size" :"50m","max-file":"1"
}
}
随后重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
不过已存在的容器不会生效,需要重建才可以!
当实力与野心不匹配时,唯有努力