久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Docker registryV2整體架構與啟動過程是怎樣的

243次閱讀
沒有評論

共計 2838 個字符,預計需要花費 8 分鐘才能閱讀完成。

這篇文章主要介紹“Docker registryV2 整體架構與啟動過程是怎樣的”,在日常操作中,相信很多人在 Docker registryV2 整體架構與啟動過程是怎樣的問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Docker registryV2 整體架構與啟動過程是怎樣的”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!

Docker registry 概述

用一句話解釋 Docker registry 就是:存放 docker image 的遠程倉庫。在使用 docker 的過程中,我們一定會用到 docker Registry,當我們使用 docker 的 pull 命令(下載鏡像),或者 run 一個本地沒有的鏡像時,docker engine 會從默認的倉庫下載對應的鏡像。

目前,docker pull 命令默認倉庫是 docker 的官方倉庫,這樣就導致一個問題,下載鏡像速度比較慢。所以在大型分布式 docker 集群中,通常都會配置一個私有的 docker registry,這樣能提高鏡像下載速度,從而提升應用的啟動速度;也方便管理鏡像。

docker registry 的安裝方式也很簡單,docker 公司已經把 registry 封裝在一個 docker 容器中了,我們只需要下載這個容器,然后啟動,就可以使用了,十分方便。但是,這樣啟動的方式,只能有一個 registry,在稍大一點的集群中,單點故障和性能瓶頸問題就比較突出了,擴展成高可用的分布式結構勢在必行,所以很多公司在優化 registry 方面做了很多工作,目前開源的有 VMware 的 Habor[1] 和京東的 speedy[2]。

Docker Registry 發展歷史

– 2013 年 3 月 13 日,docker 在 github 上有了第一個 release[3]
– 2013 年 7 月 3 日,docker 在 github 上發布了 docker registry v1[4]
– 2015 年 1 月 30 日,docker registry v2(項目名叫 docker distribution) 有了第一個 release,同時停止更新 docker registry v1[5]
 

在使用 docker registry v2 的時候需要注意,只有 docker1.6 以上版本才支持 registry v2,這并不意味著 1.6 以后只能用 v2 版本,我們從源代碼里可以看出,docker Engine 在下載鏡像的時候,會自動判斷遠端倉庫是 v1 還是 v2 版,從而使用不同的下載策略,這個策略可太重要了。下面我們就講一下 v1 和 v2 下載策略的區別。

 

圖 1 v1 版串行下載 layer

我們知道,一個 docker image 是由很多的 layer 組成的,registry v1 的下載過程如圖 1 所示,下載鏡像時也是以 layer 為最小單元下載的,在 v1 的時代 docker image,鏡像結構有一種鏈表一樣的組織,當下載完一個 layer 時,才能得到 parent 信息,然后再去下載 parent layer,這樣結構顯然效率不高,所以在 v2 中,改變了這種結構,在 image 的 manifest 文件中存儲了所有的 layer 信息,這樣拿到所有的 layer 信息,就可以并行下載了,提高了下載效率,過程如圖二所示。

 

圖二 v2 版升級為并行下載 layer
 

還有就是使用的開發語言也有改變,從 python 變成 go。

Docker registryV2 整體架構圖

 

圖 3 docker registry 2.0 架構圖 [6]
 

從架構圖上我們發現,registry v2 的架構還是很簡單的,它的核心是一個 web 服務器,從閱讀源碼也會發現,具體實現是用 go 語言的 net/http 包中的 http.Server,在 registry 初始化時綁定了 rest 接口。請求會觸發相應的 handler,handler 會從后端存儲中取出具體的數據并寫入 response。這個過程也很容易理解。

Registry 啟動源碼分析

下面我們就講一下 registry 的啟動過程,我也是第一次細讀開源項目的源碼,也講一下我作為一個新手是如何閱讀源代碼的。

既然 registry 是以一個 docker container 形式運行的,要看它是如何啟動的,當然首先看它的 Dockerfile

 

圖 4 Dockerfile
 

主要做了兩件事:
1. 拷貝代碼到容器中;
2. 編譯成二進制可執行文件;
3. 指定程序入口;
 

當我們運行 docker run –p 5000:5000 registry:2 時,容器內部 registry 的啟動命令其實是 registry serve /etc/docker/registry/config.yml,
進入到項目中找 main 函數,發現程序的入口文件是 /cmd/registry/main.go,main 函數也只有一句話:

 

其實在加載 RootCmd 時已經做了命令綁定,子命令 serve 對應的實現在 /registry/registry.go L 30,調用的內容主要有:
1. 讀取配置文件;
2. 把配置參數傳遞給 NewRegistry() 函數,用來實例化一個 registry 對象(雖然對象這個詞用在 go 語言里并不合適,單張這樣類比更好理解);
3. registry 進入端口監聽狀態,啟動完畢。
 

Registry 對象的結構定義在 /registry/registry.go L68,Registry 結構體聲明了三個成員,如圖 5 所示,有配置參數,app,還有一個 http Server,顯而易見,最重要的就是 app 這個成員了。

 

圖 5 Registry 結構體
 

App 結構體的定義在 /registry/handlers/app.go L54,成員長,主要有:
1. driver 指明了后端存儲,可以通過 driver 進行讀 / 寫 / 查詢等操作
2. router 包含了 http 路由規則,把不同的請求分發到不同的 handler 上
3. registry 主要的 app 后端
4. accessController 訪問控制器
 

NewApp() 函數完成了 App 實例的初始化,實現在 /registry/handlers/app.go L91。該函數的大體流程如下:
1. 聲明一個 app 實例
2. 給 app 實例綁定 web handler
3. 初始化 app 的后端存儲驅動
4. 初始化 app 的密鑰
5. 配置 app 的 redis 緩存
6. 初始化 app 的后端存儲重定向功能
7. 根據參數初始化 app 的后端 registry
8. 返回 app 實例
 

至此,/registry/registry.go 的 NewRegistry() 也調用結束,返回了 registry 實例,調用 registry 的 ListenAndServe() 進入監聽狀態,直到 registry 結束。

到此,關于“Docker registryV2 整體架構與啟動過程是怎樣的”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-16發表,共計2838字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 腾冲县| 灌阳县| 长汀县| 高雄县| 正蓝旗| 江永县| 景宁| 邢台县| 湾仔区| 明溪县| 沛县| 宕昌县| 百色市| 舞钢市| 溧阳市| 九龙坡区| 昌乐县| 江源县| 万山特区| 汕头市| 通州区| 西峡县| 三明市| 孟津县| 韶关市| 博白县| 永胜县| 富宁县| 永平县| 潼关县| 新竹县| 南平市| 光山县| 泰和县| 柳江县| 大悟县| 句容市| 柳林县| 北票市| 台中县| 始兴县|