Preface
原本公司內部對於 docker image 的需求很簡單,就是 docker hub mirror 而已,一開始用 VMware Harbor 就可以滿足需求,但後來需求逐漸變多了,大概條列如下:
docker hub mirror
private docker registry
docker registry proxy of certain public registry(e.g.,
quay.io
,gcr.io
)
後來找到 Sonatype Nexus Repository 用來解決上面的需求,而且這個不僅可以作為 docker image 的 proxy,還可以作為 npm, rpm, deb … 等軟體套件的 proxy,因此就花了點時間研究一下如何安裝使用。
安裝需求
基本上安裝需求很簡單,只有兩樣:
Java Runtime version 8
很大的硬碟空間 (為了儲存 proxy 下來的 docker image)
安裝流程
下載 Nexus Repository OSS
首先到官網下載 Nexus3 Repository OSS,並解壓縮到較大硬碟空間的分割上,以下是這次安裝的版本:
官網最新版本:
nexus-3.14.0-04-unix.tar.gz
解壓縮路徑:
/data/nexus3
解壓縮後會有兩個目錄,分別是 nexus-3.14.0-04
& sonatype-work
設定 HTTPS
準備 certificates
這個部份就略過了,需要的人可以去 SSL For Free 申請免費且合法的憑證,比較需要注意的是 SSL For Free 僅會提供 CER 格式的 certificate & private key,因此後面的設定中會需要使用其他工具轉成其他格式。
假設申請的 certificate 為 wildcard certificate for
*.example.com
,檔名分別為
設定目標
在以下步驟中,我們預設要將 nexus repository 的 DNS 設定為 nexus.example.com
,因此先建立一個可被 Nexus Repository Manager 用的 certificate,必須是 JKS(Java keystore) 的格式:
1 | # 將 certificate & private key 轉成 PKCS12 格式 |
設定 HTTPS
這裡有兩個目錄變數需要先定義:
$install-dir
:**/data/nexus3/nexus-3.14.0-04**$data-fir
:**/data/nexus3/sonatype-work/nexus3**
設定流程如下:
將上述產生的
keystore.jks
複製到$install-dir/etc/ssl/
中,完整路徑應該是 $install-dir/etc/ssl/keystore.jks編輯
$data-dir/etc/nexus.properties
,新增設定application-port-ssl=443
(port number 可以自訂)編輯
$data-dir/etc/nexus.properties
,移除nexus-args
的註解,並加上${jetty.etc}/jetty-https.xml
(使用逗號隔開設定)編輯
$install-dir/etc/jetty/jetty-https.xml
,檢視sslContextFactory
section,確保檔名 & 密碼跟上面設定的 certificate 是相同的 (若檔名是 keystore.jks & 密碼是 password 就可以忽略此步驟)
啟動 Nexus Respository Manager
到此為止,Nexus 還是無法直接以 HTTPS 的形式啟動,因為還需要設定 Base Url,首先要以 HTTP 啟動 Nexus:
/data/nexus3/nexus-3.14.0-04/bin/nexus start
接著以 admin
的身份登入(預設密碼為 admin123
),進入 System -> Capabilities
,新增 Base Url,並設定為 https://nexus.example.com
並儲存。
最後重新啟動 Nexus Repository Manager:
/data/nexus3/nexus-3.14.0-04/bin/nexus restart
接著應該就可以用 https://nexus.example.com 登入了!
設定 Docker Image Mirror & Proxy
這個部份就不細說了,因為下面的參考文章都寫的很清楚,基本上就是設定以下內容:
如果要設定 private docker registry,那就設定 docker(hosted) repository
如果要設定 docker hub mirror,那就設定 docker(proxy) repository (設定
https://registry-1.docker.io
)如果要設定 docker proxy,那就選 docker(proxy) repository(gcr.io 設定
https://gcr.io
;quay.io 設定https://quay.io
)如果要設定一個統一的 docker proxy 入口,則設定 docker(group) repository,並把需要的 docker mirror or proxy 加入
比較需要注意的是,需要到 Security -> Realms
中將 Docker Bearer Token Realm
設定為 Active,如此一來才可以使用匿名的方式存取 docker proxy。