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"