溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發(fā)布時間:2021-12-14 09:55:20 來源:億速云 閱讀:264 作者:iii 欄目:云計算

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

Docker registry概述

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


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


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

Docker Registry發(fā)展歷史

- 2013年3月13日,docker在github上有了第一個release[3]
- 2013年7月3日,docker在github上發(fā)布了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下載策略的區(qū)別。

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

圖1 v1版串行下載layer


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

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

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

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

Docker registryV2整體架構圖

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

圖3 docker registry 2.0架構圖[6]
 

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

Registry啟動源碼分析

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


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

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

圖4 Dockerfile
 

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

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

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

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

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

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

圖5 Registry結構體
 

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

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

至此,/registry/registry.go的NewRegistry()也調(diào)用結束,返回了registry實例,調(diào)用registry的ListenAndServe()進入監(jiān)聽狀態(tài),直到registry結束。

到此,關于“Docker registryV2整體架構與啟動過程是怎樣的”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI