使用 Docker 搭建私有軟件倉庫 Nexus 3

使用 Docker 搭建私有軟件倉庫 Nexus 3

一年前,我曾經寫過一篇,在文章中有提到一些常見的問題,最近在升級改造相關基礎技術設施,覺得應該把經驗記錄下來,造福有相關需求的同學、團隊。

這款 sonatype 公司出品的 Nexus Repository Manager,打 3.x 版本從15年開坑開始到現在,每半個月更新一次,非常值得信賴。目前官方數據顯示,全球有超過十萬的個人/團隊在使用這個企業級的軟件。

本文將基於 Docker 和 Traefik v2 聊聊如何搭建一個穩定高效的軟件倉庫,畢竟這兩年裡,這個倉庫幾乎不需要額外的打理,為我個人和團隊默默提供著可靠的高性能私有服務。

寫在前面

說起技術相關的"倉庫",我們一般會想到的是代碼倉庫,比如之前文章中寫到的 、、。

然而這些代碼倉庫一般只用於存儲尚未編譯處理的原始程序,而對於編譯產物(artifact)的管理一般是不做處理的,即使有這類功能,也相對比較孱弱,比如當前的GitLab。

加之當前研發過程中,非常流行的高頻率持續集成生產行為,軟件倉庫很多時候,除了作為最後的"交付儲存池",還需要肩負著一些額外的責任:

1. 提供 "安全可靠的官方軟件源鏡像"

· 提供 "軟件包安全掃描"

· 提供"軟件包集中審計平臺"

· ...

類似的高級需求,讓軟件倉庫的競爭也激烈了起來,除了 Nexus 外,你或許還聽說過 Harbor、Portus。

Nexus 的是一款支持通用格式的軟件倉庫,對於存儲格式並不敏感。

也就是說,你可以用它來託管 類似 Ubuntu 的 Linux 軟件源、可以用來做 NPM 倉庫、也可以用來提供 Maven、Docker、Go、Python、Ruby...你能想到的各種語言、軟件所需要的"鏡像"。

介紹的夠多了,我們來正式進入搭建環節。

基礎搭建

為了讓應用域名和SSL證書能夠更加容易的掛載到服務器上,並且便於後續管理。這裡依舊使用 Traefik 2.x 版本作為應用網關,相關的內容,你可以從之前的一些文章中做簡單瞭解,比如:和。

這裡我們啟動一個域名為 nexus.lab.io,並且支持 HTTP 自動跳轉 HTTPS 的全能倉庫,進程遇到錯誤,會自動嘗試重新啟動。

滿足上面需求的容器編排配置非常簡單,只需要不到五十行代碼。

version: "3.6"


services:


nexus3:

container_name: nexus.lab.io

image: sonatype/nexus3:3.21.1

environment:

- INSTALL4J_ADD_VM_PARAMS=-Xms2g -Xmx2g -XX:MaxDirectMemorySize=2g -Djava.util.prefs.userRoot=/nexus-data/javaprefs -Duser.timezone=Asia/Shanghai

restart: always

expose:

- 8081

volumes:

- /etc/localtime:/etc/localtime:ro

- /etc/timezone:/etc/timezone:ro

- /var/run/docker.sock:/var/run/docker.sock

- ./nexus-data:/nexus-data

networks:

- traefik

labels:

- "traefik.enable=true"

- "traefik.docker.network=traefik"

- "traefik.http.middlewares.nexus-bechind-proxy.headers.customrequestheaders.X-Forwarded-Proto=https"

- "traefik.http.routers.nexus-web.middlewares=https-redirect@file"

- "traefik.http.routers.nexus-web.entrypoints=http"

- "traefik.http.routers.nexus-web.rule=Host(`nexus.lab.io`)"

- "traefik.http.routers.nexus-web.service=nexus-backend"

- "traefik.http.routers.nexus-ssl.middlewares=content-compress@file,nexus-bechind-proxy"

- "traefik.http.routers.nexus-ssl.entrypoints=https"

- "traefik.http.routers.nexus-ssl.tls=true"

- "traefik.http.routers.nexus-ssl.rule=Host(`nexus.lab.io`)"

- "traefik.http.routers.nexus-ssl.service=nexus-backend"

- "traefik.http.services.nexus-backend.loadbalancer.server.scheme=http"

- "traefik.http.services.nexus-backend.loadbalancer.server.port=8081"

healthcheck:

test: ["CMD-SHELL", "curl -f localhost:8081 || exit 1"]

logging:

driver: "json-file"

options:

max-size: "10m"


networks:

traefik:

external: true

將上面的內容保存為 docker-compose.yml ,使用熟悉的 docker-compose up -d 啟動應用。

此刻可以使用 docker-compose logs -f 來觀察應用初始化過程是否出現錯誤情況,並等待瘋狂刷屏的日誌停止。

nexus.lab.io | -------------------------------------------------

nexus.lab.io |

nexus.lab.io | Started Sonatype Nexus OSS 3.21.1-01

nexus.lab.io |

nexus.lab.io | -------------------------------------------------

不論是你看到類似上面的日誌提示,還是使用 docker ps 看到下面標示為 healthy 的容器進程狀態,都說明 Nexus 已經正常啟動了起來。

a9b4ac5142e0 sonatype/nexus3:3.21.1 "sh -c ${SONATYPE_DI…" 2 hours ago Up 2 hours (healthy) 8081/tcp, 9100-9101/tcp nexus.lab.io

在瀏覽器中打開我們之前配置好的域名:nexus.lab.io,可以看到 Nexus 清爽的新版界面。

使用 Docker 搭建私有軟件倉庫 Nexus 3

Nexus 的新版界面

在去年的時候,Nexus的默認登陸賬號和密碼還是 admin 和 admin123。但是顯然現在官方意識到這是個錯誤的策略。

今年新的版本中,初始化的新實例,雖然默認賬號還是 admin,但是密碼已經改為了隨機生成的字符串,並且保存在只有擁有應用安裝權限的人才能看到的地方:/nexus-data/admin.password。

使用 Docker 搭建私有軟件倉庫 Nexus 3

Nexus 的新版本登陸策略

因為我們使用容器啟動 Nexus,並將 Nexus 的數據文件掛載到了本地磁盤,所以此時,我們可以選擇兩個方式來讀取這個文件。

# 在啟動應用的目錄中執行

cat nexus-data/admin.password

# 或者直接使用 Docker CLI 執行容器命令

docker exec -it nexus.lab.io cat /nexus-data/admin.password

在輸入了正確的初始賬號和密碼後,新版軟件會人性化的引導我們設置新密碼,以及設置是否允許匿名用戶使用。

如果是個人使用,或者團隊在內網使用,可以勾選"允許匿名訪問"。

使用 Docker 搭建私有軟件倉庫 Nexus 3

Nexus 的新版本初始化設置

在聊一些高級使用方法之前,我們需要先了解它的一些基礎使用。

基礎使用

在正確登陸並進行過第一次初始化設置後,我們可以看到頂部的狀態欄多了一個齒輪按鈕。


點擊按鈕,進入管理後臺,默認會停留在 "Repository" 菜單,在左側的側邊欄,選擇二級菜單"Repositories",可以看到默認已經添加了不少常用的軟件倉庫支持。

使用 Docker 搭建私有軟件倉庫 Nexus 3

Nexus 默認支持倉庫

這裡可能暫時沒有你想用的代碼倉庫,但是沒有關係,先從瞭解它提供軟件倉庫服務的基礎流程開始吧,畢竟所有倉庫都大同小異。

我們點開 maven-group 這個項目,可以清晰的看到這個 maven 軟件倉庫是如何工作的:

1. 先從 maven-release 獲取軟件包,找不到的話,繼續查找下一個類別的項目,這個倉庫是我們默認發佈軟件使用的。

· 接著從 maven-snapshots 獲取軟件包,找不到的話,繼續查找下一個類別的項目,這個倉庫是我們發佈調試版本軟件包使用的。

· 最後從 maven-central 獲取官方源軟件包,找不到的話,則宣告 "404 Not Found"。(默認源:https://repo1.maven.org/maven2/)

你當然可以選擇添加更多來源的 倉庫類型,比如"阿里/騰訊鏡像"、"公司生產環境"、"公司測試環境"等等,以及調整Nexus的獲取響應順序來改變你在安裝軟件包時的體驗和預期結果。

至於如何配置 Maven 倉庫,應該不需要我教你了吧。至此 Nexus 的基礎搭建就完成了。

最後

考慮到內容篇幅,本篇內容就先到此為止。

接下來的內容,我將介紹如何使用 Nexus 搭建 Docker 倉庫、NPM 倉庫,以及一些設置細節。

--EOF


分享到:


相關文章: