如何在两个私有Docker仓库之间复制Docker镜像?
当然可以!这里有几种实用的方法帮你把镜像从一个私有Docker仓库复制到另一个,根据你的场景选就行:
方法1:Docker CLI 基础操作(最通用)
这是最直观的方式,适合单个或少量镜像迁移:
- 第一步:从源仓库拉取镜像
先确保你已经登录到源私有仓库:docker login source-registry.example.com
然后拉取目标镜像(记得带上完整的仓库路径和标签):docker pull source-registry.example.com/my-image:v1 - 第二步:给镜像打上新的目标仓库标签
给拉取到本地的镜像添加目标仓库的标签,格式是目标仓库地址/镜像名:标签:docker tag source-registry.example.com/my-image:v1 target-registry.example.com/my-image:v1 - 第三步:推送到目标仓库
登录目标私有仓库:docker login target-registry.example.com
然后推送镜像:docker push target-registry.example.com/my-image:v1 - 可选:清理本地镜像(如果不需要保留的话)
docker rmi source-registry.example.com/my-image:v1 target-registry.example.com/my-image:v1
方法2:用Skopeo工具(无需本地存储镜像,更高效)
如果不想把镜像拉到本地磁盘,Skopeo是个很棒的工具——它可以直接在两个仓库之间复制镜像,节省磁盘空间和时间,尤其适合批量操作:
- 首先确保安装了Skopeo(不同系统安装方式不同,比如Ubuntu用
apt install skopeo,CentOS用dnf install skopeo) - 复制单个镜像:
先配置好两个仓库的认证(可以用skopeo login命令,或者把认证信息放在~/.docker/config.json里),然后执行:skopeo copy docker://source-registry.example.com/my-image:v1 docker://target-registry.example.com/my-image:v1 - 批量复制:如果要复制某个仓库下的所有标签,可以结合
skopeo list-tags命令写个简单脚本:
注意:这个脚本需要安装IMAGE_NAME="my-image" SOURCE_REG="source-registry.example.com" TARGET_REG="target-registry.example.com" # 获取该镜像的所有标签 TAGS=$(skopeo list-tags docker://${SOURCE_REG}/${IMAGE_NAME} | jq -r '.Tags[]') # 遍历每个标签进行复制 for TAG in $TAGS; do skopeo copy docker://${SOURCE_REG}/${IMAGE_NAME}:${TAG} docker://${TARGET_REG}/${IMAGE_NAME}:${TAG} donejq工具来解析JSON格式的标签列表。
方法3:Registry 同步工具(适合长期批量同步)
如果需要定期、自动同步两个仓库的镜像,可以用专门的同步工具:
- registry-sync:轻量级工具,支持按规则同步镜像,配置好源和目标仓库后可以定时运行
- Harbor 内置复制功能:如果你的私有仓库是Harbor,它自带可视化的镜像复制功能,在Web界面就能配置同步规则,支持定时触发或实时同步
关键注意事项
- 确保你对两个私有仓库都拥有拉取(pull)和推送(push)权限
- 如果镜像有多个标签,记得每个标签都要单独处理(或者用批量方法一次性搞定)
- 对于大型镜像,Skopeo的直接复制方式会比本地拉取再推送高效很多,因为它不需要把完整镜像下载到本地磁盘
内容的提问来源于stack exchange,提问作者Piotr Stapp
相关产品推荐
相关产品推荐

