Docker Registry API best practice 【Docker Registry API 最佳实践】
文章目录
- 1. 安装 docker
- 2. 配置 docker
- 4. 配置域名解析
- 5. 部署 registry
- 6. Registry API 管理
- 7. 批量清理镜像
- 8. 其他
👋 这篇文章内容:实现shell 脚本批量清理docker registry的镜像。
🔔:你可以在这里阅读:https://github.com/Ghostwritten/registry-clean.git
1. 安装 docker
- docker 安装
2. 配置 docker
$ cat /etc/docker/daemon.json
{"exec-opts": ["native.cgroupdriver=systemd"],"insecure-registries": ["registry.ghostwritten.com"],"live-restore": true,"log-driver": "json-file","log-opts": {"max-size": "100m","max-file": "5"}}# 配置代理
$ cat /usr/lib/systemd/system/docker.service.d/proxy.conf
[Service]
Environment="HTTP_PROXY=http://192.168.21.101:7890"
Environment="HTTPS_PROXY=http://192.168.21.101:7890"
Environment="NO_PROXY=localhost,127.0.0.1,.coding.net,.tencentyun.com,.myqcloud.com,*.bsgchina.com"
$ systemctl daemon-reload && systemctl restart docker
4. 配置域名解析
服务端(192.168.21.2)配置
$ cat /etc/unbound/unbound.conf
...local-data: "registry.ghostwritten.com A 192.168.21.25"local-data-ptr: "192.168.21.25 registry.ghostwritten.com"
....$ systemctl restart unbound
客户端
$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.21.2
5. 部署 registry
测试删除镜像
$ docker run -tid --restart=always --name registry -p 80:5000 -e REGISTRY_COMPATIBILITY_SCHEMA1_ENABLED=true -e REGISTRY_STORAGE_DELETE_ENABLED=true -v /data/registry:/var/lib/registry registry:latest
6. Registry API 管理
$ curl -q -s 'http://registry.ghostwritten.com/v2/registry/tags/list' | jq .
{"name": "registry","tags": ["latest"]
}$ curl -I -X GET 'http://registry.ghostwritten.com/v2/registry/manifests/latest'
HTTP/1.1 200 OK
Content-Length: 6863
Content-Type: application/vnd.docker.distribution.manifest.v1+prettyjws
Docker-Content-Digest: sha256:f538bbbf8ff45e9872789dfcfbbcd48a44a9c87d21324595efb4df2e6b666c8c
Docker-Distribution-Api-Version: registry/2.0
Etag: "sha256:f538bbbf8ff45e9872789dfcfbbcd48a44a9c87d21324595efb4df2e6b666c8c"
X-Content-Type-Options: nosniff
Date: Wed, 18 Sep 2024 09:02:51 GMT通过API直接匹配标签删除不掉镜像
$ curl -I -X DELETE http://registry.ghostwritten.com/v2/registry/manifests/latest
HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
Docker-Distribution-Api-Version: registry/2.0
X-Content-Type-Options: nosniff
Date: Wed, 18 Sep 2024 08:58:49 GMT
Content-Length: 98#获取ID
$ docker inspect registry.ghostwritten.com/registry:latest | jq -r '.[0].RepoDigests[]' |grep registry.ghostwritten.com | awk -F '@' '{print $2}'
sha256:4d2514be50520c34f3b207fc03dd734a9b72403624d8572f8c40e9185575e453$ curl -I -X GET 'http://registry.ghostwritten.com/v2/registry/manifests/sha256:4d2514be50520c34f3b207fc03dd734a9b72403624d8572f8c40e9185575e453'
HTTP/1.1 200 OK
Content-Length: 1363
Content-Type: application/vnd.docker.distribution.manifest.v2+json
Docker-Content-Digest: sha256:4d2514be50520c34f3b207fc03dd734a9b72403624d8572f8c40e9185575e453
Docker-Distribution-Api-Version: registry/2.0
Etag: "sha256:4d2514be50520c34f3b207fc03dd734a9b72403624d8572f8c40e9185575e453"
X-Content-Type-Options: nosniff
Date: Wed, 18 Sep 2024 09:12:51 GMT$ curl -I -X DELETE 'http://registry.ghostwritten.com/v2/registry/manifests/sha256:4d2514be50520c34f3b207fc03dd734a9b72403624d
8572f8c40e9185575e453'
HTTP/1.1 202 Accepted
Docker-Distribution-Api-Version: registry/2.0
X-Content-Type-Options: nosniff
Date: Wed, 18 Sep 2024 09:12:59 GMT
Content-Length: 0$ curl -s 'http://registry.ghostwritten.com/v2/_catalog' | jq .
{"repositories": ["library/busybox","registry"]
}$ curl -q -s 'http://registry.ghostwritten.com/v2/registry/tags/list' | jq .
{"name": "registry","tags": null
}$ rm -rf /data/registry/docker/registry/v2/repositories/registry
$ curl -q -s http://registry.ghostwritten.com/v2/_catalog | jq .
{"repositories": ["library/busybox"]
}
推送镜像
$ docker push registry.ghostwritten.com/registry:latest
The push refers to repository [registry.ghostwritten.com/registry]
3715a40eaff0: Layer already exists
e48d56ef719d: Layer already exists
1670fc7fdd22: Layer already exists
f3965cc04390: Layer already exists
d62a02444d39: Layer already exists
latest: digest: sha256:4d2514be50520c34f3b207fc03dd734a9b72403624d8572f8c40e9185575e453 size: 1363
查询镜像标签
$ curl -q -s 'http://registry.ghostwritten.com/v2/registry/tags/list' | jq .
{"name": "registry","tags": ["latest"]
}
7. 批量清理镜像
首先,这是一个清理的演示,先批量推送镜像入库。未来应对可能存在各类情况。
- 有没有项目名的镜像
- 多个标签的镜像
$ cat registry-images-push.sh
docker push registry.ghostwritten.com/demo/nginx:1.26
docker push registry.ghostwritten.com/demo/nginx:latest
docker push registry.ghostwritten.com/library/busybox:1.36.1
docker push registry.ghostwritten.com/registry:latest
docker push registry.ghostwritten.com/library/busybox:1.35.0
推送镜像入库。
$ sh registry-images-push.sh
要删除的镜像我们存放到 registry-images-clean.txt 文件中。我们会检验以下几类删除场景。
- 删除有个多个标签的镜像检验是否会误删除;
- 删除没有项目名的镜像;
- 删除不存在的镜像。
$ cat registry-images-clean.txt
registry.ghostwritten.com/library/busybox:1.36.1
registry.ghostwritten.com/registry:latest
registry.ghostwritten.com/demo/nginx:1.26
registry.ghostwritten.com/demo/nginx:noexist
这个脚本的目的是从Docker注册表中批量删除镜像。在执行脚本之前,必须创建一个名为images.txt的文件,其中应该包含计划删除的映像的名称。例如,文件中的一个条目可能如下所示:registry.demo.com/library/nginx:latest。
$ cat registry-images-clean.sh
#!/bin/bash# Script Name: registry-images-clean.sh
# Author: ghostwritten
# Date: 2024-9-18
# Description: This script is designed to facilitate the batch deletion of images from a Docker registry. Prior to executing the script, you must create a file named images.txt, which should contain the names of the images scheduled for deletion. For example, an entry in the file might look like: registry.demo.com/library/nginx:latest. name=`basename $0 .sh`action=$1images_list() {image_repos=`cat registry-images-clean.txt | awk -F '/' '{print $1}' | uniq`for image_repo in $image_repos
do repositories=$(curl -q -s http://${image_repo}/v2/_catalog | jq -r '.repositories[]')if [[ -n $repositories ]] ; thenecho "$image_repo 镜像仓库列表:"for repo in $repositories; dotags=$(curl -q -s http://${image_repo}/v2/${repo}/tags/list | jq -r '.tags[]')if [ -z "$tags" ]; thenecho " No tags found"elsefor tag in $tags; doecho " $repo:$tag"donefidoneelseecho "$image_repo 镜像仓库是空库."fi
done}images_rm() {while IFS= read -r line
doimage_repo=$(echo "$line" | awk -F '/' '{print $1}')image_project=$(echo "$line" | awk -F '/' '{ if (NF > 2) print $(NF-1) "/"; else print "" }')image_name=$(echo "$line" | awk -F '/' '{print $NF}' | awk -F ':' '{print $1}')image_tag=$(echo "$line" | awk -F '/' '{print $NF}' | awk -F ':' '{print $2}')response=$(curl -s "http://${image_repo}/v2/${image_project}${image_name}/tags/list")if echo "$response" | jq -e ".tags | index(\"${image_tag}\")" > /dev/null; thenecho "镜像 ${image_project}${image_name}:${image_tag} 存在,准备删除..."source_data=`docker inspect registry | jq -r '.[0].Mounts[] | select(.Type == "bind") | .Source'`MANIFEST_DIGEST=`ls ${source_data}/docker/registry/v2/repositories/${image_project}${image_name}/_manifests/tags/${image_tag}/index/sha256/`curl -s -I -X DELETE "http://${image_repo}/v2/${image_project}${image_name}/manifests/sha256:${MANIFEST_DIGEST}" 2>&1 > /dev/nullresponse=$(curl -s "http://${image_repo}/v2/${image_project}${image_name}/tags/list")if ! echo "$response" | jq -e '.tags | length > 0' > /dev/null; thenrm -rf ${source_data}/docker/registry/v2/repositories/${image_project}${image_name}fielseecho "镜像 ${image_repo}/${image_project}${image_name}:${image_tag} 不存在。"
fidone < registry-images-clean.txtdocker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml >> /dev/null
docker restart registry}case $action inl|ls)images_list;;d|rm)images_rm;;*)echo "Usage: $name [ls|rm]"exit 1;;
esac
exit 0
首先,检查当前registry镜像仓库有哪些镜像。
$ sh registry-images-clean.sh ls
registry.ghostwritten.com 镜像仓库列表:demo/nginx:latestdemo/nginx:1.26library/busybox:1.35.0library/busybox:1.36.1registry:latest
registest.bsgchina.com 镜像仓库是空库.
现在,我们开始删除 registry-images-clean.txt 的镜像。
$ registry-images-clean.sh rm
镜像 library/busybox:1.36.1 存在,准备删除...
镜像 registry:latest 存在,准备删除...
镜像 demo/nginx:1.26 存在,准备删除...
镜像 registry.ghostwritten.com/demo/nginx:noexist 不存在。
镜像 demo/nginx:noexist 存在,准备删除...
执行结束后,再次检查镜像仓库列表。
sh registry-images-clean.sh ls
registry.ghostwritten.com 镜像仓库列表:demo/nginx:latestlibrary/busybox:1.35.0
registest.bsgchina.com 镜像仓库是空库.
8. 其他
- 除了通过API 查看registry镜像列表,你可以部署一个 registry UI 查看镜像。
- 另外,当你想要迁移一套具有自己镜像介质的镜像仓库。你可以参考这篇不需要推拉镜像的镜像仓库迁移教程。
参考:
- Open Container Initiative Distribution Specification
- https://docs.docker.com/registry/#introduction
- https://github.com/Ghostwritten/registry-clean.git
相关文章:

Docker Registry API best practice 【Docker Registry API 最佳实践】
文章目录 1. 安装 docker2. 配置 docker4. 配置域名解析5. 部署 registry6. Registry API 管理7. 批量清理镜像8. 其他 👋 这篇文章内容:实现shell 脚本批量清理docker registry的镜像。 🔔:你可以在这里阅读:https:/…...

便捷点餐:Spring Boot 点餐系统
第三章 系统分析 3.1 系统设计目标 网上点餐系统主要是为了用户方便对美食信息、美食评价、美食资讯等信息进行查询,也是为了更好的让管理员进行更好存储所有数据信息及快速方便的检索功能,对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定…...

研一上课计划2024/9/23有感
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、学位课1.应用数理统计(学3 开卷考试)2.最优化方法(学3 开卷考试)3.新中特(学2 三千五百字的品读…...

【H2O2|全栈】关于CSS(6)CSS基础(五)
目录 CSS基础知识 前言 准备工作 网页项目规范 创建项目 布局 补充一部分属性 outline border-radius 预告和回顾 后话 CSS基础知识 前言 本系列博客将分享层叠样式表(CSS)有关的知识点。 本期博客主要分享的是网页项目规范,ou…...

网页护眼宝——全方位解析 Chrome Dark Reader 插件
网页护眼宝——全方位解析 Chrome Dark Reader 插件 1. 基本介绍:Chrome 插件的力量与 Dark Reader 的独特之处 随着现代浏览器的功能越来越强大,Chrome 插件为用户提供了极大的定制化能力。从广告屏蔽、性能优化到页面翻译,Chrome 插件几乎…...

C++ 构造函数和析构函数抛出异常的详细说明
1. 构造函数 功能:用于初始化对象的成员变量和分配资源。抛出异常: 当构造函数抛出异常时,构造的对象不会被创建,分配的资源会被释放。这意味着在构造函数抛出异常后,对象的状态是未定义的,调用者需要处理…...

Unity开发绘画板——01.前言
在做这个之前其实是想研究一下在Unity中交互雪的实现,交互雪顾名思义就是可以进行交互的雪,玩家角色从雪上走过时雪被踩凹陷的效果;交互雪的一种实现方案就是将地面看做一个画板,将玩家角色的躯体看做笔刷,将角色经过的…...

Spring定时任务 - @Scheduled注解详解
文章目录 一、Scheduled注解二、参数详解2.1、CRON_DISABLED2.2、cron2.3、zone2.4、fixedDelay / fixedDelayString2.5、fixedRate / fixedRateString2.6、initialDelay / initialDelayString 三、总结3.1、fixedDelay、fixedRate 以下内容基于org.springframework:spring-con…...

超详细超实用!!!AI编程之cursor编写设计模式接口隔离原则实例(七)
云风网 云风笔记 云风知识库 一、设计模式接口隔离原则定义 客户端不应该被迫依赖于它不使用的方法,一个类对另一个类的依赖应该建立在最小的接口上。要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。 接口…...

解决在Nignx下Thinkphp路由不生效问题
Nignx下Tp框架路由不生效 问题的原因在于ThinkPHP通过URL后缀匹配方法,默认没有后缀会尝试访问默认的index方法。 解决方案:在URL末尾添加/后缀或者修改路由配置文件route.php中的规则。 如果还是没解决建议换apache...

『功能项目』QFrameWork框架重构OnGUI【63】
我们打开上一篇62QFrameWork背包框架的项目, 上文将功能实现在一个脚本中 本章要做的事情让脚本实现背包框架思想 首先按照图示创建脚本: 创建脚本:Item.cs namespace QFramework {public class Item{//道具public string Key;public string …...

4款AI生成PPT工具推荐,提升工作效率
在如今的工作环境中,PPT制作是许多技术人员不可避免的任务,尤其是在汇报、展示技术方案、以及项目进展时。随着AI技术的快速发展,使用AI生成PPT成为了提高效率的一种新趋势。本文将介绍几款适合程序员、技术人员的AI生成PPT工具,帮…...

3.postman脚本语言、接口关联(json引用(变量)、脚本用正则表达式)、断言封装、自动化构造接口请求(Postman工具)
一、Postman的脚本语言 1.使用js语言 2.pm变量 pm.sendRequest():发送HTTP请求 二、自动化实现接口关联 1.JSON引用 2.正则表达式(在test下编写如下脚本) //获取响应 console.log(responseBody) //re的方式获取token let token responseBody.match(&quo…...

基于SpringBoot框架的订餐系统设计与实现
文未可获取一份本项目的java源码和数据库参考。 选题的背景 伴随着当今计算机技术的日益发展,各种网络软件以及应用也是层出不穷,日新月异,大家都争先恐后的推出自己的产品来占领这一个广阔的市场。现在网上购物的软件系统种类繁多…...

基于JAVA+SpringBoot+Vue的医院后台管理系统
基于JAVASpringBootVue的医院后台管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 哈…...

基于SSM+Vue+MySQL的农家乐预约管理系统
系统展示 用户前台界面 管理员后台界面 农家乐后台界面 系统背景 随着乡村旅游的兴起,农家乐作为一种结合农业体验与休闲度假的新型旅游模式,受到了广大游客的青睐。然而,传统农家乐在预约管理方面存在效率低下、信息不透明等问题,…...

全新热门电商API接口,实现闲鱼商品详细搜索功能
近年来,电商行业蓬勃发展,API(Application Programming Interface)接口已经成为电商平台的重要组成部分。API接口不仅可以实现平台间的数据交互,还可以为开发者提供丰富的功能,满足用户多样化的需求。在这个…...

求10 个整数中最大值
我们需要10个整数之中求出10个整数之中的最大值所以我们先要将10个整数先放置到一个容器之中,我们初期就使用数组的形式存放10个数组即设置数组arr[10],我们要将10个数组之中的数字输出出来,我们这里使用的是遍历循环输出数组。我们这里是使用…...

数据结构不再难懂:带你轻松搞定排序算法
数据结构入门学习(全是干货)——排序算法(下) 1 快速排序 1.1 算法概述 快速排序采用分而治之的策略,与归并排序相似。其核心在于选择一个主元(pivot)作为分割点。 分而治之 主元(pivot)>…...

YOLOv8 OBB win10+ visual 2022移植部署
前言 想做一个目标旋转角度检测的工程,但是网上多少python的,或者linux的。在win10 visual 2022移植部署,记录一下。 参考 这篇文章没有C win10 环境下的部署教程,我相对于是对此做了补充。 1、下载工程 https://github.com/sh…...

E+H超声波物位仪FMU42-ATB2A22A
EH超声波物位仪FMU42-ATB2A22A是一款由德国EH(恩德斯豪斯)公司生产的超声波物位计,具有高精度、非接触式测量等特点,广泛应用于液体、浆料和粗料的物位测量。以下是对该产品的详细介绍: 一、产品特点 高精度测量&…...

Linux风险应对策略:保障系统安全的有效措施
Linux作为一种开源操作系统,因其稳定性和安全性被广泛应用于服务器、嵌入式系统和个人电脑等多个领域。然而,随着网络攻击手段的不断演变,Linux系统也面临着各种安全风险。本文将探讨Linux系统的主要风险及其应对策略,帮助用户提升…...

芝法酱学习笔记(0.3)——SpringBoot下使用mybatis做增删改查和报表
零、前言 书接上回,我们搭建了windows下的开发环境,并给出了一个hello world级别的多模块SpringBoot项目。 毕竟java后端开发,离不开数据库的操作,为方便后面内容的讲解,这里再做一期铺垫,core模块下新增一…...

windows msys2 编译x264 32位动态库
一、打开mingw32 查看gcc版本 gcc --version 提示找不到gcc,可以安装gcc pacman -S gcc 二、进入x264-master目录 cd /d/x264-master 执行 ./configure --prefix/d/x264-master/Bin --disable-asm --enable-static --enable-shared --disable-thread其中--disa…...

【pytorch】relu的实现逻辑
笔者最近在尝试实现AlexNet的底层算子,基于pytorch的框架,本文主要记录一下pytorch中是如何实现relu算子的。 首先最外层是位于torch\nn\modules\activation.py,主要代码如下: __constants__ ["inplace"]inplace: bool…...

【Python篇】深入机器学习核心:XGBoost 从入门到实战
文章目录 XGBoost 完整学习指南:从零开始掌握梯度提升1. 前言2. 什么是XGBoost?2.1 梯度提升简介 3. 安装 XGBoost4. 数据准备4.1 加载数据4.2 数据集划分 5. XGBoost 基础操作5.1 转换为 DMatrix 格式5.2 设置参数5.3 模型训练5.4 预测 6. 模型评估7. 超…...

简单学习 原码反码补码 学会了你才是真正的程序员了
一、简单介绍原码反码补码 首先我们需要知道的是原码反码补码是一个人为的行为,因为机器看的都是所谓的补码,这个反码只是作为补码的到原码也就是人能看懂的跳板,所以计算机无论是计算器里面的东西还是他底层运行的二进制代码都是补码&#x…...

基于规则的命名实体识别
基于规则的命名实体识别(Rule-Based Named Entity Recognition, NER)是一种通过预定义的模式或规则来识别文本中特定实体的方法。这种方法通常使用正则表达式来匹配文本中的实体。下面是一个更完整的示例,展示了如何使用正则表达式来识别文本…...

C语言从头学63—学习头文件stdlib.h(二)
6、随机数函数rand() 功能:产生0~RAND_MAX 之间的随机整数。 使用格式:rand(); //无参 返回值:返回随机整数 说明: a.RAND_MAX是一个定义在stdlib.h里面的宏,表示可以产生的最大随机整数&am…...

js判断一个对象里有没有某个属性
1. 使用in操作符 in操作符可以用来检测属性是否存在于对象或其原型链中。 const obj {a: 1, b: 2}; if (a in obj) { console.log(属性a存在于obj中); } else { console.log(属性a不存在于obj中); } 2. 使用hasOwnProperty()方法 hasOwnProperty()方法用来检测一个…...