搭建企業私有的鏡像倉庫,知足從開發環境推送和拉取鏡像。當咱們使用k8s來編排和調度容器時,操做的基本單位是鏡像,因此須要從倉庫去拉取鏡像到當前的工做節點。原本使用公共的docker hub徹底能夠知足咱們的需求,也很是方便,可是上傳的鏡像任何人均可以訪問,其次docker hub的私有倉庫又是收費的,因此從安全和商業兩方面考慮,企業必須搭建本身的私有鏡像倉庫。javascript
爲了保證鏡像傳輸安全,從開發環境向私有倉庫推送和拉取鏡像時,通常使用https的方式(備註:對於普通的http方式請你們參考官方文檔:https://docs.docker.com/registry/insecure/#deploy-a-plain-http-registry 本身下去實戰。),因此咱們須要提供一個可信任的、知名的SSL/TLS證書,能夠向知名的第三方證書頒發機構購買證書,也能夠使用Let’s Encrypt生產免費的證書,還能夠本身生產一個自簽名證書。
因爲沒有購買真實的域名,沒法和第三方證書頒發機構進行交互性驗證,因此決定本身生產一個自簽名證書,添加到私有倉庫,而後讓docker客戶端信任此證書。
建立一個用於存儲證書和私鑰的目錄certshtml
$ mkdir -p certs
生產證書和私鑰java
$ openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \ -x509 -days 365 -out certs/domain.crt
注意提早想好域名(如:registry.wuling.com),並將其做爲CN,整個過程如圖所示:
查看生成證書:
node
使用docker開源的Registry:2鏡像,如圖:
執行下面命令:git
$ 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 端口。 |
如圖所示:
叢上圖能夠看到,服務端私有倉庫已經正常運行起來了!!!github
鏡像的完整命名格式:[registry-host]:[port]/[username]/[imagename],當咱們使用docker push的時候,docker會自動識別[registry-host]部分爲容器鏡像倉庫地址。
使用docker tag重命名鏡像:docker
docker pull justmine/helloworldapi:v2.2 docker tag justmine/helloworldapi:v2.2 registry.wuling.com/justmine/helloworldapi:v2.2
什麼狀況?哦哦哦!!!域名是咱們杜撰的,須要將與IP映射關係寫入hosts文件。
再次推送,以下:
shell
x509: certificate signed by unknown authority
又是什麼狀況?哦哦哦!!!原來系統不信任咱們頒發的證書,好吧,不知名就不信任,那咱們就主動宣佈此證書是值得信任的!!!
爲docker client安裝證書,命令以下:windows
# 假如:倉庫域名爲=》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版本狀況,你們按照這兩種方法添加信任就好了。api
再次推送:
成功了!!!
倉庫鏡像目錄:
https://registry.wuling.com/v2/_catalog
鏡像詳情
https://registry.wuling.com/v2/justmine/helloworldapi/tags/list
docker push registry.wuling.com/justmine/healthchecksapi:v1.5
同理:爲了讓當前Windows主機上運行的docker信任此證書,咱們只須要在Windows主機上安裝此證書,右鍵點擊【安裝證書】,選擇【本地主機】,選擇【受信任的根證書】,添加證書便可。同時將域名與私有倉庫主機ip的映射關係寫入到Windows主機的hosts文件。
重啓docker,再次推送:
哎,終於成功了,不容易啊!!!
docker pull registry.wuling.com/justmine/healthchecksapi:v1.5
倉庫鏡像目錄:
https://registry.wuling.com/v2/_catalog
鏡像詳情
https://registry.wuling.com/v2/justmine/healthchecksapi/tags/list
到目前爲止,可以知足企業需求的私有倉庫正式搭建完成。
下一篇,咱們將實戰k8s使用咱們的私有倉庫拉取鏡像。
源碼參考:https://github.com/justmine66/k8s.ecoysystem.apps