Docker清理方案

Docker清理方案

要:随着公司业务量上升,传统服务逐渐过渡到docker形式,我们的工作效率有很大的提高,再也不用纠结线上,测试环境不一致的问题,也不用为部署一个服务,需要下载配置大量额外组件而烦恼。但是不可逃避的问题就是:我们的容器和镜像越来越多,并且占用的空间也是特别大,那么我们该如何对Docker进行清理呢?

1.既然需要清理,我们一定要先要学会查,这样才能了解占用空间的情况

  • docker system df   

这个命令是在docker1.13版本以后引入的。用来查看docker资源占用情况

参数大多数可以看得懂,这里我解释下ACTIVE,和RECLAIMBLE ,被标记为ACTIVE的镜像实际是我们不打算删除的,RECLAIMBLE表示可回收的资源

-v 参数可以查看具体占用资源的细节,确认是哪个镜像,哪个网络卷。

查看Image 的数量有一个注意:

[root@cl-29-test overlay2]# docker images -q
6b731d6ad62b
3a97aad366a9
568c4670fa80
3f7d982053f3
f7a112659079
75835a67d134
2e2f252f3c88
2e2f252f3c88
4ef0a7a33734
4ee8f190f366
cdcf1bed7eb4
fcb8aa7a0640
0f6c96580032
8ddadb143133
9c46a7b5e517
f9d5de079539
f9d5de079539

[root@cl-29-test overlay2]# docker images -q |wc -l
17

这里面包含重复的镜像id.所以列出17个image,通过去重后能够和15正确匹配

[root@cl-29-test overlay2]# docker images -q |uniq|wc -l
15

  • 重要的docker inspect

docker inspect 可以查看容器的很多信息,包括存储引擎,容器Ip ,挂载卷,CMD命令,环境变量,主机名等信息 

既然我们研究docker的资源,我们有必要提一下docker存储引擎之1的overlay2

[root@cl-29-test overlay2]# docker inspect centos:latest

我们可以看到最终的资源都存储在 /var/lib/docker/overlay2/目录下面 ,overlay2是overlay的加强版。这里不过多介绍。我会另写一片关于存储驱动的博文。

2.资源自动清理命令

  • docker system pune

[root@cl-29-test overlay2]# docker system prune
WARNING! This will remove:
– all stopped containers       (所有已停止的容器)   
– all networks not used by at least one container (所有没被引用的网络空间)
– all dangling images               (悬空镜像)
– all dangling build cache           (悬空镜像的缓存)

这里介绍下Image的几个状态:

  1. 已使用镜像(used image):已被容器(包括停止的)所使用关联的镜像也就是docker ps -a 的容器使用的镜像
  2. 未引用镜像(unreferfenced image):没有被分配或者没在容器使用的镜像,但是他有Tag信息。
  3. 悬空镜像(dangling images):未配置任何tag的镜像,没法被引用,所以悬空,通常是因为build 时候没有指定 -t 参数 导致没有配置tag 

docker system prune 自动清理说明

  • 已停的容器
  • 未被任何容器使用的卷
  • 未被任何容器所关联的网络
  • 所有悬空镜像

该指令默认只会清除悬空镜像,未被使用的镜像不会被删除

注意: -a 参数 可以一并删除所有未使用镜像和悬空镜像,慎用!!!!!生产环境下不允许用这个,因为有时候我们有一些回滚的镜像,或者依赖的镜像可能被误删。

            -f 参数可以忽略相关告警信息

[root@cl-29-test overlay2]# docker system prune
WARNING! This will remove:
– all stopped containers
– all networks not used by at least one container
– all dangling images
– all dangling build cache
Are you sure you want to continue? [y/N] y
Deleted Containers:
e11d391e1eb67ab6b208f69ca0cb351959c726860d66daa9adaf30e4f234641a
dec40cd62168aa80c9c8c1f4e190746021bc1ba59221bc1c30ac3b2594ede933
328a83b4a96fd9798599e77702c718b7da74d4e667978a97b8b15a307b0bf396
3ade4694a37c8dee09e9a1cef8ea1f7410d2f64fa56d61fdee83a7f30ac42472
e7803bb45bda148fe424c6abcd72ab1d823ee4784822411e314db3998f587791
8c982cb31e604796b0f631608324bedf88518e38db772cddea639024cb855524
00b3c390dbc14932a0c66624a4c2f53032ef4403bfd390f336d094e0fdb949c7
e41af15e6419e2f266f30fe60f8da296a2920d983e3eb4cd91331b8ae194ac28
9d978377744cb95ffc1f763fd69664c693ac0de33c1787cc6a01c7f921e9da7c
6f159d5bdd19c64303edf94a86d56638b9bca2e8fcecb1c7ebebe49a0d51ec4d
158f1e56c42175e52cea4a3d542d2ec6c1d848072ca6cf4ebd4df4e4f234b12d

Deleted Networks:
harbor_harbor

Total reclaimed space: 430.7kB
[root@cl-29-test overlay2]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cf01356fe2c7 tale_test “/usr/bin/supervisord” 2 hours ago Up 2 hours dreamy_ellis
[root@cl-29-test overlay2]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cf01356fe2c7 tale_test “/usr/bin/supervisord” 2 hours ago Up 2 hours dreamy_ellis

根据执行命令后的输出,我们可以看到清理了哪些资源。最后清理了430.7k。 看来删除的比较多的是stop状态的容器,以及对应的网络。空间只清理了430k.也是符合逻辑的,通过docker system df -v 查看到真正占用空间的是image,而不是容器和网络空间。当然很多时候我们的volume卷才是占用最大的。

[root@cl-29-test overlay2]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 15 1 2.547GB 2.371GB (93%)
Containers 1 1 815B 0B (0%)
Local Volumes 2 0 88.95MB 88.95MB (100%)
Build Cache 0 0 0B 0B

总结:我们清理时候,需要先通过docker system df -v 查看占用资源最多的是哪个,定位问题很重要,否则想我刚才删除了很多容器但是空间释放却很小。定位了具体资源后,要和开发或者其他技术确认是否可以删除。不要私自做决定。另外养成一个好习惯就是当你可以确认没用的Image ,容器,volume 挂载卷时,在日常使用时候就删除掉

docker rm -f 容器Id 

docker rmi image id

https://juejin.im/post/5a1bd8565188255cca52cdcb  这篇文章很好,推荐大家去看

 

 

 

 

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Loading...