Harbor 是由 VMWare 公司用 Go 語言所開發的開源軟體,它可以讓團隊存放各種不同的私有 Docker 映像檔,假如團隊內沒考慮 AWS 的 ECR 或者是 Google 提供的 GCR 方案,建議您可以參考看看 Harbor,而 Harbor 提供了簡易的 UI 介面,包含權限控管,及跨區域的自動同步功能,比起自己從官網把 Docker Registry 架起來,功能多上不少。本篇不會教大家如何架設 Harbor,有興趣的可以直接參考官方文件,此篇會紀錄如何透過 Caddy 將憑證用在 Harbor 內部。
問題?
我本來把 Harbor 架設在 AWS EC2 上面,而剛開始是採用 http
並非使用 https
,這在搭配 Kubernetes 會有個問題,因為假設使用 http
的話,Docker 預設是不吃 http 的,所以必須要在 k8s 每一個 Node 機器內補上下面設定
如果在個人電腦上面 (Mac) 則是需要到底下 Docker 設定頁面補上 register 資訊
如果今天在 k8s 內需要自動擴展一台新的 EC2 機器,你會發現在這台 EC2 機器內是抓不到任何 Image 檔案,所以必須要讓 Harbor 支援 https 才能解決掉此問題。
解決方式
在 Harbor 內可以參考此份文件將憑證檔案放到 Docker 內部。假設今天沒有憑證,其實可以透過 Caddy 方式來拿到憑證放到 Dokcer 內部。第一步先找到 Caddy 存放路徑,一般來說是放在 ~/.caddy/
目錄,接著透過 link 方式放到 /data
目錄 (/data
是 Harbor 預設放在 Host 的目錄)
接著打開 harbor.cfg
將 ui_url_protocol
設定為 https
|
|
重新啟動 harbor
設定 Caddy
這邊不確定是不是 Harbor 的 bug,理論上如果在 Harbor 內跑 http,只要把 Caddy 設定好 proxy 理論上要可以通,但是實際上就是不行,必須要在 harbor 跑 https
然後 Caddy 也跑 https
才行
其中 8089 就是對應到 harbor 容器內的 443 port。這樣還不夠,你必須要在 /etc/hosts
底下補上
|
|
這樣才可以正確讓 Caddy + Harbor 正式跑起來,並且三個月自動更換憑證。
心得
沒有時間去研究 Harbor 底層為什麼會出現這問題,有時間的話再來研究看看。可能是在 harbor 包的 Nginx 容器設定有些問題。
See also
- Go 1.16 推出 Embedding Files
- 用 Docker 每天自動化備份 MySQL, Postgres 或 MongoDB 並上傳到 AWS S3
- 如何將前端網站打包成 Docker Image
- 使用 Docker BuildKit 加速編譯 Image
- 用 GitHub Actions 上傳 Docker Image 到 AWS ECR
- Docker 推出官方 GitHub Actions 套件
- Go Modules 處理 Private GIT Repository 流程
- 用五分鐘安裝好 Drone 搭配 GitHub 自動化環境
- 使用 Docker 五分鐘安裝好 Gitea (自架 Git Hosting 最佳選擇)
- [Go 教學] graceful shutdown 搭配 docker-compose 實現 rolling update