解决Docker镜像下载问题的Java工具
扫描二维码随身看资讯
使用手机 二维码应用 扫描右侧二维码,您可以
1. 在手机上细细品读~
2. 分享给您的微信好友或朋友圈~
你在工作中是否遇到过以下问题:
- 镜像下载速度慢,明明带宽够用文件不大但是要下载很久
- 镜像仓库经常抽风,有过下载镜像失败的经历,等一段时间再试试或许能成功
- 自己有代理工具,但在Linux平台上使用起来很麻烦,可能好不容易配好环境了下载镜像还报错
- 通过堡垒机访问的远程服务器无法访问外网,需要自己下载镜像后载入,但本机没有Docker环境,处理起来很麻烦
以上几个问题相信很多开发者都经历过,在下载Docker镜像的时候真的是一波三折。最近传闻有股神秘力量导致中国无法下载Docker镜像(只是传闻,零星在几个交流群看到有人提起,没刷到过相关文章不知道信息是否真实,有人知道咋回事儿麻烦评论解释下)。种种原因叠加之下,我兴起了编写一款基于HTTP协议下载Docker镜像的想法。
去年我就有过这种想法,当时我在网上四处查找资料,在码云上发现了基于GO语言编写的 dget 开源项目,但下载后发现并不好用,提了issues也没能解决我的问题,事情就不了了之。
最近听说中国无法下载Docker镜像后,我又起了这个想法,在GitHub上发现了基于Python编写的 docker-drag 开源项目,下载后发现还是不能用,不过通过它提供的README信息,我在Docker官方文档中找到了 HTTP API 资料。
现在向大家介绍我历经一个礼拜啃文档写出的 did-tool (Docker image download tool)Docker镜像下载工具,基于Java语言参考 HTTP API V2 文档编写的命令行工具,支持无Docker下载镜像,支持使用HTTP/Socket代理加速下载,可跨平台(执行JAR包即可)使用,源代码已在码云上开源,感兴趣的可以去看看。
工具使用很方便,如果有帮到你的话麻烦给个Star吧~ 使用教程参考这个GIF:
到这里对于该项目的介绍就结束了,好不容易费了不少力气写了一个开源工具,兴致勃勃的写一篇博客来介绍它,但好像也没啥好说的,一张GIF就可以代表全文了,后面我会粗略介绍一下(只是粗略介绍,具体请阅读源码或钻研官方文档)项目实现的过程逻辑,也就是 HTTP API V2 的使用教程,以及这款工具现在的缺陷和不足,如果你感兴趣的话可以往后看一看。
常见的Docker镜像名是什么样的呢?
nginx:latest
这是最简单也是最常见的Docker镜像名称表达方式,不过我们都知道Docker镜像的组成是由最多五部分组成的:
也就是说
nginx:latest
理论上最长可以表示为:
这个镜像所在位置是DockerHub官方仓库,仓库地址是
registry-1.docker.io
,所以如果我们想要下载这个镜像,我们必须要取得该镜像所在的仓库地址的授权,关于授权官方文档有做解释。
翻译过来就是先请求接口一次,返回401未授权信息后在响应头中提取
Www-Authenticate
信息,根据拿到的信息再去请求最终返回Token,有了Token之后就可以访问 HTTP API 进行镜像操作了,这里把授权的接口地址放在401响应头中,我猜应该是为了支持第三方镜像仓库设计的,因为每个镜像仓库的授权地址都不一致,所以需要动态获取。
我们已经知道了拿到Token的方法,接下来获取镜像清单,拿到镜像清单后才可以执行后续的操作,获取镜像清单的接口文档中也有提供。
这里的name指的是
repository/image
,结尾的reference传入
tag
,刚刚我们已经知道镜像名称都有哪些部分组成这里就不细说了,设置对应的请求头后该请求头返回的就是镜像清单信息。
选中合适的架构后获取该条数据对应的
digest
信息,换一个请求头再次请求该地址,将结尾的reference替换成
digest
的值,就可以拿到指定架构的图像清单了。
截止到目前我们使用的都是SchemaVersion2的规范,根据镜像名称获取架构列表,在根据架构获取到具体的镜像信息,但是DockerHub中有一部分镜像文件是旧版的SchemaVersion1规范,这个规范的缺点之一就是他不支持获取架构列表,那么以前是如何区分不同平台架构的镜像呢?答案是用tag标签,以前制作镜像的时候都是用tag-arch来区分镜像架构的,例如我用过的typecho博客的镜像。
他将架构名称作为tag标签的一部分,实现了镜像区分架构的功能,现在Docker主流的规范是SchemaVersion2,中间多了一层架构列表,所以现在这种tag-arch的写法已经被弃用了(填上面的坑)。
did-tool
工具是按照SchemaVersion2来编写的,相对于SchemaVersion1不仅仅是少了一层那么简单,每个请求返回的JSON格式都不一样,当初写代码的时候不知道有这么一茬,程序解析后无法进行处理,所以现在的
did-tool
仅支持下载SchemaVersion2的镜像,后面会调整项目结构重写代码重新适配SchemaVerison1和SchemaVersion2,这个时间不会太长应该很快就会更版。
暂时就说到这里吧,涉及的东西太多写的太累,就不对每个接口进行详细解释了,只需要知道在Docker中
digest
是一个很重要的属性,可以通过镜像清单的
digest
获取到分层信息,可以通过镜像清单的
digest
下载到镜像的摘要文件(也就是
docker inspect
看到的内容),也可以通过分层的
digest
下载到具体的分层文件,将所有文件准备好后汇总为
manifest.json
文件,将文件打包后就成为了最终的tar镜像文件,感兴趣的可以查看源码,我已经尽可能的将注释写的详细。
我的世界使命战区
天道只手遮天
女神联盟2单机版下载 v2.0.0.0 安卓版
创魔破解版无限点券最新版 v1.0.0690 安卓版
大征服者2战国时代无限金币版下载 v1.5.2 安卓版
全球行动国服官方最新版下载 v1.12.1 安卓版
TapTap逃跑吧少年直接下载 v8.24.0 安卓版
挂江湖无限代金卷版下载 v12.0.16 安卓版
剑倚天下永久0.05折版下载 v1.0.0 安卓版
文豪野犬迷犬怪奇谭下载简体中文 v3.10.2 安卓版
神话奇兵抖音版下载 v1.6.104 安卓版
远航工具箱
mhw伙伴
京东七鲜
- Lakehouse 还是 Warehouse?(2/2).md
- C#进程调用FFmpeg操作音视频
- TiKV 源码分析之 PointGet
- 讯飞有一个可以根据描述文本自动生成PPT的AI接口,有趣
- 解决el-upload上传多张图片报错ERR_UPLOAD_FILE_CHANGED的问题
- 从零开始写 Docker(十八)---容器网络实现(下):为容器插上”网线“
- 开源.NET绘图库OxyPlot的跨平台应用
- AlertManager解析:构建高效告警系统
- 如何优化SparkSQL的monaco-editor语言服务
- ShutdownMode枚举类型介绍与实践
- 手把手教你搭建Docker私有仓库Harbor
- 神奇海洋-每日科普问答
- 1
加查之花 正版
- 2
爪女孩 最新版
- 3
企鹅岛 官方正版中文版
- 4
捕鱼大世界 无限金币版
- 5
情商天花板 2024最新版
- 6
内蒙打大a真人版
- 7
烦人的村民 手机版
- 8
跳跃之王手游
- 9
球球英雄 手游
- 10
蛋仔派对 国服版本