在国内使用 Docker 时,常常面临无法直接访问官方镜像仓库的问题,这给学习和工作带来诸多不便。目前常见的解决方法,要么稳定性差,要么需要服务器、梯子,或者存在拉取数量限制。本文将介绍一种全新的 Docker 镜像拉取方案,该方案具有稳定性高、无经济开销、无拉取限制等优点,只需一次初始化配置,就能在任意目录通过简单命令实现镜像拉取。
现有方法分析
一、更换 Docker 源
方案描述:修改 Docker 配置文件daemon.json,添加公开镜像源后直接拉取
是否需要海外服务器:×
是否需要梯子:×
稳定性:极差(需频繁更换源)
限额:不限
二、使用公开镜像站 方案描述:使用类似docker.aityp.com/的镜像站,手动查找更换... tag 后再拉取
是否需要海外服务器:×
是否需要梯子:×
稳定性:中
限额:不限
三、配置 proxychains 代理拉取 方案描述:配置代理后,使用proxychains docker pull xxx拉取镜像
是否需要海外服务器:×
是否需要梯子:√
稳定性:高
限额:10/h
四、自建 Docker 代理服务
方案描述:使用类似 docxy 等方案,在服务器自建 Docker 代理,通过换源即可使用
是否需要海外服务器:√
是否需要梯子:×
稳定性:高
限额:10/h
现有方法各有不足:更换 Docker 源虽好用但稳定性差;公开镜像站便捷性不足,很多镜像难以找到;配置 proxychains 代理拉取需要梯子且有限额;自建代理服务则需要服务器部署,同样存在数量限制。
新方案介绍
方案原理
该方案借助 GitHub 工作流和阿里云个人镜像仓库来实现镜像拉取,整体架构如下:
- 将希望下载的镜像名写入 images.txt。
- 将变更提交到 Git 仓库。
- 触发 GitHub 工作流,工作流中定义了执行的脚本。
- 工作流自动执行同步脚本,从 Docker 官方镜像站 pull 镜像,并上传到阿里云个人镜像仓库中。
- 用户再从阿里云个人镜像站拉取镜像。
- 将拉取到的镜像重命名为目标镜像 tag。
此方案具有诸多优势:无需梯子,GitHub 和阿里云个人镜像仓库均可直接访问;无需服务器,利用 GitHub 工作流的容器环境实现镜像同步;免费,阿里云个人镜像站可免费创建,总限额 300 个,超量可删除后重新创建;无拉取限制,经测试未发现官方镜像站每小时 10 个的拉取限制;稳定性高,部署成功后可稳定使用;使用便捷,虽原理步骤看似复杂,但已通过脚本封装,配置完成后仅需类似原生命令的 docker_pull 镜像 tag 即可拉取。
方案配置
环境依赖
- 安装 git 并配置账号密码或密钥(推荐使用密钥)。
- 拥有阿里云账号并完成实名注册(若没有,可前往阿里云官方网站注册)。
- 安装 Docker。
阿里云个人镜像仓库申请
- 开通容器镜像服务:访问cr.console.aliyun.com/cn-shanghai...
- 设置镜像仓库登录密码:服务开通后,点击设置 Registry 登录密码按钮,或在左侧导航栏访问凭证处设置,记住设置的密码。
- 创建命名空间:点击左侧导航栏命名空间,点击创建命名空间按钮,输入独特名称后确定,记住该名称。
- 记录登录凭证:点击左侧导航栏登录凭证,记下仓库地址。
Git 仓库配置
- fork 仓库:将开源仓库github.com/you8023/doc... fork 到自己的 Git 账号(若希望镜像 tag 保密,需自行创建 private 权限仓库,克隆后上传;若想分享给好友,可在设置的 Collaborators 处邀请)。
- 配置仓库全局变量:依次点击 Settings -> Secrets and Security -> Actions,点击 New respository secret 按钮,添加 DOCKER_USER(阿里云账户)、DOCKER_PWD(阿里云镜像仓库密码)、DOCKER_REGISTRY(仓库地址)、DOCKER_NS(命名空间名称)这 4 个全局变量。
- 克隆仓库:复制自己 fork 的仓库地址,使用 git clone xxx 克隆到本地。
脚本配置
- 复制本地仓库中的 cmd/conf.yaml.default 文件并命名为 cmd/conf.yaml。
- 编辑 conf.yaml,配置 registry(阿里云个人镜像仓库地址)、namespace(命名空间名称)、images_dir(Git 仓库路径)、max_retries(拉取镜像重试次数,默认为 60)、retry_delay(拉取镜像尝试间隔,秒,默认为 1)、first_delay(提交镜像 tag 后等待开始尝试拉取的时间,秒,默认为 20)。
- 打开终端,登录阿里云镜像仓库:docker login <阿里云个人镜像仓库地址>。
- 添加脚本目录到环境变量:
-
- Windows 系统:右键此电脑选择属性,点击高级系统设置,点击环境变量,找到 Path 变量编辑,新建添加 cmd 目录路径。
- Linux 系统:对 docker_pull 脚本添加执行权限,编辑~/.bashrc,添加 export PATH=$PATH:/home/dubito/git/docker_images_sync/cmd(路径替换为自己的),执行 source ~/.bashrc 使配置生效。
- Mac 系统:参考 Linux 系统配置(目前暂未测试,欢迎反馈)。
方案使用
配置完成后,可在任意目录使用命令拉取镜像:
- 拉取单个镜像:docker_pull mysql:8.0.1。
- 拉取多个镜像:docker_pull mysql:8.0.1 mcp/elasticsearch:latest bitnami/redis:8.0.2-debian-12-r3。
若拉取失败,可在 GitHub 查看工作流状态和日志,以便排查问题。