天天看點

深入淺出DevOps:私有鏡像倉庫Harbor

💯 作者: 俗世遊子【謝先生】。 8年開發3年架構。專注于Java、雲原生、大資料等領域技術。

💥 成就: 從CRUD入行,負責過億級流量架構的設計和落地,解決了千萬級資料治理問題。

📖 同名社群:​​51CTO​​​、 ​​github​​​、掘金​、​​gitee​​​。

📂 清單: ​​​goku-framework​​​、​​【更新中】享閱讀II​​

DevOps系列

​​深入淺出DevOps:DevOps核心思想​​

​​深入淺出DevOps:版本控制Git&Gitlab​​

​​深入淺出DevOps:持續內建工具Jenkins​​

​​深入淺出DevOps:簡易Docker入門​​

​​深入淺出DevOps:Jenkins實戰之CI​​

​​深入淺出DevOps:SonarQube提升代碼品質​​

​​深入淺出DevOps:SonarQube提升代碼品質【下】​​

​​深入淺出DevOps:Jenkins建構器​​

前言

在《04.容器化:Docker入門》中,我們已經介紹了關于Docker的相關知識點,相信大家對于Docker中的鏡像已經有了一個認識。不知道大家有沒有這樣的疑問:

  • 在執行​

    ​docker search mysql​

    ​​或者​

    ​docker pull mysql​

    ​這樣的指令的時候,這些鏡像都是哪裡來的?
  • 如果我想希望自己建構的鏡像也能這樣非常友善的執行在各大伺服器上應該怎麼做?

關于鏡像倉庫的介紹

那麼,這裡就需要着重介紹 鏡像倉庫。大家可以将它了解和代碼倉庫是一樣的功能,不過鏡像倉庫實專門用來存放代碼建構後鏡像的存儲空間。

而且将鏡像上傳到倉庫以後,其他人可以直接通過pull方式,在自己的機器上運作。

鏡像倉庫按照部署方式可以分為三類,下面我們就具體來了解吧

Docker hub

預設情況下,我們所下載下傳的鏡像都是來自官方倉庫,通過通路​​hub.docker.com​​進入到官網,以後可以通過搜尋的方式找到自己想要的鏡像

官方倉庫很多情況下使用并不是非常友善,是以官方倉庫并不适合很多公司

感興趣的同學可以新增賬號,嘗試上傳自己的基礎鏡像

第三方服務

俗話說,挖資本主義牆角,薅社會主羊毛。

現在各種雲服務廠商都提供了非常完善的鏡像管理的功能,比如

  • 阿裡雲的容器鏡像服務,個人版支援免費使用,不過容量有限
這裡也不會過多介紹,自己可以進入到對應的雲服務廠商上玩耍,操作方式還是比較詳細的

Harbor私有倉庫

Docker容器應用的開發和運作離不開可靠的鏡像管理,雖然Docker官方也提供了公共的鏡像倉庫,但是從安全和效率等方面考慮,部署我們私有環境内的Registry也是非常必要的。

Harbor是由VMware公司開源的企業級的Docker Registry管理項目,它包括權限管理(RBAC)、LDAP、日志稽核、管理界面、自我注冊、鏡像複制和中文支援等功能。

DockerCompose

這裡不做過多的介紹,隻需要知道它能夠管理容器即可。随後在K8s系列中完整介紹

curl -L https://get.daocloud.io/docker/compose/releases/download/v2.10.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 驗證
docker-compose version      

安裝

Harbor是一款開源軟體,在Github上能夠找到相關的程式和下載下傳包,​​點選這裡​​進入到Github的下載下傳頁面,選擇對應的版本進行下載下傳就好,我這裡使用的是最新版本:2.5.0

建議準備環境:2C 4G,伺服器需要安裝Docker,Docker-Compose
  • 解壓檔案
tar xf harbor-offline-installer-v2.5.0.tgz -C /usr/local/ && cd /usr/local/harbor      
  • 基礎配置
cp harbor.yml.tmpl harbor.yml
vim harbor.yml      

進入到配置檔案内容之後,如果沒有其他特殊要求,其實我們隻需要改動如下配置就可以正常的執行啟動程式了

# 改為自己伺服器的IP或者設定的域名
hostname: 192.168.10.201
http:
  # http開放的端口,預設為80,
  port: 80

# harbor預設賬号的預設密碼
harbor_admin_password: Harbor12345      
這裡要注意:我們暫時沒有設定https,是以在配置的時候需要先将443相關的配置注釋掉
# 需要注釋掉
https:
  # https port for harbor, default is 443
  # port: 443
  #  The path of cert and key files for nginx
  # certificate: /your/certificate/path
  # private_key: /your/private/key/path      
  • 編譯執行
./install.sh      

如果檢視過install.sh檔案的話就會發現,目前檔案内容最終還是會執行​

​docker-compose up -d​

​來啟動Harbor程式。這對我們來說整個安裝就很簡單了

深入淺出DevOps:私有鏡像倉庫Harbor

當發現出現如下容器的時候,說明Harbor程式已經正常啟動,那麼我們通過​​http://ip:port​​來通路,通過admin/Harbor12345進入到控制台

等待出現如下界面,成功完成安裝

深入淺出DevOps:私有鏡像倉庫Harbor

停止服務

當執行完install.sh之後,在程式的目錄下會生成​

​docker-compose.yml​

​檔案,我們隻需要操作它就能操作Harbor所啟動的容器了

docker-compose stop      
深入淺出DevOps:私有鏡像倉庫Harbor

https配置

預設情況下,Harbor 不附帶證書,但是Harbor推薦在生産環境上使用https的方式,能夠很大程度上保證請求的安全

在上面的啟動容器内我們發現,我們所通路的請求其實是通過nginx接收請求的,抽根煙的功夫一想就能明白。這其實就是為nginx設定https的方式

非必須配置,但是建議設定

那接下來我們就來看看整個設定的流程吧,整個流程根據官網文檔一步步進行驗證并總結,​​點選進入​​官方說明

不想看官網的同學繼續往下看吧

生成CA憑證

生産環境中,您應該從 CA 獲驗證書。在測試或開發環境中,我們自己生成一個證書就行

  • 生成私鑰
openssl genrsa -out ca.key 4096      
  • 生成證書
openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=192.168.10.201" \
 -key ca.key \
 -out ca.crt      

這裡着重要注意​

​-subj​

​​下的​

​CN=​

​,根據自己的條件選擇填寫域名還是IP

生成伺服器證書

證書通常包含一個​

​.crt​

​​檔案和一個​

​.key​

​​檔案。我們這裡就設定為​

​192.168.10.201.crt​

​​和​

​192.168.10.201.key​

  • 生成私鑰
openssl genrsa -out 192.168.10.201.key 4096      
  • 生成證書簽名請求
openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=192.168.10.201" \
-key 192.168.10.201.key \
-out 192.168.10.201.csr      

還是一句話,注意​

​CN=​

  • 生成 x509 v3 擴充檔案
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicCnotallow=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=192.168.10.201
EOF      

着重關注DNS,這裡可以設定多個

  • 生成證書
openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in 192.168.10.201.csr \
    -out 192.168.10.201.crt      
檔案歸檔
  • 複制到Harbor挂載目錄下,用于配置
mkdir -p /data/cert
cp 192.168.10.201.crt /data/cert/ && cp 192.168.10.201.key /data/cert/      

然後去配置​

​harbor.yml​

# https related config
https:
  #  https port for harbor, default is 443
  port: 443
  #  The path of cert and key files for nginx
  certificate: /data/cert/192.168.10.201.crt
  private_key: /data/cert/192.168.10.201.key      
  • 生成用戶端證書
openssl x509 -inform PEM -in 192.168.10.201.crt -out 192.168.10.201.cert      
  • 将伺服器證書、密鑰和 CA 檔案複制到 Harbor 主機上的 Docker 證書檔案夾中

整體的目錄必須是這樣的

  • /etc/docker/certs.d/192.168.10.201

如果不采用預設443的端口,那麼你需要建立如下目錄

  • /etc/docker/certs.d/192.168.10.201:端口

然後複制檔案

cp 192.168.10.201.cert /etc/docker/certs.d/192.168.10.201/
cp 192.168.10.201.key /etc/docker/certs.d/192.168.10.201/
cp ca.crt /etc/docker/certs.d192.168.10.201/      
最後一步

重新開機docker服務,重新建構harbor容器

systemctl restart docker

cd /usr/local/harbor
./install.sh      

看到如下的圖,說明整個配置已經全部配置完成

深入淺出DevOps:私有鏡像倉庫Harbor
深入淺出DevOps:私有鏡像倉庫Harbor

基本使用

整個Harbor到目前為止就已經全部完成,接下來我們就使用起來吧。

項目這個功能屬于Harbor的核心功能。我們可以将這個功能了解為隔離資源,通過不同的項目我們可以管理不同的的鏡像檔案

接下來我們就先來建立一個項目,然後看看如何将本地鏡像上傳上來吧

建立項目

深入淺出DevOps:私有鏡像倉庫Harbor

相信這個功能就不用多說了,大家都了解。這裡多說一句:

  • 将通路級别設定為公開,那麼所有人都可通路公開的項目倉庫

Docker配置

通過docker将本地鏡像上傳到Harbor主要分為三步:

  • 登入到Harbor上
  • 對本地鏡像進行重命名
  • 推送鏡像
登入到Harbor

登入作為最重要的一步,我們還是先來看如何操作吧

docker login -u admin -p Harbor12345 192.168.10.201      

通過​

​docker login​

​的指令能夠登入到對應的倉庫上,但是我們如果直接這樣登入Harbor的話,會出現如下的問題

深入淺出DevOps:私有鏡像倉庫Harbor

還記得我們直接改過的​

​daemon.json​

​檔案麼,我們需要加一條配置使Docker能夠支援Harbor

"insecure-registries":["192.168.10.201"]      

随後重新開機docker

systemctl daemon-reload
systemctl restart docker      

當我們啟動之後再次登入,出現如下字樣說明登入成功

深入淺出DevOps:私有鏡像倉庫Harbor

這裡要非常注意:

Harbor預設端口是443,如果沒有https的話,在随後的操作中一定要帶上http.port配置的端口,否則無法通路

鏡像重命名

雖說是鏡像重命名,但是我們可能不知道新的鏡像名稱如何配置,别慌。在Harbor項目下已經為我們說明了一切!!

深入淺出DevOps:私有鏡像倉庫Harbor

這些知名開源産品還是非常貼心的,在很多地方都為我們給出了相關的說明。

那麼我們就來看操作,在我本地的機器上有之前曾經建構過的項目,我來給大家檢視一下。接下來我就将第一個項目上傳到Harbor倉庫中

深入淺出DevOps:私有鏡像倉庫Harbor

直接将Harbor中的指令拷貝出來,我們調整一下

docker tag 26ee73ace20f 192.168.10.201/presentation/module01:v0.0.7      

這裡是可以直接通過鏡像ID來操作的,展示結果看下圖

别慌,他們就是屬于同一個鏡像檔案,是以鏡像ID是一樣的
深入淺出DevOps:私有鏡像倉庫Harbor
推送鏡像

最終我們要推送的是我們重命名之後的鏡像,那麼我們接下來就通過push指令來操作吧

由于存在相同ID的鏡像,是以這裡采用名稱來推送

docker push 192.168.10.201/presentation/module01:v0.0.7      
深入淺出DevOps:私有鏡像倉庫Harbor

完美收工,就這樣已經推送完成了。

如果想要拉取下來的,直接通過​

​docker pull 192.168.10.201/presentation/module01:v0.0.7​

​就能拉取然後直接使用

最後

  • Jenkins通過docker将鏡像push到Harbor中,測試伺服器在Harbor上拉取鏡像運作測試

繼續閱讀