一键推送 Docker Hub 镜像到阿里云镜像仓库(含完整脚本)
🚀 一键推送 Docker Hub 镜像到阿里云镜像仓库(含完整脚本)
在国内使用 Docker Hub 时,经常会遇到 503 Service Unavailable 或 拉取速度极慢 的问题。 为了解决这个问题,我们可以将镜像从 Docker Hub 同步到 阿里云镜像仓库(ACR),以后就能稳定高速地从阿里云拉取。
本文将介绍如何将镜像(例如 xiebinn/dotnet:8.0-aspnetcore-runtime-with-ghostscript)推送到阿里云镜像服务,并提供一份可直接执行的 一键推送脚本。
📘 一、思路概述
整个过程可以分为以下 5 步:
- 从 Docker Hub 拉取镜像(或在能访问的环境中导出镜像)
- 登录阿里云容器镜像服务(ACR)
- 给镜像重新打标签为阿里云格式
- 推送镜像到阿里云仓库
- 在服务器上从阿里云拉取使用
⚙️ 二、环境准备
假设:
- 阿里云镜像仓库地区:
registry.cn-beijing.aliyuncs.com - 命名空间:
xdb_zc - 需要同步的镜像:
xiebinn/dotnet:8.0-aspnetcore-runtime-with-ghostscript
🧰 三、一键推送脚本
将以下内容保存为 push-to-acr.sh 文件:
#!/bin/bash
#
# 一键推送 Docker Hub 镜像到阿里云镜像仓库
# 作者: ChatGPT(GPT-5)
# 使用: ./push-to-acr.sh xiebinn/dotnet 8.0-aspnetcore-runtime-with-ghostscript
#
# ==== 基本配置 ====
ALIYUN_REGISTRY="registry.cn-beijing.aliyuncs.com"
NAMESPACE="xdb_zc"
# ==== 参数检查 ====
if [ $# -lt 2 ]; then
echo "❌ 使用方法: $0 <镜像名> <标签>"
echo "例如: $0 xiebinn/dotnet 8.0-aspnetcore-runtime-with-ghostscript"
exit 1
fi
IMAGE_NAME="$1"
IMAGE_TAG="$2"
SOURCE_IMAGE="${IMAGE_NAME}:${IMAGE_TAG}"
TARGET_IMAGE="${ALIYUN_REGISTRY}/${NAMESPACE}/$(basename ${IMAGE_NAME}):${IMAGE_TAG}"
echo "🚀 准备将镜像推送到阿里云..."
echo "📦 源镜像: ${SOURCE_IMAGE}"
echo "🎯 目标镜像: ${TARGET_IMAGE}"
echo
# ==== Step 1. 拉取镜像 ====
echo "➡️ 1/4 拉取源镜像..."
docker pull "${SOURCE_IMAGE}" || {
echo "❌ 拉取镜像失败,请检查网络或代理设置!"
exit 1
}
# ==== Step 2. 重新打标签 ====
echo "➡️ 2/4 打标签为阿里云仓库格式..."
docker tag "${SOURCE_IMAGE}" "${TARGET_IMAGE}"
# ==== Step 3. 登录阿里云镜像仓库 ====
echo "➡️ 3/4 登录阿里云镜像仓库 (${ALIYUN_REGISTRY})"
docker login --username=<你的阿里云账号> "${ALIYUN_REGISTRY}"
if [ $? -ne 0 ]; then
echo "❌ 登录阿里云失败,请确认账号密码正确"
exit 1
fi
# ==== Step 4. 推送镜像 ====
echo "➡️ 4/4 推送镜像到阿里云..."
docker push "${TARGET_IMAGE}" || {
echo "❌ 推送失败,请检查仓库是否存在(命名空间: ${NAMESPACE})"
exit 1
}
echo
echo "✅ 镜像已成功推送到阿里云:"
echo " ${TARGET_IMAGE}"
echo
echo "下次可直接使用:"
echo " docker pull ${TARGET_IMAGE}"
🧩 四、使用方法
-
保存脚本
nano push-to-acr.sh粘贴上方脚本内容后保存。
-
赋予执行权限
chmod +x push-to-acr.sh -
执行脚本
./push-to-acr.sh xiebinn/dotnet 8.0-aspnetcore-runtime-with-ghostscript -
结果示例
🚀 准备将镜像推送到阿里云... 📦 源镜像: xiebinn/dotnet:8.0-aspnetcore-runtime-with-ghostscript 🎯 目标镜像: registry.cn-beijing.aliyuncs.com/xdb_zc/dotnet:8.0-aspnetcore-runtime-with-ghostscript ➡️ 1/4 拉取源镜像... ➡️ 2/4 打标签为阿里云仓库格式... ➡️ 3/4 登录阿里云镜像仓库... Login Succeeded ➡️ 4/4 推送镜像到阿里云... ✅ 镜像已成功推送到阿里云: registry.cn-beijing.aliyuncs.com/xdb_zc/dotnet:8.0-aspnetcore-runtime-with-ghostscript
🧠 五、离线导入镜像(可选)
如果你在国内网络环境无法拉取镜像,可以使用导出与导入方式:
在可访问 Docker Hub 的机器执行:
docker pull xiebinn/dotnet:8.0-aspnetcore-runtime-with-ghostscript
docker save -o dotnet-ghostscript.tar xiebinn/dotnet:8.0-aspnetcore-runtime-with-ghostscript
在目标服务器上执行:
docker load -i dotnet-ghostscript.tar
./push-to-acr.sh xiebinn/dotnet 8.0-aspnetcore-runtime-with-ghostscript
这样即使没有外网,也能将镜像推送到阿里云。
✅ 六、总结
| 步骤 | 命令 |
|---|---|
| 拉取镜像 | docker pull xiebinn/dotnet:8.0-aspnetcore-runtime-with-ghostscript |
| 标记镜像 | docker tag xiebinn/dotnet:8.0-aspnetcore-runtime-with-ghostscript registry.cn-beijing.aliyuncs.com/xdb_zc/dotnet:8.0-aspnetcore-runtime-with-ghostscript |
| 登录阿里云 | docker login registry.cn-beijing.aliyuncs.com |
| 推送镜像 | docker push registry.cn-beijing.aliyuncs.com/xdb_zc/dotnet:8.0-aspnetcore-runtime-with-ghostscript |
| 使用镜像 | docker pull registry.cn-beijing.aliyuncs.com/xdb_zc/dotnet:8.0-aspnetcore-runtime-with-ghostscript |
通过这个脚本,你可以在几秒内自动完成所有步骤,不再为 503 或拉取超时烦恼 🚀