docker磁盘或者镜像清理相关内容
# 1,查看磁盘占用
docker system df 命令,类似于 Linux上的 df 命令,用于查看 Docker 的磁盘使用情况:
docker system df
TYPE列出了 Docker 使用磁盘的 4 种类型:
- Images :所有镜像占用的空间,包括拉取下来的镜像,和本地构建的。
- Containers :运行的容器占用的空间,表示每个容器的读写层的空间。
- Local Volumes :容器挂载本地数据卷的空间。
- Build Cache :镜像构建过程中产生的缓存空间(只有在使用 BuildKit 时才有,Docker 18.09 以后可用)。
最后的 RECLAIMABLE 是可回收大小。
- docker system prune : 可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及 dangling 镜像(即无 tag 的镜像)。
- docker system prune -a : 清理得更加彻底,可以将没有容器使用 Docker镜像都删掉。 注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的 Docker 镜像都删掉了。
# 2,清理镜像
# 1,介绍
使用 docker image prune
可以 删除未使用的映像,注意API 1.21+ (opens new window)要使用此命令,客户端和守护进程 API 都必须至少是 1.21 (opens new window) 。
$ docker image prune -h
Flag shorthand -h has been deprecated, please use --help
Usage: docker image prune [OPTIONS]
Remove unused images
Options:
-a, --all Remove all unused images, not just dangling ones 删除所有未使用的映像,而不仅仅是悬空映像
--filter filter Provide filter values (e.g. 'until=<timestamp>') 提供过滤值(例如'until =“)
-f, --force Do not prompt for confirmation 不要提示确认
2
3
4
5
6
7
8
9
10
11
# 2,删除所有悬空镜像。
删除所有悬空映像。如果-a
指定,还将删除任何容器未引用的所有映像。
$ docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
2
3
4
# 3,过滤
过滤标志(--filter
)格式为"key = value"
。如果有多个过滤器,则传递多个标志(例如--filter "foo=bar" --filter "bif=baz"
)
目前支持的过滤器是:
- until(
<timestamp>
) - 仅删除在给定时间戳之前创建的映像 - 标签(
label=<key>
,label=<key>=<value>
,label!=<key>
,或label!=<key>=<value>
) -仅删除与映像(或没有,如果label!=...
被使用)指定的标签。
该until
过滤器可以是 Unix 的时间戳,日期格式的时间戳,或持续时间字符串(例如,去10m
,1h30m
)计算相对于守护机器的时间。支持的格式为日期格式时间戳包括 RFC3339Nano,RFC3339, ,2006-01-02T15:04:05
,2006-01-02T15:04:05.999999999
,2006-01-02Z07:00
和2006-01-02
。如果在时间戳结束时未提供 a Z
或 +-00:00
时区偏移,则将使用守护程序上的本地时区。提供 Unix 时间戳时输入秒[.nanoseconds],其中秒是自 1970 年 1 月 1 日(午夜 UTC / GMT)以来经过的秒数,不计算闰秒(也称为 Unix 纪元或 Unix 时间)和可选项。纳秒字段是一秒的一小部分,不超过九位数。
的label
过滤器接受两种格式。一个是label=...
(label=<key>
或label=<key>=<value>
),它删除具有指定标签的映像。另一种格式是label!=...
(label!=<key>
或label!=<key>=<value>
),它删除没有指定标签的映像。
预测将被删除的内容
如果使用正过滤(测试标签是否存在或标签是否具有特定值),则可以使用
docker image ls
相同的过滤语法查看哪些映像与过滤器匹配。但是,如果使用的是负过滤(测试对于不存在标签的或标签并不具有特定的值),这种类型的滤波器的不与工作
docker image ls
所以不能容易地预测哪些映像将被移除。此外,即使您正在使用,确认提示docker image prune
始终会警告所有悬空映像将被删除--filter
。
以下删除之前创建的映像2021-01-01T00:00:00
。
查看:
$ docker images --format 'table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}\t{{.Size}}'
REPOSITORY TAG IMAGE ID CREATED AT SIZE
test latest 65f677cc947a 2021-08-19 22:38:05 +0800 CST 445MB
registry.cn-hangzhou.aliyuncs.com/eryajf/centos 7.8 5ea7c3a67505 2020-11-01 18:32:46 +0800 CST 475MB
2
3
4
执行删除:
$ docker image prune -a --force --filter "until=2021-01-01T00:00:00"
Deleted Images:
untagged: registry.cn-hangzhou.aliyuncs.com/eryajf/centos:7.8
untagged: registry.cn-hangzhou.aliyuncs.com/eryajf/centos@sha256:f7c413edcad7a3389e079cf04b4cddb46c96d67d29bf8c0d48dbd1ceeee2b474
deleted: sha256:5ea7c3a675055762552ad50b6f293bb050bdee188da3a2c37c61be90450f5987
deleted: sha256:c8279b704e4fb851f28a3fe2f02365df13bed3b6cc9b1fae6b2c50d562b04cec
deleted: sha256:e5a0eda56319769809257786837e4478e778aba54cdac72a468a8ac053637ca4
deleted: sha256:da34d2fe9e29af7b5ad6447089b19c2d0c7aa11d79641ca25e3de88a851706c7
deleted: sha256:613be09ab3c0860a5216936f412f09927947012f86bfa89b263dfa087a725f81
Total reclaimed space: 475.2MB
2
3
4
5
6
7
8
9
10
11
可以看到在这个时间点之前的 centos 镜像被删除了。如果这个镜像在占用状态,则不会删除。查看验证:
$ docker images --format 'table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}\t{{.Size}}'
REPOSITORY TAG IMAGE ID CREATED AT SIZE
test latest 65f677cc947a 2021-08-19 22:38:05 +0800 CST 445MB
2
3
其他一些用法
:
删除超过 10 天
240h
前创建的映像:$ docker image prune -a --force --filter "until=240h"
1使用标签删除映像
deprecated
:$ docker image prune --filter="label=deprecated"
1删除标签
maintainer
设置为的映像john
:$ docker image prune --filter="label=maintainer=john"
1删除没有
maintainer
标签的映像:$ docker image prune --filter="label!=maintainer"
1删除维护者标签未设置为的映像
john
:$ docker image prune --filter="label!=maintainer=john"
1
注意:在prune
删除任何内容之前,系统会提示您进行确认,但不会显示可能删除的内容列表。此外,docker image ls
不支持负过滤,因此很难预测实际将删除哪些映像。
# 3,定义容器日志大小
在 docker 环境部署之后,我们可以直接通过配置文件参数来定义单个容器日志的大小,在/etc/docker/daemon.json 添加如下配置后重启 docker:
"log-opts": {
"max-size":"300M",
"max-file":"3"
},
"data-root": "/data/docker/docker-data/"
2
3
4
5
注意:已存在的容器需要删除重建后才可以生效,因此尽量在 docker 投入生产之前进行配置。
参数说明:max-size 指定日志文件最大空间,max-file 指定日志滚动的次数,以上配置单个容器最大日志为 900M。data-root 指定 docker 数据目录。