搭建私有鏡像倉庫(一)

作者:justmine(大數據達摩院)

出處:https://www.cnblogs.com/justmine

1、實戰目的

搭建企業私有的鏡像倉庫,滿足從開發環境推送和拉取鏡像。當我們使用k8s來編排和調度容器時,操作的基本單位是鏡像,所以需要從倉庫去拉取鏡像到當前的工作節點。本來使用公共的docker hub完全可以滿足我們的需求,也非常方便,但是上傳的鏡像任何人都可以訪問,其次docker hub的私有倉庫又是收費的,所以從安全和商業兩方面考慮,企業必須搭建自己的私有鏡像倉庫。

2、搭建私有倉庫

2.1、生產證書

為了保證鏡像傳輸安全,從開發環境向私有倉庫推送和拉取鏡像時,一般使用https的方式(備註:對於普通的http方式請大家參考官方文檔:https://docs.docker.com/registry/insecure/#deploy-a-plain-http-registry 自己下去實戰。),所以我們需要提供一個可信任的、知名的SSL/TLS證書,可以向知名的第三方證書頒發機構購買證書,也可以使用Let’s Encrypt生產免費的證書,還可以自己生產一個自簽名證書。
由於沒有購買真實的域名,無法和第三方證書頒發機構進行交互性驗證,所以決定自己生產一個自簽名證書,添加到私有倉庫,然後讓docker客戶端信任此證書。


創建一個用於存儲證書和私鑰的目錄certs

$ mkdir -p certs

生產證書和私鑰

$ openssl req \\
-newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \\
-x509 -days 365 -out certs/domain.crt

注意提前想好域名(如:registry.wuling.com),並將其作為CN,整個過程如圖所示:

小公司容器化實踐 - 搭建私有鏡像倉庫(一)


查看生成證書:

小公司容器化實踐 - 搭建私有鏡像倉庫(一)

2.2、運行容器,啟動鏡像倉庫

使用docker開源的Registry:2鏡像,如圖:

小公司容器化實踐 - 搭建私有鏡像倉庫(一)


執行下面命令:

$ docker run -d \\
--restart=always \\
--name registry.wuling.com \\
-v `pwd`/certs:/certs \\
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \\
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \\

-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \\
-p 443:443 \\
registry:2

參數說明-d後臺靜默運行容器。-restart設置容器重啟策略。-name命名容器。-v掛載host的certs/目錄到容器的/certs/目錄。-e REGISTRY_HTTP_ADDR設置倉庫主機地址格式。-e REGISTRY_HTTP_TLS_CERTIFICATE設置環境變量告訴容器證書的位置。-e REGISTRY_HTTP_TLS_KEY設置環境變量告訴容器私鑰的位置。-p將容器的 443 端口映射到Host的 443 端口。

如圖所示:

小公司容器化實踐 - 搭建私有鏡像倉庫(一)


叢上圖可以看到,服務端私有倉庫已經正常運行起來了!!!

3、實戰(從服務器和開發環境分別推送和拉取鏡像)

3.1 服務器(私有倉庫所在主機)

3.1.1、下載並重命名鏡像

鏡像的完整命名格式:[registry-host]:[port]/[username]/[imagename],當我們使用docker push的時候,docker會自動識別[registry-host]部分為容器鏡像倉庫地址。
使用docker tag重命名鏡像:

docker pull justmine/helloworldapi:v2.2 
docker tag justmine/helloworldapi:v2.2 registry.wuling.com/justmine/helloworldapi:v2.2
小公司容器化實踐 - 搭建私有鏡像倉庫(一)

3.1.2、推送鏡像到私有倉庫

小公司容器化實踐 - 搭建私有鏡像倉庫(一)


什麼情況?哦哦哦!!!域名是我們杜撰的,需要將與IP映射關係寫入hosts文件。

小公司容器化實踐 - 搭建私有鏡像倉庫(一)


再次推送,如下:

小公司容器化實踐 - 搭建私有鏡像倉庫(一)

x509: certificate signed by unknown authority
又是什麼情況?哦哦哦!!!原來系統不信任我們頒發的證書,好吧,不知名就不信任,那我們就主動宣佈此證書是值得信任的!!!
為docker client安裝證書,命令如下:

# 假如:倉庫域名為=》registry.wuling.com,端口為=》8000,需要信任的證書地址為=》/root/certs/domain.crt 

# 1. 老版本docker
$ mkdir -p /etc/docker/certs.d/registry.wuling.com
$ cp /root/certs/domain.crt /etc/docker/certs.d/registry.wuling.com/ca.crt
# 2. 新版本docker
$ mkdir -p /etc/docker/certs.d/registry.wuling.com:8000
$ cp /root/certs/domain.crt /etc/docker/certs.d/registry.wuling.com:8000/ca.crt

備註:根據docker版本情況,大家按照這兩種方法添加信任就行了。

小公司容器化實踐 - 搭建私有鏡像倉庫(一)


再次推送:

小公司容器化實踐 - 搭建私有鏡像倉庫(一)


成功了!!!

3.1.3、通過瀏覽器查看倉庫概況

倉庫鏡像目錄:

https://registry.wuling.com/v2/_catalog
小公司容器化實踐 - 搭建私有鏡像倉庫(一)


鏡像詳情

https://registry.wuling.com/v2/justmine/helloworldapi/tags/list 
小公司容器化實踐 - 搭建私有鏡像倉庫(一)

3.2 其他宿主機(開發環境Windows主機)

3.2.1 推送鏡像到私有倉庫

docker push registry.wuling.com/justmine/healthchecksapi:v1.5
小公司容器化實踐 - 搭建私有鏡像倉庫(一)


同理:為了讓當前Windows主機上運行的docker信任此證書,我們只需要在Windows主機上安裝此證書,右鍵點擊【安裝證書】,選擇【本地主機】,選擇【受信任的根證書】,添加證書即可。同時將域名與私有倉庫主機ip的映射關係寫入到Windows主機的hosts文件。
重啟docker,再次推送:

小公司容器化實踐 - 搭建私有鏡像倉庫(一)


哎,終於成功了,不容易啊!!!

3.2.2 拉取鏡像

docker pull registry.wuling.com/justmine/healthchecksapi:v1.5
小公司容器化實踐 - 搭建私有鏡像倉庫(一)

3.2.3、通過瀏覽器查看倉庫概況

倉庫鏡像目錄:

https://registry.wuling.com/v2/_catalog
小公司容器化實踐 - 搭建私有鏡像倉庫(一)


鏡像詳情

https://registry.wuling.com/v2/justmine/healthchecksapi/tags/list
小公司容器化實踐 - 搭建私有鏡像倉庫(一)

到目前為止,能夠滿足企業需求的私有倉庫正式搭建完成。

下一篇,我們將實戰k8s使用我們的私有倉庫拉取鏡像。
源碼參考:https://github.com/justmine66/k8s.ecoysystem.apps

如果你覺得本篇文章對您有幫助的話,感謝您的【推薦】。


如果你對容器化感興趣可以關注我,我會定期的在博客分享學習心得。


分享到:


相關文章: