应用现状
随着容器化技术的发展,越来越多的企业使用容器代替了虚拟机完成应用的运行部署。目前许多企业选择自建Kubernetes集群,但是自建集群往往有着沉重的运维负担,需要运维人员自己配置管理系统和监控解决方案。企业自运维大批镜像资源,意味着要付出高昂的运维、人力、管理成本,且效率不高。
容器镜像服务支持Linux等多架构容器镜像托管。企业可以将镜像仓库迁移到容器镜像服务,节省运维成本。
如何把已有的镜像仓库平滑地迁移到容器镜像服务?这里将介绍2种常见的方案,用户可以根据自己的实际使用场景来选择。
迁移方案
随着
方案类型 | 适用场景 | 注意事项 |
---|---|---|
使用docker命令迁移镜像至SWR | 待迁移的镜像数量较少 | 依赖磁盘存储,需要及时进行本地镜像的清理,而且落盘形成多余的时间开销,难以胜任生产场景中大量镜像的迁移。 依赖docker 程序,docker daemon 对 pull/push 的并发数进行了严格的限制,没法进行高并发同步 一些功能只能经过HTTP api 进行操作,单纯使用 docker cli 没法做到,使脚本变得复杂 |
使用image-syncer迁移镜像至SWR | 待迁移的镜像数量庞大 | 支持多对多镜像仓库同步 支持基于Docker Registry V2 搭建的 docker 镜像仓库服务 (如 Docker Hub、 Quay、 Harbor等) 同步只通过内存和网络,不依赖磁盘存储,同步速度快 增量同步, 经过对同步过的镜像 blob 信息落盘,不重复同步已同步的镜像 并发同步,能够经过配置文件调整并发数Ÿ 自动重试失败的同步任务,能够解决大部分镜像同步中的网络抖动问题 不依赖docker 以及其余程序 |
使用docker命令迁移镜像至SWR
容器镜像服务提供了简便、易用的镜像托管和高效分发业务。当要迁移的镜像数量较少时,企业可以通过简单的docker pull、docker push命令行,将之前维护的镜像迁移到SWR上。
操作步骤:
步骤 1 从源仓库下载镜像。
使用docker pull 命令下载镜像。
示例:docker pull nginx:latest
使用docker images命令查看是否下载成功。
#docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx latest 22f2bf2e2b4f 5 hours ago 22.8MB
步骤 2 将步骤1中下载的镜像上传到SWR。
- 登录到目标端容器所在虚拟机,并登录SWR。详细步骤请参考客户端上传镜像。
- 给镜像打标签。
docker tag [镜像名称:版本名称] [镜像仓库地址]/[组织名称]/[镜像名称:版本名称]
示例:
docker tag nginx:v1 swr.cn-gz1.ctyun.cn/cloud-develop/nginx:v1
- 上传镜像至目标镜像仓库。
docker push [镜像仓库地址]/[组织名称]/[镜像名称:版本名称]
示例:
docker push swr.cn-gz1.ctyun.cn/cloud-develop/nginx:v1
- 终端显示如下信息,表明上传镜像成功。
The push refers to repository [swr.cn-gz1.ctyun.cn/cloud-develop/nginx:v1]fbce26647e70: Pushedfb04ab8effa8: Pushed8f736d52032f: Pushed009f1d338b57: Pushed678bbd796838: Pushedd1279c519351: Pushedf68ef921efae: Pushedv1: digest: sha256:0cdfc7910db531bfa7726de4c19ec556bc9190aad9bd3de93787e8bce3385f8d size: 1780
返回容器镜像服务控制台,在“我的镜像”页面,执行刷新操作后可查看到对应的镜像信息。
使用image-syncer迁移镜像至SWR
当我们处理数量较少的镜像迁移任务时,使用命令行迁移就可以解决这个问题。但是实际生产中涉及到成千上百个镜像,几T的镜像仓库数据时,迁移过程就变得耗时很是漫长,甚至丢失数据。这时,我们可以使用开源镜像迁移工具image-syncer来处理这个任务。
步骤 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.gztar -zvxf image-syncer-v1.3.1-linux-amd64.tar.gz
步骤 2 创建镜像仓库的认证信息文件auth.json。
image-syncer支持基于 Docker Registry V2 搭建的 docker 镜像仓库,按格式填写即可。
将源仓库及目标仓库认证信息写入,示例如下。
{
"swr.cn-gz1.ctyun.cn": {
"username": "cn-gz1@F1I3Q……",
"password": "2fd4c869ea0……"
},
"swr.cn-gz4.ctyun.cn": {
"username": "cn-gz4@4N3FA……",
"password": "f1c82b57855f9d35……"
}
}
username、password可以在登录命令中获取,获取方法如下:
登录SWR控制台,在右上角单击“登录指令”,在弹出的窗口中获取登录指令,如下图所示。
注意因安全性要求,以上示例中所有username和password均有部分内容进行省略,请以控制台获取到的实际用户名和密码为准。
步骤 3 创建同步镜像描述文件images.json。
如下示例,左边是源仓库的地址,右边是目的仓库地址。image-syncer还支持其他描述方式,详见官网说明。
{"swr.cn-north-4.myhuaweicloud.com/org-ss/canary-consumer": "swr.cn-east-3.myhuaweicloud.com/dev-container/canary-consumer"}
步骤 4 执行如下命令将镜像迁移至SWR。
./image-syncer --auth=./auth.json --images=./images.json --namespace=dev-container --registry=swr.cn-east-3.myhuaweicloud.com --retries=3 --log=./log
命令行参数说明。
参数 | 说明 |
---|---|
--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,都可以通过设置重试次数来减少失败的任务数量 |
--registry | 设置默认的目标registry,当配置文件内一条images规则的目标仓库为空,并且默认namespace也不为空时有效,可以通过环境变量DEFAULT_REGISTRY设置,同时传入命令行参数会优先使用命令行参数值 |
迁移命令执行后,可登录目标镜像仓库,查看已迁移的镜像。