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 维护不活跃,兼容性需注意

推荐顺序

  1. Skopeo:功能最全、社区活跃,推荐首选。
  2. Moby 脚本:适用于快速下载简单镜像,如 hello-world
  3. docker-pull.py:适合临时使用,但需关注兼容性问题。

在某些受限环境中,这些方法可以有效替代 Docker 客户端完成镜像下载任务,为离线部署提供了便利。


原始标题:Download Docker Images Without Docker