• 热门
  • 基础
  • 数据库
  • 安全
  • 大数据
  • 人工智能
  • 混合云
  • 开发与运维
  • 企业应用

应用服务

行业引擎

全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

使用image-syncer迁移容器镜像

最近更新时间:2024-11-27 14:06:25

背景描述

在当今的云计算环境中,用户经常会同时使用公有云镜像仓库和自建仓库,或是多家公有云镜像仓库。这种多元化的使用场景会带来跨平台镜像迁移或同步的需求。迁移过程中,当处理数量较少的镜像任务时,使用命令行迁移即可解决问题。但如果涉及成千上百个镜像,几T的镜像仓库数据时,迁移过程会非常漫长,且存在数据丢失的风险。这时,用户可以使用开源镜像迁移工具image-syncer来处理该任务。

image-syncer功能特点

  • 支持多对多镜像仓库同步

  • 支持基于 Docker Registry V2 搭建的镜像仓库服务 (如 Docker Hub、 Quay、金山云容器镜像服务 KCR、 Harbor 等)

  • 镜像同步过程只经过内存和网络,不依赖磁盘存储,同步速度快

  • 自动增量同步, 自动忽略已同步且不需要修改的镜像

  • 支持镜像层级别的并发同步,可以通过配置文件调整并发数(同一时间在同步的镜像层数量上限)

  • 自动重试失败的同步任务,可以解决大部分镜像同步中的偶发问题(限流、网络抖动),支持重试次数配置

  • 简单轻量,不依赖 docker 以及其他程序

详情请参见 image-syncer

使用前提

保证image-syncer的运行环境与需要同步的registry网络连通。

操作步骤

1.下载和安装

下载image-syncer到执行机上,解压并运行工具。

以v1.3.1版本为例,您也可以选择其他版本。

wget https://github.com/AliyunContainerService/image-syncer/releases/download/v1.3.1/image-syncer-v1.3.1-linux-amd64.tar.gz
tar -zvxf image-syncer-v1.3.1-linux-amd64.tar.gz

2.认证信息配置

创建镜像仓库的认证信息文件auth.yamlauth.json,认证信息文件通过 --auth 参数传入。

1、通常镜像源仓库需要具有 pull 以及访问 tags 权限,镜像目标仓库需要拥有 push 以及创建仓库权限;如果对应仓库没有提供认证信息,则默认匿名访问。
2、认证信息中可以同时描述多个 registry(或者 registry/namespace)对象,一个对象可以包含账号和密码。

image-syncer支持基于Docker Registry V2搭建的docker镜像仓库,按格式填写即可。将源仓库及目标仓库认证信息写入,auth.yaml内容示例如下:

quay.io: #支持 "registry" 和 "registry/namespace"(v1.0.3之后的版本) 的形式,image-syncer 会自动为镜像同步规则中的每个源/目标 url 查找认证信息,并且使用对应认证信息进行进行访问,如果匹配到了多个,用“最长匹配”的那个作为最终结果
  username: xxx
  password: xxxxxxxxx
  insecure: true # 可选,(v1.0.1 之后支持)registry是否是http服务,如果是,insecure 字段需要为 true,默认是 false
registry.ksyunkcr.com:
  username: xxx # 可选,(v1.3.1 之后支持)value 使用 "${env}" 或者 "$env" 形式可以引用环境变量
  password: xxxxxxxxx # 可选,(v1.3.1 之后支持)value 使用 "${env}" 或者 "$env" 类型的字符串可以引用环境变量
docker.io:
  username: "${env}"
  password: "$env"
quay.io/coreos:
  username: abc
  password: xxxxxxxxx
  insecure: true

3. 同步规则配置

创建同步镜像描述文件images.jsonimages.yaml,镜像同步规则文件以 --images 参数传入。

每条镜像同步规则为一个 “源镜像 url: 目标镜像 url” 的键值对。无论是源镜像 url 还是目标镜像 url,字符串格式都和 docker pull 命令所使用的镜像 url 大致相同(registry/repository:tag、registry/repository@digest),但在 tag 和 digest 配置上和 docker pull 所使用的 url 存在区别,这里对整体逻辑进行描述:

  1. 源镜像 url、目标镜像 url 都不能为空

  2. 源镜像 url 不包含 tag 和 digest 时,代表同步源镜像 repository 中的所有镜像 tag

  3. 源镜像 url 可以包含一个或多个 tag,多个 tag 之间用英文逗号分隔,代表同步源镜像 repository 中的多个指定镜像 tag

  4. 源镜像 url 可以但最多只能包含一个 digest,此时如果目标镜像 url 包含 digest,digest 必须一致

  5. 源镜像 url 的 "tag" 可以是一个正则表达式,需要额外在首尾加上 / 字符作为标识,源镜像 repository 中所有匹配正则表达式的镜像 tag 会被同步,不支持多个正则表达式

  6. 目标镜像 url 可以不包含 tag 和 digest,表示所有需同步的镜像保持其镜像 tag 或者 digest 不变

  7. 目标镜像 url 可以包含多个 tag 或者 digest,数量必须与源镜像 url 中的 tag 数量相同,此时,同步后的镜像 tag 会被修改成目标镜像 url 中指定的镜像 tag(按照从左到右顺序对应)

  8. 支持同时指定多个目标镜像 url,此时 "目标镜像 url" 为数组的形式,数组的每个元素(字符串)都需要满足前面的规则

images.yaml内容示例如下:

quay.io/coreos/kube-rbac-proxy: registry.ksyunkcr.com/namespace/repository
quay.io/coreos/kube-rbac-proxy:v1.0: quay.io/ruohe/kube-rbac-proxy
quay.io/coreos/kube-rbac-proxy:v1.0,v2.0: quay.io/ruohe/kube-rbac-proxy
quay.io/coreos/kube-rbac-proxy@sha256:14b267eb38aa85fd12d0e168fffa2d8a6187ac53a14a0212b0d4fce8d729598c: quay.io/ruohe/kube-rbac-proxy
quay.io/coreos/kube-rbac-proxy:v1.1:
  - quay.io/ruohe/kube-rbac-proxy1
  - quay.io/ruohe/kube-rbac-proxy2
quay.io/coreos/kube-rbac-proxy:/a+/: quay.io/ruohe/kube-rbac-proxy

4.执行镜像迁移

执行镜像迁移命令,代码示例如下:

# 获得帮助信息
./image-syncer -h

./image-syncer --auth=./auth.yaml --images=./images.yaml --retries=3 --log=./log
更多参数

image-syncer 的使用比较简单,但同时也支持多个命令行参数的指定:

参数

说明

--help

使用说明,会打印出一些启动参数的当前默认值.

--config

设置用户提供的配置文件路径,使用之前需要创建此文件,默认为当前工作目录下的config.json文件。这个参数与 --auth和--images 的作用相同,分解成两个参数可以更好地区分认证信息与镜像仓库同步规则。建议使用 --auth 和 --images.

--images

设置用户提供的镜像同步规则文件所在路径,使用之前需要创建此文件,默认为当前工作目录下的images.json文件

--auth

设置用户提供的认证文件所在路径,使用之前需要创建此认证文件,默认为当前工作目录下的auth.json文件

--log

打印出来的log文件路径,默认打印到标准错误输出,如果将日志打印到文件将不会有命令行输出,此时需要通过cat对应的日志文件查看

--namespace

设置默认的目标namespace,当配置文件内一条images规则的目标仓库为空,并且默认registry也不为空时有效,可以通过环境变量DEFAULT_NAMESPACE设置,同时传入命令行参数会优先使用命令行参数值。

--proc

并发数,进行镜像同步的并发goroutine数量,默认为5

--retries

失败同步任务的重试次数,默认为2,重试会在所有任务都被执行一遍之后开始,并且也会重新尝试对应次数生成失败任务的生成。一些偶尔出现的网络错误比如io timeout、TLS handshake timeout,都可以通过设置重试次数来减少失败的任务数量

--os

用来过滤源 tag 的 os 列表,为空则没有任何过滤要求,只对非 docker v2 schema1 media 类型的镜像格式有效

--arch

用来过滤源 tag 的 architecture 列表,为空则没有任何过滤要求

--force

同步已经存在的、被忽略的镜像,这个操作会更新已存在镜像的时间戳

--registry

设置默认的目标registry,当配置文件内一条images规则的目标仓库为空,并且默认namespace也不为空时有效,可以通过环境变量DEFAULT_REGISTRY设置,同时传入命令行参数会优先使用命令行参数值。

5.查看迁移镜像

迁移命令执行后,可登录目标镜像仓库,查看已迁移的镜像。

使用示例

该示例为镜像从KCR个人版实例迁移到KCR企业版实例的过程演示。

  1. 下载image-syncer到执行机上,解压并运行工具。

wget https://github.com/AliyunContainerService/image-syncer/releases/download/v1.3.1/image-syncer-v1.3.1-linux-amd64.tar.gz
tar -zvxf image-syncer-v1.3.1-linux-amd64.tar.gz
  1. 创建镜像仓库的认证信息文件auth.yaml。

registry.ksyunkcr.com:
  username: zhouhanjing # KCR企业版仓库用户名
  password: abcdef1234567 # KCR企业版仓库密码
hub.kce.ksyun.com:
  username: zhouhanjing #KCR个人版仓库用户名
  password: 12345678 #KCR个人版仓库密码
  1. 创建同步镜像描述文件images.yaml

# KCR个人版仓库访问域名/命名空间/仓库 : KCR企业版仓库访问域名/命名空间/仓库
hub.kce.ksyun.com/nszhj/repozhj: registry.ksyunkcr.com/namespace/repository
  1. 执行如下命令将镜像从KCR个人版实例迁移至KCR企业版实例。

./image-syncer --auth=./auth.yaml --images=./images.yaml --retries=3 --log=./log
  1. 迁移命令执行后,可登录KCR企业版仓库,查看已迁移的镜像。

纯净模式常规模式

纯净模式

点击可全屏预览文档内容

鼠标选中内容,快速反馈问题

如果在文档使用中出现问题,可选中有问题的部分进行快速反馈,我们将跟进处理。
不再提示
好的,我知道了

聆听反馈