docker實戰之搭建私有鏡像倉庫 - kurbernetes
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
註意提前準備好域名,並將其作為CN,整個過程如圖所示:
查看生成證書:
2.2、運行容器,啟動鏡像倉庫
使用docker開源的Registry:2鏡像,如圖:
執行下面命令:
$ docker run -d --restart=always --name <registry- host> -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 端口。 |
如圖所示:
2.3、重命名鏡像
鏡像的完整命名格式:[registry-host]:[port]/[username]/[imagename],當我們使用docker push的時候,docker會自動識別[registry-host]部分為容器鏡像倉庫地址。
使用docker tag重命名鏡像:
docker tag justmine/healthchecksapi:v1.0 [registry-host]/justmine/healthchecksapi:v1.0
2.4 推送鏡像到私有倉庫
docker push [registry-host]/justmine/healthchecksapi:v1.0
註意:為了讓當前Windows主機上運行的docker信任此證書,我們需要在Windows主機上安裝此證書,右鍵點擊【安裝證書】,選擇【本地主機】,選擇【受信任的根證書】,添加證書即可。同時將域名與私有倉庫主機ip的映射關系寫入到Windows主機的hosts文件。
從開發環境成功推送鏡像到私有倉庫!!!大功告成!!!
到目前為止,能夠滿足企業需求的私有倉庫正式搭建完成。
下一篇,我們將實戰k8s使用我們的私有倉庫拉取鏡像。
源碼參考:https://github.com/justmine66/k8s.ecoysystem.apps
docker實戰之搭建私有鏡像倉庫 - kurbernetes