chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何把Docker Registry遷移到Harbor

馬哥Linux運維 ? 來源:K8sMeetup社區(qū) ? 作者:木子 ? 2021-09-07 16:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

“要如何將 docker registry 中的鏡像遷移至 harbor?本文介紹了四種具體的思路和想法供大家參考。

Registry

Docker Distribution

Docker Distribution 是第一個是實現(xiàn)了打包、發(fā)布、存儲和鏡像分發(fā)的工具,起到 docker registry 的作用。(目前 Distribution 已經(jīng)捐贈給了 CNCF)。其中 Docker Distribution 中的 spec 規(guī)范后來也就成為了 OCI distribution-spec 規(guī)范??梢哉J(rèn)為 Docker Distribution 實現(xiàn)了大部分 OCI 鏡像分發(fā)的規(guī)范,二者在很大程度上也是兼容的。OCI 的指導(dǎo)思想時先有工業(yè)界的實踐,再將這些實踐總結(jié)成技術(shù)規(guī)范,因此盡管 OCI 的 distribution-spec 規(guī)范還沒有正式發(fā)布(目前版本是 v1.0.0-rc1),但以 Docker Distribution 作為基礎(chǔ)的鏡像倉庫已經(jīng)成為普遍采用的方案,docker registry http api v2 也就成為了事實上的標(biāo)準(zhǔn)。

Harborharbor 也是采用了 Docker Distribution (docker registry)作為后端鏡像存儲服務(wù),在 harbor 2.0 之前的版本,鏡像相關(guān)的功能大部分是由 Docker Distribution 來處理,鏡像和 OCI 等制品的元數(shù)據(jù)是 harbor 組件從 docker registry 中提取出來的;harbor 在 2.0 版本之后,鏡像等 OCI 制品相關(guān)的元數(shù)據(jù)由 harbor 自己來維護(hù),而且元數(shù)據(jù)是在 PUSH 這些制品時寫入到 harbor 的數(shù)據(jù)庫中的。正因得益于此,harbor 不再僅僅是個用來存儲和管理鏡像的服務(wù),而一個云原生倉庫服務(wù),能夠存儲和管理符合 OCI 規(guī)范的 Helm Chart、CNAB、OPA Bundle 等多種 Artifact。Docker Registry to Harbor回到本文主題:如何將 docker registry 中的鏡像遷移至 harbor?

假如內(nèi)網(wǎng)環(huán)境中有兩臺機器,一臺機器上運行著 docker registry,域名假設(shè)為 registry.k8s.li 。另一臺機器運行著 harbor,假設(shè)域名為 harbor.k8s.li?,F(xiàn)在 docker registry 中存放了五千個鏡像。harbor 是剛剛部署的,里面還沒有鏡像。在磁盤和網(wǎng)絡(luò)沒有限制的情況下,如何高效地將 docker registry 中的鏡像遷移到 harbor 中呢?

獲取 Registry 所有鏡像的列表

首先在遷移之前我們要獲取一份 docker registry 中鏡像的列表,這樣我們才能保證遷移后沒有鏡像丟失。根據(jù)《 深入淺出容器鏡像的一生》一文中提到的 registry 的存儲目錄結(jié)構(gòu)。在 registry 存儲目錄中,每個鏡像的 tag 都是由 current/index 這個文件指向該 tag 鏡像的 manifests 文件的,由此我們可以通過遍歷 registry 存儲目錄中 current/index 文件的方式來得到所有鏡像的 tag,由此得到該 registry 中所有鏡像的列表。注意,這樣只能得到有 tag 的鏡像,其他沒 tag 的鏡像無法獲取到。

可通過如下命令在 registry 存儲目錄下獲取鏡像列表:

Harbor 創(chuàng)建 project

對于新部署的 harbor 來說,上面只會有一個默認(rèn)的 library 的 project,需要手動在 harbor 上創(chuàng)建 docker registry 中對應(yīng)的 project。docker registry 中鏡像的 project 就是 registry 存儲目錄中 repositories 下的目錄名。

得到了鏡像列表,以及在 harbor 上完成了對應(yīng) project 的創(chuàng)建,我們就可以做正式的遷移工作啦。根據(jù)不同的場景,可使用如下幾種方案:

方案一:docker retag

方案一可能是大多數(shù)人首先想到的辦法,也是最簡單粗暴的方法。就是在一臺機器上使用 docker pull 下 docker registry 中的所有鏡像,然后再 docker retag 一下,再 docker push 到 harbor 中。

如果之前看過我寫的《深入淺出容器鏡像的一生》和 《鏡像搬運工 skopeo 初體驗》,并且已經(jīng)在日常生活中使用 skopeo ,一定會覺得這并不是個聰明的方案,因為 docker pull –》 docker tag –》 docker pull 的過程中會對鏡像的 layer 進(jìn)行解壓縮。對于只是將鏡像從一個 registry 復(fù)制到另一個 registry 來說,這些 docker 在這些過程中做了很多無用功。詳細(xì)的原理可以參考上述兩篇文章,在此不再贅述。

為了追求高效,我們不使用 docker retag 方案,下面看一下方案二:

方案二:skopeo

在《鏡像搬運工 skopeo 初體驗》一文中介紹過可以使用 skopeo copy 直接從一個 registry 中復(fù)制鏡像原始 blobs 到另一個 registry 中,在此期間不會涉及鏡像 layer 解壓縮操作。在性能和耗時兩個角度上,都比使用 docker 的方式高效很多。

使用 skopeo copy

使用 skopeo sync

無論是 docker 和 skopeo 本質(zhì)上都是通過 registry 的 HTTP API 下載和上傳鏡像的,在這過程中還是多了不少 HTTP 請求的,如果走的是 HTTPS 的話,還涉及了 HTTPS 加密和解密的過程,這期間有很多無用功。那么還有沒有更好的辦法?

方案三:遷移存儲目錄

文章開頭提到 harbor 的后端鏡像存儲也是使用的 docker registry,對于一個 registry 來說,只要是使用的是 Docker Distribution V2 ,它后端的存儲目錄結(jié)構(gòu)都是一模一樣的。那為什么不直接將 registry 的存儲目錄打包復(fù)制并解壓到 harbor 的 registry 存儲目錄?這樣又能保證所有的鏡像都遷移過去,不會落下任何一個。

對于 harbor 1.x 版本來講,將 docker registry 的存儲目錄直接遷移到 harbor 的 registry 存儲目錄,然后刪除 harbor 的 redis 數(shù)據(jù)(因為 harbor 的 redis 緩存了鏡像的元數(shù)據(jù)信息),重啟 harbor 就好了。重啟 harbor 之后,harbor 會調(diào)用后端的 registry 去提取鏡像的元數(shù)據(jù)信息并存儲到 redis 中。這樣就完成了遷移的工作。在 docker registry 機器上備份 registry 存儲目錄

備份完成之后將 docker.tar scp 到 harbor 機器上,然后在 harbor 機器上恢復(fù) registry 存儲目錄

這樣遷移之后可能會遇到無法往 harbor push 鏡像的問題。因為 docker registry 容器內(nèi) registry 存儲目錄的所屬和所屬組為 root,而 harbor registry 容器內(nèi) registry 存儲目錄的所屬和所屬組為 10000:10000,二者權(quán)限并不相同,會導(dǎo)致 harbor 無法 push 鏡像。因此在遷移完成之后需要修改一下 harbor registry 目錄的所屬和所屬組。

方案四

對于 harbor 2.x 來講,由于 harbor 強化了 Artifact 的元數(shù)據(jù)管理能力,即元數(shù)據(jù)要在 push 或者 sync 到 harbor 時寫入到 harbor 自身的數(shù)據(jù)庫中。在 harbor 看來只要數(shù)據(jù)庫中沒有這個 Artifact 的 manifest 信息或者沒有這一層 layer 的信息,harbor 都會認(rèn)為該 Artifact 或者 layer 不存在,返回 404 的錯誤。按照方案三直接而將 docker registry 存儲目錄解壓到 harbor 的 registry 存儲目錄的方法行不通的。因為是將鏡像解壓到 registry 存儲中的,雖然在 harbor 的 registry 容器看來是有鏡像的,但因為 harbor 的數(shù)據(jù)庫中沒有鏡像,harbor 就會認(rèn)為沒有鏡像。那么現(xiàn)在看來只能通過方案二使用 skopeo 將鏡像一個一個地 push 到 harbor 中了。

但對于某些特定的場景下,不能像方案二那樣擁有一個 docker registry 的 HTTP 服務(wù),只有一個 docker registry 的壓縮包,這如何將 docker registry 的存儲目錄中的鏡像遷移到 harbor 2.0 中呢?在《鏡像搬運工 skopeo 初體驗》中提到過 skopeo 支持的鏡像格式有如下幾種:

44144e54-0fb2-11ec-8fb8-12bb97331649.png

需要注意的是,這幾種鏡像的名字,對應(yīng)著鏡像存在的方式,不同存在的方式對鏡像的 layer 處理的方式也不一樣,比如 docker:// 這種方式是存在 registry 上的;docker-daemon: 是存在本地 docker pull 下來的;再比如 docker-archive 是通過 docker save 出來的鏡像;而 dir: 是鏡像以文件夾的形式保存的。同一個鏡像有這幾種存在的方式就像水有氣體、液體、固體一樣??梢赃@樣去理解,他們表述的都是同一個鏡像,只不過是存在的方式不一樣而已。既然鏡像是存放在 registry 存儲目錄里的,那么使用 dir 的形式直接從文件系統(tǒng)讀取鏡像,理論上來講會比方案二要好一些。雖然 skopeo 支持 dir 格式的鏡像,但 skopeo 目前并不支持直接使用 registry 的存儲目錄,所以還是需要想辦法將 docker registry 存儲目錄里的每一個鏡像轉(zhuǎn)換成 skopeo dir 的形式。skopeo dir那么先來看一下 skopeo dir 是什么樣子的?為了方便測試方案的可行性,先使用 skopeo 命令先從 docker hub 上拉取一個鏡像,并保存為 dir,命令如下:

使用 tree 命令查看一下 alpine 文件夾的目錄結(jié)構(gòu),如下:

從文件名和大小以及文件的內(nèi)省我們可以判斷出,manifest 文件對應(yīng)的就是鏡像的 manifests 文件;類型為 ASCII text 的文件正是鏡像的 image config 文件,里面包含著鏡像的元數(shù)據(jù)信息。而另一個 gzip compressed data 文件不就是經(jīng)過 gzip 壓縮過的鏡像 layer 嘛??匆幌?manifest 文件的內(nèi)容也再次印證了這個結(jié)論:

鏡像的 config 字段對應(yīng)的正是 e50c909a8df2,而文件類型正是 image.v1+json 文本文件。

鏡像的 layer 字段對應(yīng)的也正是 4c0d98bf9879 而文件類型正是 .tar.gzip gzip 壓縮文件。

從 registry 存儲目錄中撈鏡像出來接下來到本文的較為精彩的地方了。如何從 registry 存儲里“撈”鏡像出來,轉(zhuǎn)換成 skopeo 所支持的 dir 格式。

首先要得到鏡像的 manifests 文件,從 manifests 文件中可以得到該鏡像的所有 blob 文件。例如對于 registry 存儲目錄中的 library/alpine:latest 鏡像來講,它在 registry 中是這樣存放的:

1.通過 repositories/library/alpine/_manifests/tags/latest/current/link 文件得到 alpine 鏡像 lasts 這個 tag 的 manifests 文件的 sha256 值,然后根據(jù)這個 sha256 值去 blobs 找到鏡像的 manifests 文件;2.根據(jù) current/link 文件中的 sha256 值在 blobs 目錄下找到與之對應(yīng)的文件,blobs 目錄下對應(yīng)的 manifests 文件為 blobs/sha256/39/39eda93d15866957feaee28f8fc5adb545276a64147445c64992ef69804dbf01/data;

3.使用正則匹配,過濾出 manifests 文件中的所有 sha256 值,這些 sha256 值就對應(yīng)著 blobs 目錄下的 image config 文件和 image layer 文件;

4.根據(jù) manifests 文件就可以得到 blobs 目錄中鏡像的所有 layer 和 image config 文件,然后將這些文件拼成一個 dir 格式的鏡像,在這里使用 cp 的方式將鏡像從 registry 存儲目錄里復(fù)制出來,過程如下:

最終得到的鏡像格式如下:

和上面的 skopeo copy 出來的 dir 文件夾對比一下,除了一個無關(guān)緊要的 version 文件,其他的都一摸一樣。5.再優(yōu)化一下,將步驟 4 中的 cp 操作修改成硬鏈接操作,能極大減少磁盤的 IO 操作。需要注意:硬鏈接文件不能跨分區(qū),所以要和 registry 存儲目錄在同一個分區(qū)下才行。

然后使用 skopeo copy 或者 skopeo sync 將撈出來的鏡像 push 到 harbor

使用 skopeo copy

使用 skopeo sync 需要注意的是,skopeo sync 的方式是同步 project 級別的,鏡像的 name 和 tag 就對應(yīng)的是目錄的名稱

實現(xiàn)腳本

其實修改一下 skopeo 的源碼應(yīng)該也是可以無縫支持 registry 存儲目錄的。

對比

45424830-0fb2-11ec-8fb8-12bb97331649.png

對比總結(jié)一下以上幾種方案:

方案一:上手成本低,適用于鏡像數(shù)量比較多少,無需安裝 skopeo 的情況,缺點是性能較差;

方案二:適用于兩個 registry 之間同步復(fù)制鏡像,如將 docker hub 中的一些公共鏡像復(fù)制到公司內(nèi)網(wǎng)的鏡像倉庫中。

方案三:適用于鏡像倉庫之間進(jìn)行遷移,性能是所有方案里最好的,需要額外注意的是如果目的鏡像倉庫是 harbor 2.x,是無法使用這種方式的。

方案四:是方案三的妥協(xié)版,為了適配 harbor 2.0 ,因為需要重新將鏡像 push 到 harbor ,所以性能上要比方案三差一些。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4940

    瀏覽量

    73074
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    526

    瀏覽量

    13988

原文標(biāo)題:4 種方法將 Docker Registry 遷移至 Harbor

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    無質(zhì)量損失的數(shù)據(jù)遷移:Nikon SLM Solutions信賴3Dfindit企業(yè)版

    使用轉(zhuǎn)換器將CAD數(shù)據(jù)從一個系統(tǒng)傳輸?shù)搅硪粋€系統(tǒng),但這往往會導(dǎo)致數(shù)據(jù)的質(zhì)量下降。因此,該公司決定使用3Dfindit企業(yè)版將CAD數(shù)據(jù)遷移到新系統(tǒng),便不會造成任何質(zhì)量損失。這樣,在保持最高數(shù)據(jù)質(zhì)量
    發(fā)表于 11-25 10:06

    如何在Keil中將NuMicro BSP從Arm編譯器5遷移到編譯器6?

    在Keil中將NuMicro BSP從Arm編譯器5遷移到編譯器6!
    發(fā)表于 08-20 06:29

    干貨分享 | RK3588 Ubuntu系統(tǒng)Docker容器使用指南

    前言:在瑞芯微RK3588高性能AIoT平臺上運行Ubuntu系統(tǒng)時,Docker容器技術(shù)能極大提升開發(fā)部署效率。通過輕量級虛擬化實現(xiàn)環(huán)境隔離與快速遷移,本文將從零開始詳解RK3588平臺
    的頭像 發(fā)表于 06-27 12:01 ?3080次閱讀
    干貨分享 | RK3588 Ubuntu系統(tǒng)<b class='flag-5'>Docker</b>容器使用指南

    docker無法啟用怎么解決?

    mengxing@mengxing-virtual-machine:/etc/docker$ sudo systemctl daemon-reload
    發(fā)表于 06-23 07:17

    Docker Volume管理命令大全

    Docker Volume管理命令大全
    的頭像 發(fā)表于 05-28 17:14 ?596次閱讀

    從Keil MDK到IAR EWARM:通過工程遷移實現(xiàn)項目資產(chǎn)的更好管理

    對于需要統(tǒng)一開發(fā)環(huán)境或涉及多核架構(gòu)(如Cortex-A/R)的項目,越來越多的用戶選擇從Keil MDK遷移到IAR EWARM。這就會面臨著需要將之前的Keil MDK工程遷移到IAR EWARM的問題。本文將介紹如何高效完成這一遷移
    的頭像 發(fā)表于 05-08 09:03 ?981次閱讀
    從Keil MDK到IAR EWARM:通過工程<b class='flag-5'>遷移</b>實現(xiàn)項目資產(chǎn)的更好管理

    Docker Compose的常用命令

    大家好,今天給大家分享Docker Compose的常用命令,以及docker-compose文件的屬性。Docker Compose 是一個用于定義和運行多容器 Docker 應(yīng)用應(yīng)
    的頭像 發(fā)表于 04-30 13:40 ?909次閱讀

    Docker常用命令大全

    Docker 是一種開源的應(yīng)用容器引擎,廣泛應(yīng)用于開發(fā)、部署和運行分布式應(yīng)用。掌握 Docker 常用命令對于開發(fā)人員和運維人員來說非常重要。本文將為大家整理常用的Docker 命令,并按照功能分為多個部分,幫助你高效使用
    的頭像 發(fā)表于 04-22 12:47 ?666次閱讀

    【技術(shù)案例】Android in Docker

    Docker介紹Docker是一個開源的容器化平臺,用于打包、分發(fā)和運行應(yīng)用程序。它通過將應(yīng)用及其所有依賴打包到獨立的容器中,確保應(yīng)用在不同環(huán)境中一致運行。Docker提供快速部署、隔離性強和高效
    的頭像 發(fā)表于 04-02 16:33 ?1433次閱讀
    【技術(shù)案例】Android in <b class='flag-5'>Docker</b>

    請問將項目從RT1024遷移到RT1064的最快方法是什么?

    我正在將我的項目從基于 RT1024 遷移到基于 RT1064 的下一代產(chǎn)品,是否有快速的方法,或者我只能手動完成? 謝謝!
    發(fā)表于 03-31 06:15

    基于Docker鏡像逆向生成Dockerfile

    在本文中, 我們將通過理解Docker鏡像如何存儲數(shù)據(jù), 以及如何使用工具查看鏡像方方面面的信息來逆向工程一個Docker鏡像; 以及如何使用Python的Docker API來構(gòu)建一個類似Dedockify的工具來創(chuàng)建Dock
    的頭像 發(fā)表于 03-10 09:45 ?1198次閱讀
    基于<b class='flag-5'>Docker</b>鏡像逆向生成Dockerfile

    如何將項目從IAR遷移到Embedded Studio

    本文描述如何將IAR EWARM項目遷移到SEGGER Embedded Studio(簡稱SES)中。
    的頭像 發(fā)表于 02-25 17:11 ?1030次閱讀
    如何將項目從IAR<b class='flag-5'>遷移到</b>Embedded Studio

    Flexusx 實例與 Harbor 私有鏡像倉庫的完美結(jié)合

    。Harbor 作為領(lǐng)先的私有鏡像倉庫,與 Flexus X 完美結(jié)合,助力企業(yè)輕松管理 Docker 鏡像,確保應(yīng)用部署的安全與高效。828 特惠期間,選擇 Flexus X + Harbor,不僅享受
    的頭像 發(fā)表于 01-22 18:04 ?630次閱讀
    Flexusx 實例與 <b class='flag-5'>Harbor</b> 私有鏡像倉庫的完美結(jié)合

    云服務(wù)器 Flexus X 實例,Docker 集成搭建 NGINX

    Docker 集成搭建 NGINX 1、購買華為云 Flexus X 實例 Flexus云服務(wù)器X實例-華為云 (huaweicloud.com) ? 2、docker 安裝 yum?install
    的頭像 發(fā)表于 01-13 11:09 ?1219次閱讀
    云服務(wù)器 Flexus X 實例,<b class='flag-5'>Docker</b> 集成搭建 NGINX

    龍智直播預(yù)告:揭示現(xiàn)代化數(shù)據(jù)管理與版本控制優(yōu)勢、從SVN遷移到Helix Core的實踐指導(dǎo)、遷移步驟等

    2025年1月9日(周四)14:00-14:45,Perforce中國授權(quán)合作伙伴-龍智將在線直播,分享為何您的傳統(tǒng)數(shù)據(jù)管理與版本控制系統(tǒng)需要升級、Perforce Helix Core的顯著優(yōu)勢,以及如何遷移到Helix Core等實用見解,以為您的數(shù)據(jù)管理與版本控制系統(tǒng)現(xiàn)代化轉(zhuǎn)型提供有力支持。
    的頭像 發(fā)表于 12-16 15:35 ?620次閱讀
    龍智直播預(yù)告:揭示現(xiàn)代化數(shù)據(jù)管理與版本控制優(yōu)勢、從SVN<b class='flag-5'>遷移到</b>Helix Core的實踐指導(dǎo)、<b class='flag-5'>遷移</b>步驟等