跨仓库同步与迁移
为什么需要跨仓库同步
在实际生产环境中,镜像通常需要在多个仓库之间同步:
- 异地容灾:镜像在不同数据中心保留副本
- 环境隔离:开发/测试/生产仓库互相同步
- 多云策略:多个云厂商之间同步
- 备份恢复:备份重要镜像到备用仓库
手工迁移方法
方法一:docker pull + tag + push
# 步骤 1:从源仓库拉取
docker pull registry-source.example.com/myapp:1.0.0
# 步骤 2:打标签
docker tag registry-source.example.com/myapp:1.0.0 \
registry-target.example.com/myapp:1.0.0
# 步骤 3:推送到目标仓库
docker push registry-target.example.com/myapp:1.0.0
# 步骤 4:清理本地
docker rmi registry-source.example.com/myapp:1.0.0
docker rmi registry-target.example.com/myapp:1.0.0
脚本批量迁移
#!/bin/bash
# migrate-images.sh
SOURCE_REGISTRY="registry-source.example.com"
TARGET_REGISTRY="registry-target.example.com"
NAMESPACE="myorg"
# 获取源仓库的所有镜像列表
IMAGES=$(curl -s https://$SOURCE_REGISTRY/v2/_catalog | jq -r '.repositories[]')
for IMAGE in $IMAGES; do
TAGS=$(curl -s https://$SOURCE_REGISTRY/v2/$IMAGE/tags/list | jq -r '.tags[]')
for TAG in $TAGS; do
echo "Migrating $IMAGE:$TAG..."
docker pull $SOURCE_REGISTRY/$IMAGE:$TAG
docker tag $SOURCE_REGISTRY/$IMAGE:$TAG $TARGET_REGISTRY/$IMAGE:$TAG
docker push $TARGET_REGISTRY/$IMAGE:$TAG
docker rmi $SOURCE_REGISTRY/$IMAGE:$TAG $TARGET_REGISTRY/$IMAGE:$TAG
done
done
使用 skopeo 工具
Skopeo 是专门用于跨仓库操作的工具,不需要拉取镜像到本地:
安装 skopeo
# Ubuntu/Debian
apt-get install skopeo
# CentOS/RHEL
yum install skopeo
# 从二进制安装
curl -L https://github.com/containers/skopeo/releases/latest/download/skopeo-linux-amd64 -o /usr/local/bin/skopeo
chmod +x /usr/local/bin/skopeo
基本同步命令
# 直接复制镜像(不经过本地存储)
skopeo copy \
docker://registry-source.example.com/myapp:1.0.0 \
docker://registry-target.example.com/myapp:1.0.0
# 带认证
skopeo copy \
--src-creds admin:password \
--dest-creds admin:password \
docker://registry-source.example.com/myapp:1.0.0 \
docker://registry-target.example.com/myapp:1.0.0
# 同步全部标签
skopeo copy --all \
docker://registry-source.example.com/myapp:latest \
docker://registry-target.example.com/myapp:latest
skopeo 同步优势
# 1. 不需要 Docker 守护进程
# 2. 不占用本地存储
# 3. 只传输不同的层
# 4. 支持 OCI 和 Docker 格式互转
# 同步整个仓库
skopeo sync \
--src docker \
--dest docker \
registry-source.example.com/myorg \
registry-target.example.com/myorg
使用 Harbor 复制
Harbor 内置了完善的镜像复制功能:
Web UI 配置
# 1. 进入 Harbor UI
# 2. 系统管理 → 仓库管理 → 添加目标仓库
# - 名称: 灾备仓库
# - URL: https://dr-registry.example.com
# - 凭据: admin/***
# 3. 系统管理 → 复制管理 → 新建规则
# - 源项目: library
# - 目标仓库: 灾备仓库
# - 过滤条件: */* (所有镜像)
# - 触发模式: 事件驱动
Harbor 复制配置文件
# replication-policy.yaml
apiVersion: goharbor.io/v1alpha1
kind: ReplicationRule
metadata:
name: sync-all-images
spec:
filters:
- type: name
value: "library/*"
- type: tag
value: "v*" # 只同步版本标签
trigger:
type: event_based # 事件触发
settings:
creation: true
deletion: false
dest_namespace:
name: backup
replace_count: 0
override: true
speed: -1 # 不限速
使用阿里云/腾讯云镜像同步
# 阿里云容器镜像服务
# 创建同步规则
# 来源:Docker Hub / 自建仓库
# 目标:阿里云 Container Registry
# 腾讯云 TCR
# 企业版 TCR 支持跨地域同步
# 实例同步 → 创建复制规则
增量同步与全量同步
全量同步
# 完整同步所有层
skopeo copy --all \
docker://source/myapp:1.0.0 \
docker://target/myapp:1.0.0
增量同步
# skopeo 自动只传输不存在的层
# 再次运行相同的命令只同步新增的层
skopeo copy \
docker://source/myapp:1.0.0 \
docker://target/myapp:1.0.0
同步策略
| 策略 | 触发方式 | 适用场景 |
|---|---|---|
| 立即同步 | 推送时触发 | 主备同步 |
| 定时同步 | cron 定时执行 | 定期备份 |
| 按需同步 | 手动触发 | 紧急恢复 |
| 远程代理 | Registry 代理模式 | 就近访问 |
批量镜像保存与恢复
保存到文件
# 保存单个镜像
docker save myapp:1.0.0 -o myapp-1.0.0.tar
# 保存多个镜像
docker save myapp:1.0.0 myapp:1.1.0 nginx:alpine -o backup.tar
# 压缩保存
docker save myapp:1.0.0 | gzip > myapp-1.0.0.tar.gz
# 查看 tar 内容
tar -tf myapp-1.0.0.tar
从文件恢复
# 加载镜像
docker load -i myapp-1.0.0.tar
# 从压缩文件加载
gunzip -c myapp-1.0.0.tar.gz | docker load
跨云迁移案例
# 场景:从 Docker Hub 迁移到阿里云
# 1. 拉取镜像
docker pull nginx:alpine
# 2. 打阿里云标签
docker tag nginx:alpine registry.cn-hangzhou.aliyuncs.com/myorg/nginx:alpine
# 3. 推送
docker push registry.cn-hangzhou.aliyuncs.com/myorg/nginx:alpine
# 场景:自建仓库 → 云仓库
skopeo copy \
--src-tls-verify=false \
docker://192.168.1.100:5000/myapp:1.0.0 \
docker://myregistry.azurecr.io/myapp:1.0.0
同步验证
# 验证同步是否成功
# 方法 1:对比摘要
SOURCE_DIGEST=$(skopeo inspect docker://source/myapp:1.0.0 | jq -r '.Digest')
TARGET_DIGEST=$(skopeo inspect docker://target/myapp:1.0.0 | jq -r '.Digest')
if [ "$SOURCE_DIGEST" = "$TARGET_DIGEST" ]; then
echo "✅ 同步成功"
else
echo "❌ 同步失败"
fi
# 方法 2:运行验证
docker run --rm target/myapp:1.0.0 --version
跨仓库同步和迁移是容器化运维中的常见需求,理解不同工具和方法可以让你在多种场景下高效完成镜像分发。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容