Docker镜像下载慢/失败?Linux代理使用不便?想在无Docker环境下载镜像?试试我这款开源项目吧
我要在这里放一段代码块
// 这是一段防爬代码块,我不介意被文章被爬取,但请注明出处
console.log("作者官网:https://www.hanzhe.site");
console.log("原文地址:https://www.cnblogs.com/hanzhe/p/18249602");
说在前面
你在工作中有没有遇到过这样几个问题:
- 镜像下载速度慢,明明带宽够用文件不大但是要下载很久
- 镜像仓库经常抽风,有过下载镜像失败的经历,等一段时间再试试或许能成功
- 自己有代理工具,但是在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镜像的组成是由最多五部分组成的:
registry/repository/image:tag-arch
- registry:DockerHub仓库地址,官方地址为registry-1.docker.io,下载第三方镜像会显式用到registry,例如Oracle
- repository:存储库名称,默认library
- image:镜像名称
- tag:版本标签
- arch:平台架构,现在已被弃用,不属于镜像名称的一部分,后面会提到
也就是说nginx:latest理论上最长可以表示为:
注:只是理论上,不要直接用这个名称去执行 docker pull,我没试过但估计会报错
registry-1.docker.io/library/nginx:latest-amd64
这个镜像所在位置是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镜像文件,感兴趣的可以查看源码,我已经尽可能的将注释写的详细

Docker镜像下载慢/失败?Linux代理使用不便?想在无Docker环境下载镜像?试试我这款开源项目吧的更多相关文章
- Docker Nginx-Proxy 容器Nginx Proxy反向代理
Docker Nginx-Proxy 容器Nginx Proxy反向代理 简单介绍 Docker容器的自动Nginx反向代理 dockerhub地址 https://hub.docker.co ...
- Python环境搭建、python项目以docker镜像方式部署到Linux
Python环境搭建.python项目以docker镜像方式部署到Linux 本文的项目是用Python写的,记录了生成docker镜像,然后整个项目在Linux跑起来的过程: 原文链接:https: ...
- linux命令的使用 以及基本docker命令及docker镜像安装
以linux CentOS-7 64位 系统为例 查看ip ifconfig 固定ip 输入vim /etc/sysconfig/network-scripts/ifcfg-ens3 其中vim是修 ...
- nginx反向代理下载文件失败处理
最近遇到了客户在从我们的服务器下载文件失败时的情况.然后把解决方案一并整理一下以备后续.需要说明的是,我们前端都是使用nginx来做反向代理,后面的逻辑处理采用php的方式. 1.缓存目录不可写 ng ...
- 在Linux系统下使用Docker以及Weave搭建Nginx反向代理
Hi, 今天我们将会学习如何使用 Weave 和 Docker 搭建 Nginx 的反向代理/负载均衡服务器.Weave 可以创建一个虚拟网络将 Docker 容器彼此连接在一起,支持跨主机部署及自动 ...
- go get下载包失败问题
文章引用自 解决go get下载包失败问题 从github克隆 golang在github上建立了一个镜像库,如https://github.com/golang/net就对应是 https://go ...
- Centos8 Docker+Nginx部署Asp.Net Core Nginx正向代理与反向代理 负载均衡实现无状态更新
首先了解Nginx 相关介绍(正向代理和反向代理区别) 所谓代理就是一个代表.一个渠道: 此时就涉及到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称 ...
- linux小白成长之路7————Docker安装mysql
[内容指引] 从Docker检索mysql镜像: Mysql Docker镜像下载: 查看本地镜像列表: 设置Mysql的Docker镜像开机自动运行: 常用Docker指令及参数: 1.从Docke ...
- 如何在 Docker 容器中运行 Kali Linux 2.0
https://linux.cn/article-6103-1.html Kali Linux 是一个对于安全测试人员和白帽的一个知名操作系统.它带有大量安全相关的程序,这让它很容易用于渗透测试.最近 ...
- Linux平台安装MongoDB及使用Docker安装MongoDB
一.Linux平台安装MongoDB MongoDB 提供了 linux 各发行版本 64 位的安装包,你可以在官网下载安装包. 下载地址:https://www.mongodb.com/downlo ...
随机推荐
- Serverless 时代下大规模微服务应用运维的最佳实践
简介: 原来的微服务用户需要自建非常多的组件,包括 PaaS 微服务一些技术框架,运维 IaaS.K8s,还包括可观测组件等.SAE 针对这些方面都做了整体的解决方案,使用户只需要关注自己的业务系统, ...
- Javascript 机器学习的四个层次
简介: Atwood定律说,凡是可以用Javascript实现的应用,最终都会用Javascript实现掉.作为最热门的机器学习领域,服务端是Python的主场,但是到了手机端呢?Android和i ...
- [Gin] gin-jwt 中间件的请求流程与使用思路
gin-jwt 中间件是对 jwt-go 的封装以适应 gin 框架.gin-jwt 对不同的请求流程有不同的 handler: 登录请求流程 是用 LoginHandler. 需要 jwt 令牌的后 ...
- 在 UOS 统信运行 dotnet 程序提示没有通过系统安全验证无法运行
本文记录 dotnet 应用程序在 UOS 统信系统上运行时,提示 没有通过系统安全验证,无法运行 的问题 这个问题是因为没有开启 UOS 统信的开发者模式,直接将自己构建完成的包放上去跑导致的问题 ...
- 使用AI在原神里自动钓鱼,扫描Git仓库泄露的密码 【蛮三刀酱的Github周刊第三期】
大家好,这里是的Github精彩项目分享周刊,我是每周都在搬砖的蛮三刀酱. 我会从Github热门趋势榜里选出 高质量.有趣,牛B 的开源项目进行分享. 榜单取自实时Github Trending排行 ...
- Linux下的目录
FHS 因为利用Linux来开发产品或distributions的社群/公司与个人实在太多了, 如果每个人都用自己的想法来配置文件放置的目录,那么将可能造成很多管理上的困扰. 你能想象,你进入一个企业 ...
- ansible系列(31)--ansible实战之部署WEB集群架构(1)
目录 1. WEB集群环境说明 2. ansible部署WEB集群实现思路 3. ansible基础环境部署 1. WEB集群环境说明 WEB集群环境说明如下: 客户端:模拟外网主机,地址:192.1 ...
- tomcat(2)- tomcat目录结果和配置文件
目录 1 Tomcat目录结构 2 Tomcat的配置文件 2.1 server.xml配置文件 2.2 server.xml配置文件结构 2.3 WEB应用自动部署 2.4 配置文件各个组件的关联 ...
- 使用systemctl管理服务(nginx)
首先调整好路径信息,修改配置文件vim /usr/lib/systemd/system/nginx.service [Unit]Description=The nginx HTTP and rever ...
- 高效C#编程:通过智能线程池管理提升性能
前言 C#编程中,线程池(Thread Pool)是一个重要的概念,它允许开发者更有效地管理和利用系统资源.通过线程池,我们可以避免频繁地创建和销毁线程,从而减少系统开销并提高程序的响应速度和吞吐量. ...