dget:一款直接从Docker Hub下载镜像包的强力工具

dget:一款直接从Docker Hub下载镜像包的强力工具

一、项目简介

1.1 什么是dget?

dget是一款由Go语言开发的Docker镜像直接下载工具,主要解决离线环境下安装Docker镜像的痛点问题。

项目信息:

项目 信息
项目名称 dget
作者 extrame(刘明)
编程语言 Go
许可证 Apache-2.0
仓库地址 https://gitee.com/extrame/dget
Star数 186
Fork数 55

1.2 解决的问题

在日常工作中,我们经常会遇到以下场景:

  • 内网环境:无法访问Docker Hub,需要离线安装Docker镜像
  • 网络缓慢:Docker Hub访问速度慢,下载大镜像耗时过长
  • 批量部署:需要将镜像迁移到其他环境
  • 临时使用:不想安装完整Docker,只想获取镜像文件
  • 传统的解决方案是: 1. 在有网环境下安装Docker 2. 拉取镜像 3. 导出为tar包 4. 传输到目标机器 5. 导入镜像

    而dget可以直接从Docker Hub下载镜像包,无需安装Docker

1.3 核心特性

无需Docker - 直接下载镜像包,不依赖Docker运行环境 ✅ 多平台支持 - Windows、Linux、Mac全平台支持 ✅ 多架构支持 - 支持x86、ARM等常见架构 ✅ 第三方Registry - 支持阿里云、DaoCloud等私有仓库 ✅ 代理支持 - 支持配置代理下载 ✅ 断点续传 - 支持缓存和断点下载 ✅ 开源免费 - Apache 2.0许可证

二、工作原理

2.1 传统方式 vs dget方式

传统方式(需要Docker):


1. 安装Docker
2. docker pull 镜像
3. docker save -o xxx.tar 镜像
4. 传输到目标机器
5. docker load -i xxx.tar

dget方式(无需Docker):


1. 下载dget工具(单文件)
2. dget 镜像名
3. 直接获取tar.gz包
4. 传输到目标机器
5. docker load -i xxx.tar.gz

2.2 架构图


┌─────────────────────────────────────────────────┐
│                   用户终端                       │
│                                                 │
│  ┌─────────────────────────────────────────┐   │
│  │              dget 工具                   │   │
│  │  - 直接下载Docker镜像层                   │   │
│  │  - 组装成tar.gz包                        │   │
│  │  - 支持缓存和代理                         │   │
│  └─────────────────────────────────────────┘   │
│                      │                          │
└──────────────────────│──────────────────────────┘
                       │
         ┌─────────────┴─────────────┐
         │                           │
         ▼                           ▼
┌─────────────────┐     ┌─────────────────┐
│   Docker Hub    │     │  第三方Registry │
│ (docker.io)      │     │ - 阿里云        │
│                 │     │ - DaoCloud      │
└─────────────────┘     └─────────────────┘

三、安装部署

3.1 下载预编译二进制

项目提供了多平台的预编译二进制文件,可以直接下载使用:

Windows:


# 下载Windows x64版本
wget https://gitee.com/extrame/dget/raw/master/bin/windows_amd64/dget.exe

# 或使用PowerShell
Invoke-WebRequest -Uri "https://gitee.com/extrame/dget/raw/master/bin/windows_amd64/dget.exe" -OutFile "dget.exe"

Linux:


# 下载Linux amd64版本
wget https://gitee.com/extrame/dget/raw/master/bin/linux_amd64/dget

# 下载Linux ARM版本
wget https://gitee.com/extrame/dget/raw/master/bin/linux_arm/dget

# 添加执行权限
chmod +x dget

# 移动到系统目录
sudo mv dget /usr/local/bin/

Mac:


# Intel芯片
wget https://gitee.com/extrame/dget/raw/master/bin/darwin_amd64/dget

# Apple Silicon (M1/M2)
wget https://gitee.com/extrame/dget/raw/master/bin/darwin_arm64/dget

# 添加执行权限
chmod +x dget
sudo mv dget /usr/local/bin/

3.2 使用Go安装

如果已安装Go环境,可以使用go install安装:


# 安装最新版本
go install gitee.com/extrame/dget/cmd/dget@latest

# 或指定版本
go install gitee.com/extrame/dget/cmd/dget@v1.0.0

3.3 源码编译


# 克隆仓库
git clone https://gitee.com/extrame/dget.git
cd dget

# 编译
go build -o dget ./cmd/dget

# 安装
sudo mv dget /usr/local/bin/

四、基本用法

4.1 下载官方镜像


# 下载官方镜像(默认latest标签)
dget nginx

# 指定版本标签
dget nginx:1.25

# 指定版本号
dget influxdb:1.8.3

4.2 下载过程


$ dget nginx:1.25

正在获取镜像: nginx:1.25
正在解析镜像层...
层: 2c2b34289e2c 100% [===========================>]  50.65MB / 50.65MB
层: 3d44a1fd55a 100% [===========================>]  28.29MB / 28.29MB
层: a6c8cc2b88d2 100% [===========================>]   4.84MB /  4.84MB
层: 4aac77e7c9ff 100% [===========================>]  10.03MB / 10.03MB
层: 1e8a246bb8e4 100% [===========================>]   7.87MB /  7.87MB
层: e2d2c42f02b8 100% [===========================>]   7.23MB /  7.23MB

下载完成!
文件: tmp_nginx_1.25.tar.gz
大小: 108.91 MB

4.3 下载位置

默认下载到当前目录的 tmp_xxx 文件夹中:


# 查看下载的文件
ls -la tmp_*

# 移动到目标位置
mv tmp_nginx_latest.tar.gz /path/to/your/destination/

4.4 缓存机制

dget支持缓存功能,如果下载出错,直接重新执行即可:


# 首次下载
dget redis:7.0

# 如果下载失败,再次执行会自动使用缓存
dget redis:7.0

五、高级用法

5.1 从第三方Registry下载

阿里云镜像:


dget alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:220901.1

DaoCloud镜像:


dget -registry m.daocloud.io nginx:latest

其他私有Registry:


dget myregistry.example.com/myproject/myimage:v1.0

5.2 选择架构

对于多架构镜像,可以使用 -arch 参数指定架构:


# 下载ARM架构
dget -arch linux/arm influxdb:1.8.3

# 下载ARM64架构
dget -arch linux/arm64 influxdb:1.8.3

# 下载x86_64架构
dget -arch linux/amd64 influxdb:1.8.3

5.3 使用代理

如果网络环境需要代理,可以使用 -proxy 参数:


# 使用HTTP代理
dget -proxy http://proxy.example.com:8080 nginx:latest

# 使用SOCKS5代理
dget -proxy socks5://proxy.example.com:1080 nginx:latest

5.4 获取可用标签

如果不知道镜像有哪些版本标签,可以使用 -tag 参数查询:


# 查询nginx可用标签
dget -tag nginx

# 查询influxdb可用标签
dget -tag influxdb

输出示例:


nginx available tags:
latest
1.25
1.25-alpine
1.24
1.24-alpine
1.23
1.23-alpine
...

5.5 输出到指定目录


# 下载到指定目录
dget -o /opt/images nginx:latest

# 重命名输出文件
dget -o /opt/images/my-nginx.tar.gz nginx:latest

5.6 静默模式


# 不显示进度条
dget -q nginx:latest

# 只显示错误
dget -v nginx:latest 2>&1 | grep -i error

六、使用场景

6.1 内网离线部署

这是dget最典型的使用场景:


# 1. 在有网环境下下载所需镜像
dget nginx:1.25
dget mysql:8.0
dget redis:7.0
dget postgres:15
dget elasticsearch:8.11.0

# 2. 打包传输
tar czvf docker-images.tar.gz tmp_*

# 3. 传输到内网服务器
scp docker-images.tar.gz internal-server:/opt/

# 4. 内网导入
cd /opt/
tar xzvf docker-images.tar.gz
docker load -i tmp_nginx_latest.tar.gz
docker load -i tmp_mysql_8.0.tar.gz

6.2 批量下载


# 批量下载多个镜像
for img in nginx:1.25 mysql:8.0 redis:7.0; do
    dget "$img"
done

6.3 定时同步镜像

可以使用cron定时同步镜像:


# 编辑crontab
crontab -e

# 每天凌晨2点同步最新镜像
0 2 * * * cd /opt/images && dget -q nginx:latest mysql:8.0 redis:7.0 >> /var/log/dget-sync.log 2>&1

6.4 CI/CD集成

在Jenkins或GitLab CI中使用:


# .gitlab-ci.yml示例
build:
  script:
    - dget -o images/ nginx:$NGINX_VERSION
    - docker load -i images/tmp_nginx_*.tar.gz

七、常见问题

7.1 下载速度慢

解决方法:

1. 使用国内镜像源 2. 配置代理 3. 使用阿里云等国内Registry

7.2 镜像不存在

错误信息: Error: manifest not found

解决方法:

1. 检查镜像名称和标签是否正确 2. 使用 -tag 查看可用标签 3. 确认Registry地址是否正确

7.3 磁盘空间不足

解决方法:


# 清理dget缓存
rm -rf tmp_*

# 或指定下载到其他分区
dget -o /data/images nginx:latest

7.4 权限问题


# Linux下可能需要sudo
sudo dget nginx:latest

# 或者创建软链接到系统目录
sudo ln -s $(pwd)/dget /usr/local/bin/dget

八、与其他工具对比

8.1 工具对比表

特性 dget docker save docker export
需要Docker ❌ 不需要 ✅ 需要 ✅ 需要
单文件工具 ✅ 是 ❌ 否 ❌ 否
跨平台 ✅ 多平台 ❌ 仅Linux ❌ 仅Linux
第三方Registry ✅ 支持 ❌ 不支持 ❌ 不支持
多架构支持 ✅ 支持 ❌ 不支持 ❌ 不支持
代理支持 ✅ 支持 ❌ 不支持 ❌ 不支持

8.2 为什么选择dget?

1. 轻量级:单文件,无需安装Docker 2. 快速:直接下载,无需先pull再save 3. 灵活:支持多架构、多Registry 4. 简单:命令简单,易于集成

九、总结

dget是一款非常实用的Docker镜像下载工具,特别适合以下场景:

内网离线部署 - 无需安装Docker即可获取镜像 ✅ 镜像迁移 - 快速备份和迁移镜像 ✅ CI/CD集成 - 简化自动化流程 ✅ 多架构支持 - 支持ARM等特殊架构

项目地址: https://gitee.com/extrame/dget

如果您经常需要处理Docker镜像,强烈推荐试试dget,它会让您的工作更加高效!


参考资源:

  • GitHub:https://github.com/extrame/dget
  • Gitee:https://gitee.com/extrame/dget
  • Docker官方文档:https://docs.docker.com/

发表回复

后才能评论