iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0

昨天,我們好不容易將 Image 推送到 Docker Hub 上,並從伺服器上將 Image 拉取下來執行,完成了手動的部署,然而我們發現 Docker Hub 對一般的帳戶僅提供一份私人的 Repository,也因此,許多的團隊會嘗試在自有的伺服器上架設私人的 Registry。

今天,我們一起來搭建私人的 Image Registry,並且將 ColorCodeTag 的前後端都推送上去,再將 Image 拉取下來執行。

Harbor

Harbor 是一個開源的 Image Registory,其核心功能是儲存和管理 Image,除了和 Docker Hub 一樣支援 command -line 以外,還提供了用戶同型化的管理介面 (就是 Web 啦) 操作,而多用戶的管理自然也會包含 以角色為基礎的存取控制 (Role-based access control,RBAC 我都念 R-貝可);所謂的 RBAC 代表成員 (你、我、他) 在 Harbor 的不同專案下,會賦予一個角色 (對該專案具備特定的權限),在 Harbor 中共有以下五個角色:

  • 專案管理員 (Project Admin): 能夠管理專案的成員、刪除專案,以及管理專案中的資源
  • 專案維護人員 (Maintainer): 在 2.0 版本前好像叫做 master,亦具備管理專案中的資源的能力,但無法刪除專案
  • 開發者 (Developer):能夠讀寫 Artifact 專案中的資源
  • 訪客 (Guest): 對 Artifact 和資源有讀取的權限
  • 受限制的訪客 (Limited Guest): 僅能拉取 Artifact,其他資源以及 log 都沒有讀取的權限

當專案建立後,管理員會是裡面第一個成員,若有人想加入專案,就必須先在我搭建的 Harbor 上創建帳戶,並由管理員將成員加入專案,並分配其角色。另外專案也能夠設定機器人帳戶,用於遠端授權推送和拉取,機器人帳戶能夠設定有效的期間,可以與專案的生命週期配合。

另外 Harbor 還有映像掃描的功能,能夠遠端拉取最新的 Vulnerability,目前推薦是安裝 Trivy,但由於是從遠端的資料庫拉取,若想要掃描就必須讓 Harbor 有訪問外網的能力;另外,掃描 Image 非常耗資源,所以若有掃描需求伺服器盡量配置 4GB 以上。

Harbor 搭建

以現況來說,Harbor 與 Jenkins 等工具都能夠以 Container 的形式部署,甚至能夠在 Kubernetes 的環境下執行,而我參與過的專案則是在伺服器上開立多台虛擬機,分別部署各工具服務,並由 nginx 做反向代理;關於部署的方式可以依照需求調整。今天,我們就將 Harbor 建構在另外一台實體的 Linux 機上,並在後續也將 Jenkins 安裝在上面。

這台 Linux 我們就叫他 DevOps 機,並設定固定 IP 192.168.1.120,並把 Harbor 的 port 設定為 9001

#通常我們會創建 opt 資料夾,並在裡面放置想自行安裝的軟體
sudo mkdir /opt
cd /opt
#下載 harbor
wget https://github.com/goharbor/harbor/releases/download/v2.4.1/harbor-offline-installer-v2.4.1.tgz
#解壓縮
tar -xvzf harbor-offline-installer-v2.4.1.tgz
cd harbor
#複製 harbor.yml ,在啟動時不會使用 .temp 檔案
sudo cp harbor.yml.tmpl harbor.yml

再來,需要調整 Harbor 的 yml 配置檔案。這裡共有三個重要操作:

  1. 將 hostname 更改為 IP 192.168.1.120
  2. 將 http port 設定為 9001
  3. 註解掉 https 的設定

注意: 各位看官務必注意一點,現今在網路上使用 http 等同於裸奔,若要對外使用請務必掛載憑證,否則再登入的時候若被監聽封包,帳號密碼會被看得一清二楚。

# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: 192.168.1.120

# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 9001

# https related config
# 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

儲存後,即可執行安裝:

# 順便安裝 image Scanner
sudo ./install.sh --with-trivy

執行後即可在 192.168.1.120:9001訪問到 Harbor 了~

https://ithelp.ithome.com.tw/upload/images/20221004/20132878tZkFlP6lQA.png

接著,使用預設的帳號密碼即可登入:

admin
Harbor12345

登入後,請馬上,立刻點選右上角的 admin,將密碼修改,Harbor 的預設帳號密碼你知我知大家都知道,一定要養成馬上修改的習慣。

再來,我們點擊新建項目,建立 cct-java 以及 cct-web 兩個項目,儲存容量設定為 -1 則代表不設限制。

https://ithelp.ithome.com.tw/upload/images/20221004/20132878rRE9q7XZyS.png

另外可以看到預設的 library,這是一個公開的專案倉庫,通常會放置共用的 BaseImage,或是有人將部分的工具打包後,供人拉取使用。

https://ithelp.ithome.com.tw/upload/images/20221004/20132878pAsy1VD8yF.png

完成後,我們來解釋一下專案項目與鏡像倉庫間的層級關係。

#IP地址/項目/倉庫:TAG
192.168.1.120:9001/cct-java/REPOSITORY[:TAG]

其實也代表著,我們能夠在 cct-java 的項目下放入多個不同的 Image,比如將前端與後端的鏡像都放置進去,在設置權限上也可以省略一點步驟;不過通常會以 Image 的類型區分項目,如再使用 Spring Cloud 專案時就能夠將各微服務放置在同一個項目中。這裡我們還是將前端與後端分開為兩個項目。

當然我們不會也不該用 admin 完成後續的步驟。下一步,我們為這個專案創立一個成員,並賦予他在前後端兩個項目內都有 Maintainer 的角色。點選左側的用戶管理 => 創建用戶 (william)

https://ithelp.ithome.com.tw/upload/images/20221004/20132878V7Q5g3ZCWf.png

接著到專案項目內,點選 cct-java & cct-web 的成員欄位,選取 + 用戶,將 william 加入。

https://ithelp.ithome.com.tw/upload/images/20221004/20132878lZIuH4vywb.png

現在,我們便能夠進行與之前 Docker Hub 類似的操作,將 Image Tag 後推送到 Harbor 上,並拉取下來使用了。不過由於我們目前是使用 http,也表示在傳輸資訊時需要承擔風險,對此我們需要先對 "想要與 Harbor 互動" 的電腦設定 insecure-registries,才能夠和 Harbor 傳遞拉取 Image。

而要互動的為開發者的本機,以及陪伴了我們幾天的 192.168.1.188 SIT 機。由於我的電腦使用 Docker Desktop,可以到介面內點選設定(齒輪),點選側欄的 Docker Engine,便可以設定 daemon.json 檔案,這裡我們將 insecure-registries 加入。

https://ithelp.ithome.com.tw/upload/images/20221004/20132878EXxcickM9Y.png

而對於 linux 伺服器,我們則要修改 daemon.json 檔案,若沒有則創建一個。

cd /etc/docker
ls -l
#若沒有則新增
sudo touch daemon.json
sudo vim daemon.json

加入 insecure-registries

{
"insecure-registries":["192.168.1.120:9001"]
}

完成後重啟 docker

sudo systemctl daemon-reload
sudo systemctl restart docker

接著,我們就可以來 Tag Image 並推送了。我們先到 cct-web 的專案目錄下開啟 cmd

docker build -t 192.168.1.120:9001/cct-web/cct-front:0.0.1 .

再到 cct-web 的專案目錄下開啟 cmd

docker build -t 192.168.1.120:9001/cct-java/cct-back:0.0.1 .

接著,便可以利用 cli 登入 Harbor,並拉取私人鏡像,這裡用 william 帳戶操作:

docker login http://192.168.1.120:9001
docker push 192.168.1.120:9001/cct-web/cct-front:0.0.1
docker push 192.168.1.120:9001/cct-java/cct-back:0.0.1

推送後,Image 就成功的進入 Harbor 項目內啦~

https://ithelp.ithome.com.tw/upload/images/20221004/20132878wuwYkLf9sz.png

再來我們只要反向操作,再次遠端到 188 那台電腦,並以 cli 利用 william 登入後拉取鏡像執行,就能和昨天一樣讓前後端的服務啟動囉。

然而再次強調,這次的演示僅帶大家快速的瀏覽過程,事實上在網路這個充滿宮崎英高善意的地方,使用 http 是非常不安全的,若想要在遠端 VM 架設作為生產,務必要使用憑證及 https。

環境流程總整理

今天,總算是完成了全手動化的布建,這時我們看看身邊,共有開發的本機,運行 Harbor 的 DevOps 機,以及一台運行 ColorCodeTag 的 SIT 機。

這裡我們可以用一張圖表示目前的情況:

https://ithelp.ithome.com.tw/upload/images/20221004/201328789Q59hYvy0p.png

可以看到目前由孤單威廉用自己的電腦開發,並且手動編譯打包、推送到 Harbor、最後再遠端連線到生產機(SIT 188 那台)拉取 Image 並運行 Container。但再多人環境與自動化的引入之下,應該會將 Code 放置到 GitHub 或 GitLab 的 Repository 內,並開啟分支管理;並且將編譯、測試、部署等動作自動化交由 Jenkins 完成。

https://ithelp.ithome.com.tw/upload/images/20221004/201328781QjIoRfVyr.png

當構建好了以後,團隊便能將更專注地開發,同時每一期的 Sprint 也能即時的將成果部署在 SIT 環境,來使 DevOps 真正運作起來。

今日總結

今天帶大家搭建了 Harbor,並且完成了向務的建構與 Image 的推送與拉取,並帶大家一覽目前的配置與目標的配置,明天,我們將和大家介紹 Gitflow,並將專案推送到 Gitlab 上面。

然後看到剩下大概 10 天左右要完成,全身冒冷汗,希望明年可以不再是孤單威廉 T_T。


上一篇
Day18: 師爺,翻譯翻譯什麼叫 DevOps 的流程 - Container 部署
下一篇
Day20: Gitflow 介紹
系列文
一個人也能 DevOps ? 用 Angular + Spring Boot 演示專案由開發到部署30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言