解决无法访问 DockerHub 问题的笨办法一则

2025年4月11日Elecmonkey

DockerHub 镜像无法访问有时候真的就成了拦路虎。不过对于个人电脑上实验性的需求来说,如果只是想下载一个镜像,完全可以通过笨办法解决。鉴于网络受限的场景不止出现在 DockerHub,这个办法我还挺常用。

当然,践行这个笨办法,我们需要有一台可以访问 DockerHub 的服务器。

笨办法

在能够访问 DockerHub 的机器上拉取所需镜像:

bash
1docker pull mongo:latest

确认镜像已经成功拉取:

bash
1docker images | grep mongo

使用 docker save 命令导出:

bash
1docker save mongo:latest | gzip > mongo.tar.gz

也可以不压缩直接导出:

bash
1docker save -o mongo.tar mongo:latest

把导出的镜像弄到本地来:

bash
1scp mongo.tar.gz user@target-machine:/path/to/destination/

导入压缩的镜像:

bash
1gunzip -c mongo.tar.gz | docker load

未压缩的镜像:

bash
1docker load -i mongo.tar

验证镜像是否已成功导入:

bash
1docker images | grep mongo

一定程度自动化的笨办法

批处理脚本

对于需要同时处理多个镜像的情况,可以使用脚本批量操作:

bash
1#!/bin/bash 2# 需要导出的镜像列表 3IMAGES=( 4 "nginx:1.21" 5 "mongo:5.0" 6 "redis:6.2" 7 "node:16-alpine" 8) 9 10# 创建存储目录 11mkdir -p docker-images 12 13# 批量导出 14for img in "${IMAGES[@]}"; do 15 # 替换冒号为下划线,方便文件命名 16 filename=$(echo $img | tr ':' '_') 17 echo "导出 $img 到 docker-images/${filename}.tar.gz" 18 docker pull $img 19 docker save $img | gzip > docker-images/${filename}.tar.gz 20done 21 22echo "所有镜像已导出到 docker-images/ 目录"

在目标机器上,可以使用类似的脚本批量导入:

bash
1#!/bin/bash 2# 导入目录中的所有镜像 3for tarfile in docker-images/*.tar.gz; do 4 echo "导入 $tarfile..." 5 gunzip -c $tarfile | docker load 6done 7 8echo "所有镜像导入完成"

分片传输

对于非常大的镜像,可以考虑分片传输:

在服务器上分割文件:

bash
1docker save huge-image:latest | gzip > huge-image.tar.gz 2split -b 1G huge-image.tar.gz huge-image.part-

在目标机器上重组并导入:

bash
1cat huge-image.part-* > huge-image.tar.gz 2gunzip -c huge-image.tar.gz | docker load

镜像签名验证

当对安全性有绝对的要求的时候。

在源机器上计算 sha256 :

bash
1sha256sum mongo.tar.gz > mongo.tar.gz.sha256

在目标机器上验证:

bash
1sha256sum -c mongo.tar.gz.sha256

不过这个笨办法应该一般都是个人开发环境用,估计大部分人应该是懒得验证签名的。