0%

安裝 Nexus Repository Manager 作為 Docker Hub Mirror & Docker Image Proxy

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
2
3
4
5
6
# 將 certificate & private key 轉成 PKCS12 格式
$ openssl pkcs12 -export -name nexus.example.com -inkey path_to_private.key -in path_to_wildcards.example.com.crt -out complete_key.p12

# 將 PKCS12 憑證匯入新建的 JKS 憑證
# 並設定 jks(Java keystore) 的密碼為 password
$ keytool -importkeystore -deststorepass password -destkeypass password -destkeystore keystore.jks -srckeystore complete_key.p12 -srcstoretype PKCS12 -srcstorepass password -alias nexus.example.com

設定 HTTPS

這裡有兩個目錄變數需要先定義:

  • $install-dir:**/data/nexus3/nexus-3.14.0-04**

  • $data-fir:**/data/nexus3/sonatype-work/nexus3**

設定流程如下:

  1. 將上述產生的 keystore.jks 複製到 $install-dir/etc/ssl/ 中,完整路徑應該是 $install-dir/etc/ssl/keystore.jks

  2. 編輯 $data-dir/etc/nexus.properties,新增設定 application-port-ssl=443 (port number 可以自訂)

  3. 編輯 $data-dir/etc/nexus.properties,移除 nexus-args 的註解,並加上 ${jetty.etc}/jetty-https.xml (使用逗號隔開設定)

  4. 編輯 $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。

References