docker原生不支持远程镜像同步,需借助harbor、skopeo或gh_mirrors实现:harbor适用于企业级策略化自动复制;skopeo适合轻量脚本化搬运;gh_mirrors支持gitops声明式同步,三者按架构复杂度与运维偏好选其一。

Docker 本身不提供原生的远程镜像同步功能,必须依赖支持复制能力的仓库系统或专用工具来实现。核心思路是:用 Harbor 做策略化复制、用 Skopeo 做脚本化搬运、用 gh_mirrors 做声明式流水线驱动,三者选其一即可落地,关键看你的架构复杂度和运维偏好。
用 Harbor 配置推送式自动同步
这是企业级最常用、最稳定的方式,适合已有 Harbor 环境的团队:
- 在源 Harbor 的「管理员 → 复制」页面中,先添加目标 Harbor 为「目标注册中心」,填入 URL、用户名密码、启用 TLS 验证(必须 HTTPS)
- 新建复制规则,指定源项目(如 prod/nginx)、目标命名空间(可映射为 mirror/nginx)、标签过滤器(例如 v[0-9]+\..* 只同步语义化版本)
- 触发模式选 event_based,这样每次
docker push到源仓库后,几秒内就自动触发同步;若需更可控,也可设为定时(如*/10 * * * *每10分钟检查一次) - 务必开启「校验和验证」和「加密传输」选项,避免中间篡改或网络丢包导致镜像损坏
用 Skopeo 实现轻量级跨仓搬运
适合无 Harbor、或需要灵活调度、临时补位的场景,尤其适合 CI/CD 流水线集成:
- 安装 Skopeo 1.0+ 版本(CentOS 7 默认 yum 源版本太旧,需从 obs://devel:kubic 或官方 RPM 安装)
- 单条命令完成同步:
skopeo copy --src-creds user:pass --dest-creds admin:token docker://reg-a.com/app:v1.2.0 docker://reg-b.com/app:v1.2.0 - 加
--all参数可同步多架构镜像(如同时含 amd64 和 arm64 层) - 脚本中建议先比对 manifest digest:
skopeo inspect docker://reg-a.com/app:v1.2.0 | jq -r .Digest,仅当摘要变化时才执行 copy,避免无效传输
用 gh_mirrors/do/dockerfiles 构建可审计同步链路
适合强调版本可追溯、GitOps 驱动、多中心协同构建的团队:
- 克隆仓库后,在 latest-versions.sh 中声明目标仓库列表(如
BK_REGISTRY="bj-registry.local sh-registry.local") - 每个服务目录(如 znc/)自带 Dockerfile 和构建逻辑,运行
./run.sh --sync znc即自动构建→打标→推送全链路 - 所有同步动作都由 Git 提交触发,commit hash 就是同步凭证,配合
shellcheck.sh --report可生成每日同步快照供巡检 - 利用
make build-znc --no-cache跳过未变更层,节省带宽和时间
同步前必须确认的基础项
再好的同步机制也跑不赢底层缺陷:
- 所有中心仓库必须启用 HTTPS,Docker daemon 的
insecure-registries配置仅限测试环境——生产环境禁用 - 网络连通性要达标:两地 Harbor 间 RTT 建议 50Mbps,否则大镜像同步会超时失败
- 统一采用不可变标签策略,推荐内容哈希标签(如
sha256:abc123...)或时间戳标签(如v1.2.0-20260709),杜绝latest覆盖引发的版本漂移











