Docker Registry本地私有倉庫搭建
相比docker Hub而言,Docker Registry的功能就不夠全面了,且需要自己手動配置、升級、維護和管理,所以說對于Docker鏡像管理不太熟悉的人員推薦使用Docker Hub。如果開發(fā)者想要嚴(yán)格控制鏡像存儲位置,完全擁有自己的鏡像分配渠道,或者要想將鏡像存儲和分布緊密嵌入到自己開發(fā)的程序中,則選擇Docker Registry更適合。接下來,本小節(jié)將針對Docker Registry本地私有鏡像倉庫的管理進行詳細(xì)講解。
1.啟動Docker Registry
使用Docker官方提供的Registry鏡像就可以搭建本地私有鏡像倉庫,具體指令如下。
$ docker run -d
-p 5000:5000
–restart=always
–name registry
-v /mnt/registry:/var/lib/registry
registry:2
在上述指令中,涉及到的參數(shù)說明如下:
● -d:表示在后臺運行該容器;
● -p 5000:5000:表示將私有鏡像倉庫容器內(nèi)部默認(rèn)暴露的5000端口映射到宿主機的5000端口;
● --restart=always:表示容器啟動后自動啟動本地私有鏡像倉庫;
● --name registry:表示為生成的容器命名為registry;
● -v /mnt/registry:/var/lib/registry:表示將容器內(nèi)的默認(rèn)存儲位置/var/lib/registry中的數(shù)據(jù)掛載到宿主機的/mnt/registry目錄下,這樣當(dāng)容器銷毀后,在容器中/var/lib/registry目錄下的數(shù)據(jù)會自動備份到宿主機指定目錄。
小提示:
Docker Registry目前有v1和v2兩個版本,v2版本并不是v1版本的簡單升級,而是在很多功能上都有了改進和優(yōu)化。v1版本使用的是Python開發(fā)的,而v2版本是用go語言開發(fā)的;v1版本本地鏡像倉庫容器中數(shù)據(jù)默認(rèn)掛載點是/tmp/registry,而v2版本的本地鏡像倉庫容器中數(shù)據(jù)默認(rèn)掛載點是/var/lib/registry。
2.重命名鏡像
之前推送鏡像時,都是默認(rèn)推送到遠程鏡像倉庫,而本次是將指定鏡像推送到本地私有鏡像倉庫。由于推送到本地私有鏡像倉庫的鏡像名必須符合“倉庫IP:端口號/repository”的形式,因此需要按照要求修改鏡像名稱,具體操作指令如下。
$ docker tag hellodocker:latest localhost:5000/myhellodocker
執(zhí)行上述指令后,再次使用docker images命令查看現(xiàn)有鏡像,如圖1所示。
圖1 鏡像列表
從圖1中可以看出,在倉庫中多了一個名稱為localhost:5000/myhellodocker的鏡像。
3.推送鏡像
本地私有鏡像倉庫搭建并啟動完成,同時要推送的鏡像也已經(jīng)準(zhǔn)備就緒后,就可以將指定鏡像推送到本地私有鏡像倉庫了,具體操作指令如下。
$ docker push localhost:5000/myhellodocker
執(zhí)行上述指令后,就可以完成鏡像的推送。為了驗證推送結(jié)果,我們可以在宿主機瀏覽器上輸入地址http://localhost:5000/v2/myhellodocker/tags/list進行查看(使用該地址時注意鏡像名稱),其顯示效果如圖2所示。
圖2 本地鏡像倉庫效果
從圖2可以看出,瀏覽器已經(jīng)顯示出了相應(yīng)信息,這說明鏡像推送成功。
我們在推送鏡像的過程中,還將數(shù)據(jù)映射到了本地磁盤,因此可以在本地磁盤的/mnt/registry/docker/registry/v2/repositories目錄(即-v參數(shù)指定的宿主機數(shù)據(jù)映射位置)進行查看,如圖3所示。
圖3 本地鏡像倉庫效果
需要注意的是,如果通過瀏覽器訪問發(fā)現(xiàn)推送成功,而本地磁盤位置卻未發(fā)現(xiàn)對應(yīng)的鏡像,這就需要確認(rèn)在啟動本地鏡像倉庫時是否使用了-v參數(shù),以及數(shù)據(jù)掛載位置是否正確。
通過上一節(jié)搭建的Docker Registry本地鏡像倉庫雖然可以正常使用,但在實際開發(fā)中,為保障系統(tǒng)的安全性及私密性,我們還必須為本地搭建的私有鏡像倉庫配置認(rèn)證證書、登錄賬號等才能用于真正的服務(wù)。接下來,本小節(jié)將針對Docker Registry本地私有倉庫的配置進行詳細(xì)講解。
1.Docker Registry本地私有倉庫配置
在配置Docker Registry本地私有倉庫時,首先我們必須明確在哪臺Docker機器上搭建該私有倉庫,然后根據(jù)私有倉庫搭建的相關(guān)要求進行逐一配置,其具體操作步驟如下。
(1)查看Docker Registry私有倉庫搭建地址
這里我們?nèi)匀灰郧懊嫜菔綝ocker入門程序的Docker主機為例,將在該機器上搭建并配置Docker Registry本地私有倉庫。我們可以在Docker機器終端使用ifconfig命令查看該機器的IP地址,具體效果如圖1所示。
圖1 本地鏡像倉庫ip地址
從圖1可以看出,此次將要搭建和配置的Docker Registry本地私有倉庫的Docker主機IP地址為192.168.197.139。
(2)生成自簽名證書
要確保Docker Registry本地鏡像倉庫的安全性,還需要一個安全認(rèn)證證書,來保證其他Docker機器不能隨意訪問該機器上的Docker Registry本地鏡像倉庫,所以需要在搭建Docker Registry本地鏡像倉庫的Docker主機上先生成自簽名證書(如果已購買證書就無需生成),具體操作指令如下。
$ mkdir registry && cd registry && mkdir certs && cd certs
$ openssl req -x509 -days 3650 -subj ‘/CN=192.168.197.139:5000/’
-nodes -newkey rsa:2048 -keyout domain.key -out domain.crt
在終端home目錄下執(zhí)行上述指令后,首先會在home目錄下創(chuàng)建并進入registry/certs目錄,然后使用openssl生成一個自簽名的證書。
關(guān)于openssl命令中的一些參數(shù)說明如下。
● -x509:x509是一個自簽發(fā)證書的格式;
● -days 3650:表示證書有效期;
● 192.168.197.139:5000:表示具體部署Docker Registry本地鏡像倉庫的地址和端口;
● rsa:2048:是證書算法長度;
● domain.key和domain.crt:就是生成的證書文件。
需要特別注意的是,Docker Registry本地鏡像倉庫的地址和端口,要根據(jù)讀者自己機器的IP或者域名進行修改。
(3)生成用戶名和密碼
在Docker Registry本地鏡像倉庫所在的Docker主機上生成自簽名證書后,為了確保Docker機器與該Docker Registry本地鏡像倉庫的交互,還需要生成一個連接認(rèn)證的用戶名和密碼,使其他Docker用戶只有通過用戶名和密碼登錄后才允許連接到Docker Registry本地鏡像倉庫。
生成連接認(rèn)證的具體操作指令如下(繼續(xù)在上面生成的certs目錄下執(zhí)行以下指令)。
$ cd … && mkdir auth
$ docker run --entrypoint htpasswd registry:2 -Bbn shitou 123 > auth/htpasswd
執(zhí)行上述指令后,首先會在前面的registry目錄下再創(chuàng)建一個auth子目錄并進入該子目錄,然后使用docker run指令生成用于訪問Docker Registry本地鏡像倉庫服務(wù)的用戶名和密碼(shitou是用戶名,123是密碼)。
(4)啟動Docker Registry本地鏡像倉庫服務(wù)
完成上面的準(zhǔn)備工作后,就可以正式部署帶有安全認(rèn)證的本地私有鏡像倉庫了(需要將前面小節(jié)中運行的Docker Registry刪除),具體指令如下。
$ docker run -d
-p 5000:5000
–restart=always
–name registry
-v /mnt/registry:/var/lib/registry
*-v pwd/auth:/auth *
-e “REGISTRY_AUTH=htpasswd”
-e “REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm”
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
*-v pwd/certs:/certs *
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key
registry:2
上述指令中的多個參數(shù)在7.4.3小節(jié)已經(jīng)有過介紹,除此之外還使用了-v和-e參數(shù)在啟動Docker Registry倉庫服務(wù)時配置了認(rèn)證證書和和連接的用戶信息。上述指令是在前面生成的registry目錄下執(zhí)行的,如果在其他目錄下執(zhí)行,需要修改-v參數(shù)中auth和certs所在的宿主機文件路徑。
(5)配置Docker Registry訪問接口
完成Docker Registry本地鏡像倉庫服務(wù)啟動后,還需要在搭建了Docker Registry本地鏡像倉庫所在的Docker主機上配置供其他Docker機器訪問的接口,具體指令如下。
$ sudo mkdir -p /etc/docker/certs.d/192.168.197.139:5000
$ sudo cp certs/domain.crt /etc/docker/certs.d/192.168.197.139:5000
在Docker Registry本地鏡像倉庫所在的Docker主機上分別執(zhí)行上述指令,就完成了Docker Registry訪問客戶端的配置。
上述指令中,第一條指令用于創(chuàng)建一個證書目錄,要注意的是192.168.197.139:5000目錄名要與啟動的Docker Registry服務(wù)地址端口一致;第二條指令將生成的domain.crt證書復(fù)制到剛才創(chuàng)建的證書目錄下。
2、驗證測試
通過前面幾個步驟的操作,配置有安全認(rèn)證的Docker Registry本地私有倉庫就已經(jīng)完成啟動設(shè)置,接下來我們就可以在其他Docker主機上向該Docker Registry本地私有倉庫推送鏡像來進行測試了,具體步驟如下。
(1)Docker Registry私有倉庫使用登記
其他Docker機器如果想要與配置有自簽名證書和賬號認(rèn)證的私有倉庫進行通信,就必須在各自Docker主機上配置該私有倉庫地址,進行使用登記(此處就以部署了Docker Registry鏡像倉庫的Docker機器為例,在同一臺機器上進行演示)。
在該Docker機器終端使用sudo vim /etc/docker/daemon.json命令編輯daemon.json文件,在該文件中添加如下內(nèi)容。
{“insecure-registries”:[“192.168.197.139:5000”]}
上述內(nèi)容中的192.168.197.139:5000就是要訪問的Docker Registry私有倉庫地址。
需要注意的是,daemon.json文件中配置的內(nèi)容都是在同一個大括號“{}”中以“key:value”形式存在的文本,多個“key:value”配置中間用英文逗號“,”分隔,具體效果如圖2所示。
圖2 daemon.json文件
從圖2可以看出,daemon.json文件中的配置內(nèi)容包括前面小節(jié)介紹的鏡像加速器,以及Docker Registry私有倉庫地址。
編輯完成并保存后,需要重啟Docker進程,具體指令如下。
$ sudo /etc/init.d/docker restart
執(zhí)行完上述操作后,配置了該倉庫服務(wù)地址的Docker主機就可以與Docker Registry私有倉庫進行通信,來完成鏡像的搜索、拉取和推送等操作。
(2)準(zhǔn)備鏡像文件
在該Docker主機上重命名一個Docker鏡像,具體指令如下。
$ docker tag hello-world:latest 192.168.197.139:5000/myhelloworld
執(zhí)行上述指令后,可以通過docker images命令查看當(dāng)前Docker主機上鏡像列表中存在的所有鏡像,效果如圖3所示。
圖3 本地鏡像列表
(3)推送鏡像
通過docker push指令向Docker Registry本地私有鏡像倉庫推送該鏡像,具體指令如下。
$ docker push 192.168.197.139:5000/myhelloworld
執(zhí)行上述指令后,就會有錯誤信息提示,如圖4所示。
圖4 推送鏡像
從圖4可以看出,推送過程中出現(xiàn)錯誤,信息提示為:no basic auth credentials(即沒有通過身份驗證),所以無法進行推送,這也就說明身份驗證的配置有效。要想成功推送,需要先登錄成功后再推送。
(4)登錄Docker Registry鏡像倉庫
在該Docker主機上通過docker login指令先登錄到Docker Registry本地私有鏡像倉庫,具體指令如下。
$ docker login 192.168.197.139:5000
使用上述指令就可以進行Docker Registry本地私有鏡像倉庫的登錄了。需要注意的是,這里使用docker login指令后必須添加Docker Registry鏡像倉庫服務(wù)地址和端口。當(dāng)?shù)卿洺晒螅K端會返回有“Login Succeeded”登錄成功的提示信息。
(5)再次推送鏡像
登錄成功后,再次通過docker push指令向Docker Registry本地私有鏡像倉庫推送剛才命名的鏡像,具體指令與第二步指令相同。
(6)結(jié)果驗證
通常情況下,通過上一步推送后的返回信息就可以判斷是否推送成功,當(dāng)然最嚴(yán)謹(jǐn)和直觀的方法就是在Docker Registry服務(wù)掛載的鏡像目錄上進行結(jié)果驗證。在本地磁盤的(即-v命令指定的宿主機數(shù)據(jù)掛載點位置)/mnt/registry/docker/registry/v2/repositories目錄進行查看,其顯示結(jié)果如圖5所示。
圖5 本地鏡像倉庫效果
從圖5可以看出,名為myhelloworld的鏡像已成功推送到了Docker Registry本地私有鏡像倉庫。至此Docker Registry本地私有鏡像倉庫的具體管理配置就已講解完成。
小提示:
Docker官方提供的鏡像管理倉庫Docker Hub是一個可視化的并且集成了多種功能的鏡像管理工具,而Docker提供的本地私有鏡像倉庫Docker Registry卻沒有像樣的可視化管理工具,雖然這種本地私有鏡像倉庫完全不影響實際使用,但是從管理和效果上感覺卻不是很方便。針對這種情況,一些社區(qū)專門開發(fā)了Docker Registry的可視化管理工具來方便本地鏡像倉庫管理,其中比較流行的一款軟件叫做Portus,他集成了一些鏡像管理功能,可以完全可視化的管理倉庫鏡像和訪問用戶,感興趣的讀者可以自行查詢相關(guān)資料進行學(xué)習(xí)。
Docker 容器
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。