Docker - 使用 Nexus3 搭設私有 NuGet 倉庫


前言

NuGet

 Nuget 是免費、開源的包管理工具,專注於在 .Net.Net Core 平台應用開發過程中第三方組件庫的管理,相對於傳統單純的 dll 引用要方便、科學得多。
 其中 nuget.org 是最著名的 NuGet 公開庫,但是企業內部開發的(業務)公共組件因為私密性或商業機密不能上傳到公共庫中,所以企業內部需要搭建一個私有的 NuGet 倉庫【私服】來支持。雖然微軟有提供的 NugetServer,但 NugetServer 用起來並不那么方便。
 而且企業有可能不止使用 C# 一種語言,可能其他的語言組件也需要管理,比如:Java Docker 鏡像 等,NugetServer 就捉襟見肘,本文我給大家帶來一款全能型的私服軟件 Nexus

Nexus 私有倉庫

Nexus 是一個強大的工具倉庫管理器,它極大地簡化了本地內部倉庫的維護和外部倉庫的訪問。
Nexus 支持管理 Bower 、Docker、Maven、npm、NuGet、Yum、PyPI 等工具包。最新版本的 Nexus3.x 全面支持 Docker 的私有鏡像存儲。

Nexus 官網:www.sonatype.com

說明

本文主要介紹怎么在 Linux (CentOS) 系統上使用 Docker 來部署 Nexus ,本文使用的是 Nexus v3.15.3 版本進行操作的。
為什么使用 Docker 來部署 Nexus,是因為作者公司現在的基礎設施為了方便維護全部使用 Docker 來部署。如果你不想使用 Dokcer 或者不想在 Linux 部署請前往官方網站下載對應安裝包。

注意:本文是在 CentOS 系統下進行操作的。

安裝 Nexus

下面介紹的安裝步驟是作者在 Linux 系統已經安裝了 Docker 為前提條件。

拉取 Nexus 鏡像

Docker Hub 拉取 Nexus 的鏡像到本地,我這里拉取是最新版本的。你也可以拉取相對應版本的鏡像。

$ docker pull sonatype/nexus3:latest
  latest: Pulling from sonatype/nexus3
  a02a4930cb5d: Pull complete 
  2c6aa0f814dc: Pull complete 
  ce7b7501fc94: Pull complete 
  Digest: sha256:00ede0830e375c8a9758ea5d98dd020425850bbeccc822da68e7bad7ae92dbfa
  Status: Downloaded newer image for sonatype/nexus3:latest

鏡像詳細說明:https://hub.docker.com/r/sonatype/nexus3

運行 Nexus

在運行之前先創建一個目錄用來存放 Nexus 持久化數據。

$ mkdir -p /data/nexus  

使用 Docker 命令運行 Nexus 。

$ docker run -d -p 8081:8081 --name nexus -v /data/nexus:/nexus-data sonatype/nexus3:latest
  c90c62f4bd5d3f09d3f0d562e5fe41401954898729ed9f7407ed71296f372883

Docker 返回容器的的 Hash ID,代表容器已經啟動,通過 http://serverip:8081 就能訪問Nexus了。

image_1d6t9ecpjtjio7jenvt5beh39.png-34.2kB

但是請求的時候拒絕我的請求,這個地方困擾了我很久。我第一步先排除是否是防火牆的問題。

$ firewall-cmd --state
  not running

使用命令查看防火牆沒有運行,第二步查看容器當前狀態。

$ docker container ls -a
  CONTAINER ID      IMAGE                    COMMAND                  CREATED             STATUS
  c90c62f4bd5d      sonatype/nexus3:latest   "sh -c ${SONATYPE_DI…"   27 minutes ago      Exited

發現這個容器的狀態變成 Exited 已經退出,找到問題所在可能是什么原因導致 nexus 沒有啟動起來。現在使用容器日志查一下掛掉的原因。

$ docker container logs c90c
  mkdir: cannot create directory '../sonatype-work/nexus3/log': Permission denied
  mkdir: cannot create directory '../sonatype-work/nexus3/tmp': Permission denied
  OpenJDK 64-Bit Server VM warning: Cannot open file ../sonatype-work/nexus3/log/jvm.log due to No   such file or directory

  Warning:  Cannot open log file: ../sonatype-work/nexus3/log/jvm.log
  Warning:  Forcing option -XX:LogFile=/tmp/jvm.log
  Unable to update instance pid: Unable to create directory /nexus-data/instances
  /nexus-data/log/karaf.log (No such file or directory)
  Unable to update instance pid: Unable to create directory /nexus-data/instances

從日志發現是因為 Nexus 在創建文件夾的時候沒有權限。這個應該是上面在創建文件夾的時候沒有分配權限導致的。下面我們給這個 /data/nexus 文件夾分配權限。

$ chown -R 200 /data/nexus
$ docker container start c90c62f4bd5d
  c90c62f4bd5d

重新啟動容器后,再次訪問一下 Nexus,下圖顯示可以打開 Nexus 。
我們現在發現 Nexus 可以支持很多倉庫格式。我們現在已經安裝完成了,下面我們來講怎么簡單使用 Nexus。

image_1d6tdu3ou13hghaoneqaol4u29.png-75.9kB

Nexus NuGet 倉庫簡單使用

下面將只會介紹一下怎么使用 NuGet ,至於使用 Nexus 其他倉庫請前往官方查看詳情文檔。

Nexus 默認帳號

Nexus 的默認管理員賬號 admin,密碼 admin123 。可以在 Nexus 管理界面右上角 Signin 按鈕可以登錄Nexus。登錄完成之后可以點擊下面圖片齒輪圖標,進行管理 Nexus 。
image_1d6ufd4ob65f1eo11rd61d654jl29.png-70.5kB

Repositories

點擊右菜單的 Repositories 按鈕可以看到 Nexus 內置的默認倉庫:
image_1d6ufpqqtpim10fv1u16rk57rb2m.png-75.9kB

Repositories 說明

Nexus 默認已經創建好了 Nuget 以及其他的倉庫,並且是創建了3個不同類型的倉庫:nuget-groupnuget-hostednuget.org-proxy

nuget.org-proxy:類型是 proxy,表示代理倉庫。我們向它請求包(package)的時候,如果本地有,它就從本地提供,如果本地沒有,它會從 nuget.org 下載到本地,然后給我提供這個包。

nuget-hosted:類型是 hosted,表示托管倉庫。我們一般把自己開發的包上傳到該倉庫中。

nuget-group:類型是 group,表示倉庫組,它結合了 nuget.org-proxy 和 nuget-hosted ,能對外提供上述兩者中的包。

小結:
nuget-hosted 負責包上傳,nuget.org-proxy 負責代理從 nuget.org 下載包到 Nexus 緩存中,nuget-group 負責提供包。一般使用 nuget-group 提供的 URL 就可以了,它可以把私服和公共庫進行合並。

上傳組件包(Package)

准備 Package

  1. 先使用 Visual Studio 創建一個 類庫項目 命名為 NexusTest

    image_1d6uh2cuf1bd3g8qh7g15rm1cgp33.png-63.4kB

  2. 解決方案資源管理器 選中 NexusTest 項目右擊點擊屬性。進入項目設置頁選擇 打包 選項卡。勾選 在版本中勝出NuGet包

    image_1d6uh89b0130alu6cram01nng3g.png-48.2kB

  3. 解決方案資源管理器 選中 NexusTest 項目右擊點擊 生成。生成成功之后在本項目的 bin\Debug 目錄下找到 NexusTest.1.0.0.nupkg Nuget 文件,代表 Package 已經准備完成。

上傳 Package

  1. 添加 Nuget Realms,因為 Nexus 認證 Nuget 是通過 Realms 來認證,因此要添加 Nuget Realms。

    image_1d6uhik1o1k1b1d092p3134ilec3t.png-71.1kB

  2. Upload 選中 nuget-hosted 點擊進入,為什么要選中 nuget-hosted 上面已經說明。

    image_1d6uhocv6nde1tv73rl1pjpq5b4a.png-35kB

  3. 把上面准備好的 NexusTest.1.0.0.nupkg Nuget 文件上傳到 Nexus。

    image_1d6uhrnkdua1mqi4863dk8074n.png-40.1kB

  4. 第三步上傳成功,在 Browse 選中 nuget-hosted 點擊進入。可以查看到已經上傳成功。

    image_1d6ui0b9115pqou7sosvv81iu954.png-36.9kB

使用 Package

  1. 獲取 Nuget 程序包源地址,在 Nexus 的 Browse 找到 nuget-group 獲取到地址。

    image_1d6uictt81cujgb9knu70tr46b.png-76.8kB

  2. Visual StudioNuget 管理器,點擊齒輪進行設置 Nexus 地址。

    image_1d6ui6rtcirn2bj15hc1lvfj025u.png-87.6kB

  3. 添加 Nexus 私有 Nuget 倉庫地址。

    image_1d6uigtcr42ljbt1h521nnc1jfd6o.png-51.2kB

  4. 通過 Nuget 管理器 查詢一下剛剛我們上傳的 NexusTest 包。

    image_1d6uikibhki17jmsal1u76f3e75.png-87kB


總結

Nexus 基本可以滿足企業的私服需求,而且還有一個可視化工具進行管理,降低企業管理成本。

引用:
Nexus 鏡像詳細說明:https://hub.docker.com/r/sonatype/nexus3/
使用 Nexus 搭建私有 Nuget 倉庫:http://www.cnblogs.com/Erik_Xu/p/9211471.html
Linux的權限:https://www.cnblogs.com/lhm166/articles/6605059.html
關閉防火牆:https://blog.csdn.net/ytangdigl/article/details/79796961


>原文:https://www.zybuluo.com/aqa510415008/note/1438493


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM