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