跨仓库同步与迁移

跨仓库同步与迁移

为什么需要跨仓库同步

在实际生产环境中,镜像通常需要在多个仓库之间同步:

  • 异地容灾:镜像在不同数据中心保留副本
  • 环境隔离:开发/测试/生产仓库互相同步
  • 多云策略:多个云厂商之间同步
  • 备份恢复:备份重要镜像到备用仓库

手工迁移方法

方法一: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
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容