用友云开发者中心是基于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不成功的问题。

以上就是本文推荐的两种清理镜像仓库的两种方案。第一种方案更多的使用了官方提供的工具,使用时相对更加安全,且无需额外安装其他内容。第二种方案使用了第三方工具或脚本,使用时更加灵活且简便,且清理的更加彻底。具体操作时可根据自己的需求选择方案。

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

  1. docker 镜像仓库 Harbor 部署 以及 跨数据复制

    docker 镜像仓库 Harbor 部署 跨数据复制 Harbor 是 Vmwar 公司开源的 企业级的 Docker Registry 管理项目 它主要 提供 Dcoker Registry 管理 ...

  2. 离线手动部署docker镜像仓库——harbor仓库(HTTPS)

    实验环境: harbor服务器系统:CentOS Linux release 7.5.1804 (Core)harbor服务器IP:10.1.12.114harbor版本:v1.5.0docker版本 ...

  3. 你必须知道的Docker镜像仓库的搭建

    近期工作中发现用到的容器镜像越来越多(不多的时候没考虑过镜像仓库的问题),同一个容器镜像也存在多个版本,那么镜像仓库的搭建需求就涌现出来,本文就目前的几个常用镜像仓库的搭建进行介绍,我们可以根据需要选 ...

  4. 019.nexus搭建docker镜像仓库/maven仓库

    一.安装docker CE 参考docker doc https://docs.docker.com/install/linux/docker-ce/centos/ 二.docker启动nexus3 ...

  5. Docker镜像仓库的搭建--> Harbor篇

    简介 Harbor是VMware公司开源的一个企业级Docker Registry项目,项目地址:https://github.com/goharbor/harbor Harbor作为一个企业级私有R ...

  6. Docker笔记2:Docker 镜像仓库

    Docker 镜像的官方仓库位于国外服务器上,在国内下载时比较慢,但是可以使用国内镜像市场的加速器(比如阿里云加速器)以提高拉取速度. Docker 官方的镜像市场,可以和 Gitlab 或 GitH ...

  7. 部署docker镜像仓库及高可用

      下载地址: https://github.com/goharbor/harbor/releases   安装harbor服务器: 安装harbor root@harbor-vm1:/usr/loc ...

  8. 搭建docker镜像仓库(二):使用harbor搭建本地镜像仓库

    目录 一.系统环境 二.前言 三.Harbor 四.使用harbor搭建私有镜像仓库 4.1 环境介绍 4.2 k8smaster节点安装配置harbor 4.2.1 安装harbor离线包 4.2. ...

  9. Docker镜像仓库Harbor之Swagger REST API整合配置

    转载自:https://cloud.tencent.com/developer/article/1010618 1.Swagger 介绍 Swagger 是一个规范和完整的框架,用于生成.描述.调用和 ...

随机推荐

  1. Android Studio开发环境配置以及相关说明

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这里简单记录下在开发的时候使用的Android Studio开发环境版本以及相关注意事项. 一般来讲,每隔一段时间就要检查下Andr ...

  2. ViewPagerWithViewDemo【ViewPager和View搭配以及演示获取里面的值和CheckBox单选效果】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 简单记录下ViewPager和自定义布局view的搭配使用以及布局文件中单选效果.获取viewpager布局内部值的功能. 效果图 ...

  3. Linux~学习笔记目录索引

    回到占占推荐博客索引 本篇文章是对自己学习Linux及在它的环境下部署工具的一个总结,以方便自己查阅,也给他人一个帮助,本文章同时会不断的更新,欢迎大家订阅! 本目录包括的内容会包括linux基础命令 ...

  4. 版本控制工具——Git常用操作(上)

    本文由云+社区发表 作者:工程师小熊 摘要:用了很久的Git和svn,由于总是眼高手低,没能静下心来写这些程序员日常开发最常用的知识点.现在准备开一个专题,专门来总结一下版本控制工具,让我们从git开 ...

  5. 浅谈基于Intellij IDEA Maven的配置与使用

    在java开发中,引入jar包的方式从种类上划分,可分为自动导入和手动导入,然而,手动导入繁琐,不是很适合当前开发模式,手动导入也被自动导入所取代. 当前,Maven和Gradle是比较主流的自动导入 ...

  6. 杭电ACM2022--海选女主角

    海选女主角 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  7. MyBatis缓存策略

    MyBatis 提供了一级缓存和二级缓存策略,一级缓存是作用在SqlSession级别上的,而二级缓存则是作用在Mapper级别上的( 即作用在 namespace上),MyBatis 默认是开启的一 ...

  8. 前端面试知识点集锦(JavaScript篇)

    目录 1.谈谈你对Ajax的理解?(概念.特点.作用) 2.说说你对延迟对象deferred的理解? 3.什么是跨域,如何实现跨域访问? 4.为什么要使用模板引擎? 5.JavaScript是一门什么 ...

  9. js中关于两个变量的比较

    今天在匆忙的写代码过程中,测试突然跑过来跟我说,有一个小的bug,但是不能完全的复现,但确实存在.需要我们这边参与查找.首先来说一下我们这个的业务逻辑,其实非常的简单,就是一个开房间的后台,里面有一项 ...

  10. 【Android】用Cubism 2制作自己的Live2D——初见!

    前言- 现在很多手游的UI上都不约而同的放置一个Live2D模型,这仿佛已经成为了一个业界的潜规则之类的东西.作为一名深受手机游戏毒害的90后,我也没有忘记小时候励志当一名技术宅的梦想,也想试试自己做 ...