Caddy 搭配 Harbor 自架私有 Docker Registry

docker 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 機器內補上下面設定
# open /etc/docker/daemon.json
{
  "debug" : true,
  "insecure-registries" : [
    "harbor.xxxx.com"
  ]
}
如果在個人電腦上面 (Mac) 則是需要到底下 Docker 設定頁面補上 register 資訊 Screen Shot 2018-01-02 at 11.20.27 PM 如果今天在 k8s 內需要自動擴展一台新的 EC2 機器,你會發現在這台 EC2 機器內是抓不到任何 Image 檔案,所以必須要讓 Harbor 支援 https 才能解決掉此問題。

解決方式

在 Harbor 內可以參考此份文件將憑證檔案放到 Docker 內部。假設今天沒有憑證,其實可以透過 Caddy 方式來拿到憑證放到 Dokcer 內部。第一步先找到 Caddy 存放路徑,一般來說是放在 ~/.caddy/ 目錄,接著透過 link 方式放到 /data 目錄 (/data 是 Harbor 預設放在 Host 的目錄)
ln -sf ~/.caddy/acme/acme-v01.api.letsencrypt.org/sites/your_domain.com/harbor.wu-boy.com.key /data/cert/server.key
ln -sf ~/.caddy/acme/acme-v01.api.letsencrypt.org/sites/your_domain.com/harbor.wu-boy.com.cert /data/cert/server.cert
接著打開 harbor.cfgui_url_protocol 設定為 https
ui_url_protocol = https
重新啟動 harbor
$ ./prepare
$ docker-compose down
$ docker-compose up -d

設定 Caddy

這邊不確定是不是 Harbor 的 bug,理論上如果在 Harbor 內跑 http,只要把 Caddy 設定好 proxy 理論上要可以通,但是實際上就是不行,必須要在 harbor 跑 https 然後 Caddy 也跑 https 才行
your_domain.com {
  log stdout
  proxy / https://your_domain.com:8089 {
    websocket
    transparent
  }
}
其中 8089 就是對應到 harbor 容器內的 443 port。這樣還不夠,你必須要在 /etc/hosts 底下補上
127.0.0.1 your_domain.com
這樣才可以正確讓 Caddy + Harbor 正式跑起來,並且三個月自動更換憑證。

心得

沒有時間去研究 Harbor 底層為什麼會出現這問題,有時間的話再來研究看看。可能是在 harbor 包的 Nginx 容器設定有些問題。
  • 陳彥齊(Yen-chi Chen)

    理論上如果在 Harbor 內跑 http,只要把 Caddy 設定好 proxy 理論上要可以通,但是實際上就是不行

    今天有實驗,在 Harbor 內跑 http,而使用 nginx (對外)跑 https 當 proxy,有通

    我是有按造底下給的調整 harbor 內部的 nginx

    https://github.com/vmware/harbor/blob/master/docs/installation_guide.md#troubleshooting

    使用的架構:Nginx (對外, https) –> Nginx (harbor 提供, http)

    提供給你參考看看,沒有對 caddy 嘗試過

  • appleboy48

    NGINX 一定沒問題,這個驗證OK,但是 Caddy 就是不行,現在沒有時間 debug XD