Docker镜像仓库清理的探索之路

用友云开发者中心是基于Docker容器进行微服务架构应用的落地与管理。相信各位同学在使用的过程中,会发现随着Docker镜像的增多,占用磁盘空间也约来越多。这时我们需要清理私有镜像仓库中不需要的镜像。但在实际操作时,才会发现这本以为很简单的任务中却暗藏玄机,遇到了不少的麻烦。在这里我们分享一下清理镜像仓库时遇到的坑点。想要直接寻求解决方案的同学可以直接看第二部分。
一、那些年,我们在清理镜像仓库时走过的坑
坑点1:官方提供的接口并不能真正的删除镜像
这着实是最大的坑点。很多同学查资料发现,官方已经提供了删除镜像仓库的API,所以可能相当然的以为直接使用就好,殊不知掉入了官方埋下的最大的坑点,也是本文要着手解决的核心问题:官方提供的删除镜像仓库中镜像的接口,仅仅是把manifest删除了,真正的镜像文件还存在!官方并没有提供删除镜像层的接口!这也就是说,当我们调用删除镜像的接口之后,仅仅是查看镜像的列表时看不到原镜像了,然而原有镜像仍然在磁盘中,占用着宝贵的文件存储空间。
  坑点2:直接调用官方的删除镜像API,会返回405的错误码
直接调用删除镜像的接口,可能会遇到以下错误提示:

405,意味着方法不被允许。实际上,官方可能是处于安全性的考虑,在默认的情况下禁止了直接删除镜像的功能。若要开启删除镜像功能,需要修改镜像仓库的配置文件。具体操作为修改/etc/docker/registry/config.yml文件,在storage下添加delete的许可之后,重启镜像仓库服务。
  坑点3:使用官方提供的garbage-collect工具,会有无用的文件残留
官方为registry提供了garbage-collect(gc)工具清理镜像的物理存储,将没有引用的layer删除。
gc的清理过程分为两部分:
1)mark:扫描所有的manifest,列出引用的layer;
2)sweep:扫描所有的layer,不在mark里的layer将被清理删除。
gc可以在dry-run的模式下运行(添加参数-d),只输出gc信息,不进行实际操作。我们可以通过这种方式来确认哪些镜像会被清除。
使用gc工具清理镜像的一个问题就是文件清理得不够干净,无法清理已经没有tag的镜像目录,并且还残存少部分文件,从十KB到几十KB不等。久而久之,垃圾文件和目录的数量会越来越多。
坑点4:garbage-collect不是事务操作,清理镜像时可能会产生误操作
gc不是事务操作,当gc过程中刚好有push操作时,则可能会误删数据。一个可行的解决办法是手动更改镜像仓库的配置,暂时禁止镜像的push操作。
在镜像仓库的配置文件中可以配置read-only模式。当启用read-only之后,再push镜像时会得到405的错误。gc完成后取消read-only模式,再push镜像即可。
坑点5:使用garbage-collect工具后,必须重启镜像仓库才能正常使用
如果不重启镜像仓库,则再次push该镜像时可能会得到layer already exists错误:

其可能的原因是镜像被删除后,仓库的缓存中还存有已经删除的镜像信息,所以再次push会报层存在的错误。
二、两种清理镜像仓库的方案
方案一:使用官方API + GC
使用官方提供的方法可以较为简便的清理镜像仓库。整个清理过程可能需要几百毫秒到几秒的时间。此操作有一定的危险性,因此清理镜像不宜过于频繁。官方在git上也有类似描述。点击查看:https://github.com/docker/docker-registry/issues/988
具体操作过程如下:
1、准备工作
在配置中许可删除操作。修改镜像仓库的配置文件,一般在如下路径:
/etc/docker/registry/config.yml
在storage下添加delete的许可之后,重启镜像仓库。

用docker方式启动的镜像仓库也可以添加环境变量:
REGISTRY_STORAGE_DELETE_ENABLED=true
2、获取待删镜像的digest
获取镜像digest的API为:
GET /v2/<name>/manifests/<reference>
其中,name是仓库名,reference是标签,此时需要注意,调用时需要加上header内容:
Accept: application/vnd.docker.distribution.manifest.v2+json
其中Docker-Content-Digest的值就是镜像的digest
3、调用官方的HTTP API V2删除镜像
删除镜像的API为:
DELETE /v2/<name>/manifests/<reference>
其中,name是仓库名称,reference是包含“sha256:”的digest。
4、调用GC清理镜像文件
使用gc工具的方式为:
bin/registry garbage-collect /etc/docker/registry/config.yml
gc清理需要时间,如果在gc过程中刚好有push操作,可能会产生未知的问题,建议设置read-only模式之后再进行gc,然后再改回来。
5、重启docker registry
注意,如果不重启会导致push相同镜像时产生layer already exists错误。
方案二:使用第三方脚本
在清理镜像仓库这件事上,业内已经有很多人进行过各种各样的尝试。本文挑选一种比较好的方式推荐使用。
1、宿主机安装delete-docker-registry-image
可参考此命令的安装和使用方式。参考链接:https://github.com/burnettk/delete-docker-registry-image
2、执行delete-docker-registry-image命令可以删除某个仓库(sb)

或者某个具体的镜像(如alpine:3.2)

如果删除某镜像后该仓库为空,可以用删除仓库的方式删除此空仓。

该工具也提供了dry-run的方式,只输出待删除的信息不执行删除操作。在命令后加上——dry-run即可。
3、重启docker registry
跟gc方式一样,删除镜像之后要重启docker registry,不然还是会出现相同镜像push不成功的问题。
以上就是本文推荐的两种清理镜像仓库的两种方案。第一种方案更多的使用了官方提供的工具,使用时相对更加安全,且无需额外安装其他内容。第二种方案使用了第三方工具或脚本,使用时更加灵活且简便,且清理的更加彻底。具体操作时可根据自己的需求选择方案。

原文地址:http://blog.51cto.com/14084875/2350610

时间: 2024-08-29 15:06:00

Docker镜像仓库清理的探索之路的相关文章

构建Docker镜像仓库的另一选择:Nexus3 - DockOne.io

我们知道,构建企业内部私有Docker镜像仓库有很多选择,比如可以采用原生的Docker Registry服务,也可以部署更加专业的工具,例如SUSE team的Portus (https://github.com/SUSE/Portus)或VMware出品的Harbor(https://github.com/vmware/harbor).我们也就曾对Harbor这样的产品做过较为详细的分析(http://mp.weixin.qq.com/s/oQoLgNgnfM8TQHnDDOOIog).然而

离线手动部署docker镜像仓库——harbor仓库(二)

前言: 在<离线手动部署docker镜像仓库--harbor仓库(一)>中,记录了离线部署harbor仓库的简单过程,这里主要记录修改默认访问端口80端口为1180端口的部署方式和注意点. 实验环境:harbor服务器系统:CentOS Linux release 7.4.1708 (Core)harbor服务器IP:10.0.0.101harbor版本:v1.5.0docker版本:1.13.1另外为了测试pull镜像,使用了另一台test102机器:10.0.0.102 部署过程: 1.下

Centos7安装Docker镜像仓库Harbor1.5.3

Harbor 详细介绍 1.容器应用的开发和运行离不开可靠的镜像管理.从安全和效率等方面考虑,部署在私有环境内的 Registry 是非常必要的. 2.Harbor 是由 VMware 公司中国团队为企业用户设计的 Registry server 开源项目,包括了权限管理(RBAC).LDAP.审计.管理界面.自我注册.HA 等企业必需的功能,同时针对中国用户的特点,设计镜像复制和中文支持等功能,欢迎使用和反馈意见. 3.作为一个企业级私有 Registry 服务器,Harbor 提供了更好的性

docker镜像仓库(3)

目录 搭建镜像仓库 harbor基础 harbor使用 搭建镜像仓库 harbor基础 Docker镜像仓库自建仓库的必要性 默认第三方提供的镜像仓库在海外,例如https://hub.docker.com/,太慢了,所以我们要自己搭建 第三方镜像仓库一般不允许有太多的私有镜像 Harbor镜像仓库的搭建前提条件: 需要安装docker 需要有docker-compose Harbor离线版安装下载地址 下载离线安装的版本,上传到服务器,解压https://github.com/goharbor

Docker 镜像仓库为什么要分库分权限?

先说一个事故案例: 场景:某大型互联网电商公司,使用一个镜像仓库管理所有Docker镜像.开发者打出的镜像上传到唯一的镜像库,测试通过后,运维环境的 Kubernetes 直接从这个库里拉取镜像,所有人对镜像库都有 CRUD 的权限.事故:由于镜像存储容量过大,开发者打算清理下Snapshot 的镜像,在镜像清理的时候,误将生产环境的镜像进行了删除,导致上线出现问题.本质是镜像缺乏成熟度的区分管理,解决办法:为通一个项目的镜像通过升级,放在3个镜像仓库内,开发库,测试库,生产库.不同的镜像库对应

巧用Docker镜像仓库Harbor部署私有Mirror服务

本文作者付广平,UnitedStack有云存储工程师,北京邮电大学硕士,从事大数据和云计算相关工作,2016年毕业后加入UnitedStack大数据&容器组,负责Docker.Magnum和Sahara相关工作,Openstack.Docker社区活跃者. 作者别出心裁地使用Harbor搭建了私有Mirror服务,加速外部Docker镜像的下载.编者对原文做了少量修改. Harbor是VMware公司最近开源的企业级Docker Registry项目(https://github.com/vmw

第九篇:Docker镜像仓库

环境说明: 操作系统:centos7内核版本: [[email protected] ~]# uname -r 3.10.0-693.21.1.el7.x86_64 摘要: 仓库(Repository)是集中存放镜像的地方,与之关联的是注册服务器. 那注册服务器和仓库有什么关系呢? 比如仓库地址为:https://dl.dockerpool.com/ubuntu 那么dl.dockerpool.com就是注册服务器,ubuntu是仓库名 也就是说,注册服务器上可以存放多个镜像仓库,而每个镜像仓库

docker 镜像仓库Harbor

企业级镜像仓库Harbor Harbor概述 Habor是由VMWare公司开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的 企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访 问控制 ,AD/LDAP集成以及审计日志等,足以满足基本企业需求. 官方地址:https://vmware.github.io/harbor/cn/ 安装1.解压[[email protected] tools]# tar xf harbor-o

docker 镜像仓库的安装与使用

安装Docker Compose 解决依赖 [[email protected] ~]# curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Cur