15.9.5 镜像同步与分发策略
在多环境与多地域场景下,镜像同步与分发的目标是保证版本一致、可追溯、分发高效且具备可控的变更窗口。常见模式包括中心仓库向边缘仓库的单向同步、双活仓库的双向同步、以及按项目或命名空间的分区分发。应根据网络条件、业务发布频率、镜像体量与安全合规要求选择合适策略。
原理草图(同步与分发架构)
同步策略设计要点#
- 中心化分发:核心仓库为唯一源,边缘仓库定时同步,适用于统一审核。
- 多活双向同步:跨地域协作,需解决冲突与版本优先级,建议设置版本冻结窗口与标签保护。
- 按需拉取 + 预热:首次使用再拉取镜像,结合缓存预热降低冷启动。
- 分层同步:基础镜像低频更新,业务镜像高频更新,提高传输效率。
版本与标签分发规则#
- 仅同步符合规则标签(如
v*、release-*),避免latest不可追溯。 - 生产环境只允许同步通过安全扫描与签名验证的镜像。
- 对关键镜像使用 digest 固定版本,确保一致性。
安装与准备(以 Harbor 2.x 为例)#
目标:部署两套 Harbor,用于同步演示(A→B)。
# 1) 准备环境(两台服务器均执行)
sudo mkdir -p /data/harbor
sudo tar -xf harbor-offline-installer-v2.8.0.tgz -C /data/harbor
# 2) 配置 harbor.yml(每台机器不同 hostname)
cd /data/harbor/harbor
cp harbor.yml.tmpl harbor.yml
sudo sed -i 's/hostname: reg.mydomain.com/hostname: harbor-a.example.com/' harbor.yml
sudo sed -i 's/harbor_admin_password: Harbor12345/harbor_admin_password: StrongPassw0rd!/' harbor.yml
# 3) 安装启动
sudo ./install.sh --with-trivy
# 预期效果:访问 https://harbor-a.example.com 可登录 Web 控制台
命令解释:
- harbor.yml 中 hostname 必须与证书域名一致,否则客户端拉取会报证书错误。
- --with-trivy 启用漏洞扫描,便于生产环境同步前校验。
同步规则配置示例(Harbor 复制)#
场景:Harbor-A 同步 project-x 到 Harbor-B,仅同步 v* 标签。
1)在 Harbor-A 添加目标 Registry(Harbor-B)
2)创建复制规则,方向为 pull 或 push
示例字段(关键参数说明):
目标Registry: harbor-b.example.com
方向: push
资源过滤: project-x
标签过滤: v*
触发: 定时 (每 10 分钟)
命令行同步与分发示例(Skopeo 增量复制)#
适用于:跨环境同步、离线镜像搬运。
# 安装 skopeo(以 CentOS 为例)
sudo yum install -y skopeo
# 从 Harbor-A 复制到 Harbor-B
skopeo copy \
--src-creds admin:StrongPassw0rd! \
--dest-creds admin:StrongPassw0rd! \
docker://harbor-a.example.com/project-x/app:v1.2.3 \
docker://harbor-b.example.com/project-x/app:v1.2.3
# 预期效果:Harbor-B 中出现 project-x/app:v1.2.3
命令解释:
- skopeo copy 不需要本地 docker daemon,可在跳板机执行。
- docker:// 表示使用 registry API 进行镜像复制。
预热与缓存加速(Docker Registry Mirror)#
节点侧配置:减少跨地域拉取耗时。
# /etc/docker/daemon.json
{
"registry-mirrors": [
"https://harbor-b.example.com"
],
"insecure-registries": []
}
# 重启 Docker
sudo systemctl restart docker
# 预期效果:拉取镜像优先命中 Harbor-B
故障排查清单#
1)证书错误
docker login harbor-a.example.com
# 报错:x509: certificate signed by unknown authority
# 处理:将 CA 证书放到 /etc/docker/certs.d/harbor-a.example.com/ca.crt
2)同步失败/标签不见
# 检查复制规则是否过滤了标签
# 确认目标项目是否存在,并有写入权限
3)拉取慢/超时
# 检查镜像大小与网络
ping harbor-b.example.com
# 建议:启用镜像分层与缓存预热
演练与练习#
1)搭建 Harbor-A 和 Harbor-B,创建 project-x,推送一个镜像并配置定时同步。
2)使用 skopeo 将 v1.0.0 镜像复制到 B,验证 digest 一致。
3)配置 Docker 节点镜像加速并测试拉取速度对比。
练习验证命令:
# 获取镜像摘要
docker pull harbor-b.example.com/project-x/app:v1.0.0
docker images --digests | grep app
# 预期:digest 与 Harbor-A 一致
运维流程建议#
- 同步策略与 CI/CD 联动:构建后自动推送并同步。
- 同步行为记录审计:来源、摘要、操作者、时间。
- 定期清理过期镜像并评估热度,控制存储成本。