Docker磁盘镜像处理
根据docker官方给出的文档(Remove unused images:删除未使用的镜像): https://docs.docker.com/engine/reference/commandline/image_prune/
API 1.21+要使用此命令,客户端和守护进程API都必须至少是 1.21。
在客户端上使用 docker version 命令检查客户端和守护进程API版本。
一、docker system prune(全面清理,不建议)
1、docker system prune
命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)
已使用镜像(used image): 指所有已被容器(包括已停止的)关联的镜像。即 docker ps -a 看到的所有容器使用的镜像。
未引用镜像(unreferenced image):没有被分配或使用在容器中的镜像,但它有 Tag 信息。
悬空镜像(dangling image):未配置任何 Tag (也就无法被引用)的镜像,所以悬空。这通常是由于镜像 build 的时候没有指定 -t 参数配置 Tag 导致的。
2、docker system df
可用于查询镜像(Images)、容器(Containers)和本地卷(Local
Volumes)等空间使用大户的空间占用情况。
[ctsp@k8s-10 ~]$ sudo docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1078 73 209.4GB 198.5GB (94%)
Containers 205 173 128.4GB 3.573kB (0%)
Local Volumes 0 0 0B 0B
Build Cache 0B 0B
如上可以看到咱们的可回收磁盘空间约为200G,占到了挂载总磁盘的 2/5;
二、docker image prune
支持 --filter
过滤;
过滤标志(--filter)格式为“key = value”。如果有多个过滤器,则传递多个标志(例如--filter "foo=bar" --filter "bif=baz")
目前支持的过滤器是:
until(
) - 仅删除在给定时间戳之前创建的映像。 标签(label=
,label= = ,label!= ,或label!= = ) -仅删除与映像(或没有,如果label!=...被使用)指定的标签。
考虑到了K8S的特性,调度算法默认是节点优选
规则,即本宿主机上的pod下次调度不一定是在本机。
三、现状:
采样宿主机IP: 10.65.3.48
一、根据时间维度:
镜像数量 | 下载时间 |
---|---|
204 | 4weeks # 超过4周的镜像数量是204个 |
157 | 2months |
141 | 5weeks |
107 | 3weeks |
93 | 2weeks |
87 | 3months |
30 | 9days |
29 | 6weeks |
23 | 7days |
23 | 2days |
19 | 6days |
16 | 13days |
15 | 4months |
14 | 10days |
13 | 3days |
12 | 8days |
10 | 5months |
二、根据镜像name维度:
现存镜像数量 | 镜像名称 |
---|---|
27 | docker.XXX.com:15000/app-yunji-server-tomcat-dev-dolphin |
14 | docker.XXX.com:15000/app-kircp-server-tomcat-dev-dolphin |
14 | docker.XXX.com:15000/app-ga-ccp-front-nginx-dev-dolphin |
13 | docker.XXX.com:15000/app-ydjw-app-server-tomcat-dev-dolphin |
13 | docker.XXX.com:15000/app-ioms-gcc-dev-dolphin |
12 | docker.XXX.com:15000/kircp-server-tomcat-dev-dolphin |
12 | docker.XXX.com:15000/app-ezview-front-xqcs-nginx-dev-dolphin |
11 | docker.XXX.com:15000/app-ga-pacc-client-nginx-dev-dolphin |
10 | docker.XXX.com:15000/app-yuanqu-ezview-backend-xm-tomcat-dev-dolphin |
10 | docker.XXX.com:15000/app-ty-kaas-server-tomcat-dev-dolphin |
10 | docker.XXX.com:15000/app-kfront-ctserver-search-server-tomcat-dev-dolphin |
10 | docker.XXX.com:15000/app-haiyan-tomcat-dev-dolphin |
10 | docker.XXX.com:15000/app-cloud-rbac-client-tomcat-dev-dolphin |
9 | docker.XXX.com:15000/ty-kaas-server-tomcat-dev-dolphin |
9 | docker.XXX.com:15000/kstp-cache-tomcat-dev-dolphin |
9 | docker.XXX.com:15000/datamodel-web-nginx-dev-dolphin |
9 | docker.XXX.com:15000/app-ty-pigeon-tomcat-dev-dolphin |
9 | docker.XXX.com:15000/app-ty-ioms-dau-gcc-dev-dolphin |
9 | docker.XXX.com:15000/app-kidp-patrol-server-tomcat-dev-dolphin |
9 | docker.XXX.com:15000/app-app-management-mobile-backend-tomcat-dev-dolphin |
8 | docker.XXX.com:15000/jt-illegal-img-gather-tomcat-dev-dolphin |
8 | docker.XXX.com:15000/cloud-rbac-client-front-nginx-dev-dolphin |
8 | docker.XXX.com:15000/app-yj-safe-server-tomcat-dev-dolphin |
7 | docker.XXX.com:15000/ga-pacc-server-tomcat-dev-dolphin |
7 | docker.XXX.com:15000/ga-haiou-tool-tomcat-dev-dolphin |
四、优化方案:
引入容器label的使用:
在实际运维过程中,大量的容器可能会一些运维上的挑战(K8S节点优选模式下本地镜像占用大量磁盘),通过使用label,可以很好的将容器分类。label贯穿于docker的整个过程。 这个label可以作为你区分业务,区分模板各种区分容器的标识,通过标识,可以将容器更好的进行分组:
格式:
LABEL <key>=<value>
如需多个:
注:一个镜像可以有多个label。要指定多个labels,Docker推荐尽可能地把多个labels合并到一个LABEL指令中去。每一个LABEL指令会生成一个新的镜像层,如果你使用多个label,将导致构建出一个低效的镜像。
LABEL multi.label1="value1" multi.label2="value2" other="value3"
针对混合云场景(初定格式):
- 单标签(业务):
LABEL isservice="true"
- 单标签(基础服务):
LABEL isbaseservice="true"
- 多标签(业务):
LABEL isservice="true" serviceversion="v2" other="value3"
- 多标签(基础服务):
LABEL isbaseservice="true" serviceversion="v2" other="value3"
dockerfile中:
## 单标签:
FROM openjdk:jre-alpine
LABEL isservice="true"
## 多标签:
FROM openjdk:jre-alpine
LABEL isservice="true" serviceversion="v2" other="value3"
node维度清理策略:
第一版:仅针对混合云各个node节点的节点镜像根据时间维度来做了筛选:
##每天凌晨3点清理10天前的镜像
0 3 * * * /bin/docker image prune --all --force --filter "until=240h"
预期:达到了清理的目的;
缺点: - 不可以针对底层核心组件镜像做过滤(nginx, node, tomcat, dns等); - 应用到现场有风险(底层镜像被删除会影响核心组件)
第二版:增加以label维度的筛选策略,避免核心底层镜像被误删:
0 3 * * * /bin/docker image prune --all --force --filter "until=240h" --filter "label!=isbaseservice=true"
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!