容器镜像迁移怎么做,流程操作是什么

Admin 2022-08-19 群英技术资讯 240 次浏览

关于“容器镜像迁移怎么做,流程操作是什么”的知识有一些人不是很理解,对此小编给大家总结了相关内容,具有一定的参考借鉴价值,而且易于学习与理解,希望能对大家有所帮助,有这个方面学习需要的朋友就继续往下看吧。

最近因为基础设施调整,需要进行harbor 镜像仓库的迁移,主要是旧版本很老了,不想使用,直接
打算部署新的,原以为直接使用复制功能就可以,但是发现版本差异太大,直接失败,本打算使用中间
版本过度进行迁移,但是需要测试,好多功能,而且配置有点费事,尽管官方提供了升级说明,但是没敢
用,就怕出故障

  • rest api 请求流程
    还好harbor 提供了rest api,还算比较全,project , repo,tags, 因为harbor 的界面就是基于bff 模式开发
    的,所以直接通过查看web 的api 请求,直接可以方便的了解api 的请求流程。
  • 镜像迁移流程
    容器镜像的额复制功能在harbor早期版本(新版没有太多了解),实际上就是pull push
    所以我的处理方式:
    有两个harbor 服务:新的以及旧的,同时都配置了ssl 证书(可信)
    调用api 获取实际需要的docker image : 格式dockerimagehost/project/image:tag
    处理同步:
 
docker pull dockerimageold/project/image:tag
docker tag dockerimageold/project/image:tag dockerimagenew/project/image:tag
docker push dockerimagenew/project/image:tag

详细处理

为了简化同步,使用了管理员的权限,同时对于project 的权限,也是可以通过rest api 操作的

准备上边的同步shell

为了方便使用nodejs 开发

  • 项目准备
yarn init -y
  • 添加rest api 请求处理npm 包
yarn add node-fetch 
  • 添加npm scripts 并行处理npm 包
yarn add npm-run-all --dev 
  • 简单代码演示

    因为项目原因,只粘贴部分代码,如果后边有时间可以搞成一个通用的服务,同时演示的代码是固定project的,
    当然这样是有原因的,类似分治,可以方便问题project 单独快速处理

 
const fetch = require('node-fetch');
var project_images = []
// fetch project repos
fetch(`https://dockerimageold/api/repositories?project_id=projectid`, {
    method: 'GET',
    headers: {
        'Content-Type': 'application/json',
        "Authorization": "Basic base64username+password"
    }
}).then(res => res.json()).then(repos => {
    repos.forEach(repo => {
        setTimeout(() => {
            fetch(`https://dockerimageold/api/repositories/tags?repo_name=${repo}`, {
                    method: 'GET',
                    headers: {
                        'Content-Type': 'application/json'
                    }
                })
                .then(res => res.json())
                .then(tags => {
                    if (tags.length > 0) {
                        tags.forEach(tag => {
                                let imageinfo = {
                                    reponame: repo,
                                    oldimageinfo: `dockerimageold/${repo}:${tag}`,
                                    newimageinfo: `dockerimagenew/${repo}:${tag}`,
                                    repo_image: `${repo}:${tag}`
                                };
                                project_images.push(imageinfo)
                        });
                    }
                })
                .catch(err => {
                    console.log(repo)
                })
        }, 1000)
    })
})
setTimeout(() => {
    project_images.forEach(item => {
        pull_push_sh = `docker pull dockerimageold/${item.repo_image} && docker tag dockerimageold/${item.repo_image} dockerimagenew/${item.repo_image} && docker push dockerimagenew/${item.repo_image}`
        console.log(pull_push_sh)
    })
}, 10000)
  • 以上代码说明
    代码很简单,就是循环处理docker image,因为我们需要的也是docker image
  • npm script 添加
    为了方便project,快速生成使用了npm-run-all 可以并行以及串行,快速的生成,很灵活,配置如下:
 
"scripts": {
    "run-all":"npm-run-all remove:sh --parallel g:*",
    "remove:sh":"rm -rf sh/*",
    "g:activitycenter": "node activitycenter.js > sh/activitycenter.sh",
    "g:common": "node common.js > sh/common.sh",
    "g:coredns": "node coredns.js > sh/coredns.sh",
    "g:dalong": "node dalong.js > sh/dalong.sh",
    "g:demo-space": "node demo-space.js > sh/demo-space.sh",
    "g:demoapp": "node demoapp.js > sh/demoapp.sh",
    "g:droneci": "node droneci.js > sh/droneci.sh",
    "g:formbuilder": "node formbuilder.js > sh/formbuilder.sh",
    "g:gf-performance-bulletin": "node gf-performance-bulletin.js > sh/gf-performance-bulletin.sh",
    "g:gitbase": "node gitbase.js > sh/gitbase.sh",
    "g:graylog": "node graylog.js > sh/graylog.sh",
    "g:ingress-nginx": "node ingress-nginx.js > sh/ingress-nginx.sh",
    "g:itapiway": "node itapiway.js > sh/itapiway.sh",
    "g:java": "node java.js > sh/java.sh",
    "g:jenkins-docker": "node jenkins-docker.js > sh/jenkins-docker.sh",
    "g:jenkins": "node jenkins.js > sh/jenkins.sh",
    "g:jira": "node jira.js > sh/jira.sh"
  }

说明:
我没生成的使用都是执行 yarn run-all 但是为了保证数据都是新的,每次都先删除老的shell,重新生成,同时对于生成
是并行的,可以快速帮助我们生成shell

  • 项目结构
    项目结构大体如下:(我删除了部分)
 
├── README.md
├── code
├── activitycenter.js
├── app.js
├── common.js
├── coredns.js
├── dalong.js
├── demo-space.js
├── demoapp.js
├── droneci.js
├── formbuilder.js
├── gf-performance-bulletin.js
├── gitbase.js
├── graylog.js
├── ingress-nginx.js
├── itapiway.js
  .......
├── java.js
├── jenkins-docker.js
├── rhel7.js
├── sh
├── activitycenter.sh
├── common.sh
├── coredns.sh
├── dalong.sh
├── demo-space.sh
├── demoapp.sh
 ......
├── droneci.sh
├── formbuilder.sh
├── gf-performance-bulletin.sh
├── gitbase.sh
├── graylog.sh
├── ingress-nginx.sh
└── yarn.lock
└── run.sh
  • 一键式同步
    因为上边以及生成的单proejct 的同步shell,所以为了方便,外部有一个run.sh 的文件,可以批量执行同步,之后就是dns 记录的修改了
    新镜像使用以前的域名(这个需要重新生成安装,但是因为数据是使用了数据卷,没关系)
    代码如下:
 
#!/usr/bin/sh
for file in code/sh/*.sh; do
 ./$file
done

同步执行

很简单,我们只需要执行 sh run.sh 就可以了,注意shell 脚本需要添加执行权限

说明

对于用户、权限的额同步,以上没有列出来,但是我们也是可以调用rest api 处理的,而且上边的代码,部分是写死的,后边
找点时间重构下,搞成一个通用的工具,方便迁移

参考资料

https://github.com/goharbor/harbor 
https://github.com/mysticatea/npm-run-all 
https://github.com/bitinn/node-fetch


以上就是关于“容器镜像迁移怎么做,流程操作是什么”的相关知识,感谢各位的阅读,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注群英网络,小编每天都会为大家更新不同的知识。
群英智防CDN,智能加速解决方案
标签: 容器镜像迁移

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

猜你喜欢

成为群英会员,开启智能安全云计算之旅

立即注册
专业资深工程师驻守
7X24小时快速响应
一站式无忧技术支持
免费备案服务
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
在线客服
微信公众号
返回顶部
返回顶部 返回顶部
在线客服
在线客服