1. 简介
Docker 是一个用于开发、部署和运行容器化应用的平台。开发人员通常基于被称为 Docker 镜像 的可执行蓝图来构建这些应用。Docker 镜像是一种轻量级、自包含的文件,它打包了运行某个应用所需的一切。
在某些场景下,我们可能没有安装 Docker 客户端,但仍然需要下载某个镜像。本文将介绍几种无需 Docker 即可下载镜像的方法,并提供完整示例。
文中所有命令均在 Ubuntu 22.04 上测试通过。
2. 为何要不通过 Docker 下载镜像?
以下是一些常见的“不通过 Docker 下载镜像”的需求场景:
- 某些高安全环境中,出于合规要求,禁止安装额外软件(包括 Docker)。
- 在离线部署场景中,需要将镜像提前下载并传输到无网络连接的机器上。
此时,我们可以通过以下三种工具来实现目标:
✅ Moby 的 download-frozen-image-v2.sh
脚本
✅ Skopeo
✅ docker-pull.py 脚本
下面将逐一介绍它们的使用方法。
3. 使用 Moby 的 download-frozen-image-v2.sh
脚本
Moby 是 Docker 推出的一个用于构建定制化容器系统的开源框架。它提供了一系列组件和工具,其中就包括一个非常实用的脚本:download-frozen-image-v2.sh
,它可以从 Docker Hub 通过 HTTP 直接下载镜像,并生成 Docker 可识别的格式。
3.1 安装与使用
该脚本托管在 GitHub 上,可以通过 wget
直接下载:
$ wget https://raw.githubusercontent.com/moby/moby/master/contrib/download-frozen-image-v2.sh
使用语法如下:
./download-frozen-image-v2.sh <目标目录> <镜像名[:tag][@digest]>
赋予脚本执行权限:
$ chmod u+x download-frozen-image-v2.sh
如果提示 jq not found
,请先安装 jq
:
$ sudo apt-get install jq
示例:下载 hello-world
镜像到 /tmp/old-hello-world
:
$ ./download-frozen-image-v2.sh /tmp/old-hello-world hello-world:latest@sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7
⚠️ 注意:如果提示 schemaVersion 为 1,说明脚本无法处理新版镜像格式(schemaVersion 2+),但下载仍可正常完成。
3.2 将镜像加载进 Docker
将下载的镜像打包并传输到有 Docker 的机器上:
$ tar -C '/tmp/old-hello-world' -cf 'hello-world.tar' .
$ scp hello-world.tar user@hasdocker:~
然后在目标机器加载:
$ docker load -i hello-world.tar
$ docker run --rm -ti hello-world bash
4. 使用 Skopeo
Skopeo 是一个用于操作容器镜像和仓库的命令行工具。它支持多种镜像格式和存储方式,包括 Docker Registry、本地目录、OCI 布局等。
4.1 安装 Skopeo
$ sudo apt-get update
$ sudo apt install skopeo
4.2 下载镜像
使用 skopeo copy
命令下载镜像并保存为 tar 包:
$ skopeo copy docker://ubuntu docker-archive:/tmp/ubuntu.tar:ubuntu
输出如下:
Getting image source signatures
Copying blob 3c645031de29 done
Copying config 7af9ba4f0a done
Writing manifest to image destination
Storing signatures
4.3 加载镜像并运行
将 tar 包拷贝到有 Docker 的机器:
$ scp /tmp/ubuntu.tar user@hasdocker:~
加载并运行:
$ docker load -i ubuntu.tar
$ docker run -it ubuntu
✅ 优点:Skopeo 是目前社区活跃度最高的工具之一,功能完整,兼容性好,推荐优先使用。
5. 使用 docker-pull.py
脚本
docker-pull.py
是一个 Python 脚本,用于通过 Docker Registry HTTPS API v2 从 Docker Hub 下载镜像。它跨平台,适合在无 Docker 安装环境使用。
5.1 安装与使用
从 GitHub 获取脚本:
$ git clone https://github.com/NotGlop/docker-drag.git
$ cd docker-drag
查看脚本:
$ ls
README.md docker_pull.py
运行示例(以 centos
镜像为例):
$ python3 docker_pull.py centos
Creating image structure in: tmp_centos_latest
a1d0c7532777: Pull complete [83518086]
Docker image pulled: library_centos.tar
该命令会生成一个 library_centos.tar
文件。
5.2 加载并运行镜像
将 tar 文件加载进 Docker:
$ docker load -i library_centos.tar
$ docker run -it centos
⚠️ 注意:该项目更新频率较低,使用时需注意兼容性和维护状态。
6. 总结
工具名称 | 语言 | 优点 | 缺点 |
---|---|---|---|
Moby download-frozen-image-v2.sh |
Shell | 简单易用,Docker 官方出品 | 不支持 schemaVersion 2+,功能有限 |
Skopeo | Go | 功能全面,活跃维护 | 需要安装依赖 |
docker-pull.py |
Python | 跨平台,无需安装 Docker | 维护不活跃,兼容性需注意 |
✅ 推荐顺序:
- Skopeo:功能最全、社区活跃,推荐首选。
- Moby 脚本:适用于快速下载简单镜像,如
hello-world
。 - docker-pull.py:适合临时使用,但需关注兼容性问题。
在某些受限环境中,这些方法可以有效替代 Docker 客户端完成镜像下载任务,为离线部署提供了便利。