Nexus oss倉庫管理平臺搭建
Nexus是一款倉庫管理工具,支援Npm,bower,maven,nuget,apt,yum甚至docker,helm等各種倉庫,說的通俗以下,就是私服映象倉庫.並且有免費版,OSS版即為免費版,下載的時候請注意版本的選擇.
往下面滾動頁面,可以看到Choose your Nexus
,有osx,windows和unix版本可供選擇.這裡我選擇的是windows
版本.
下載的內容是一個壓縮包,下載完成後把壓縮包解壓.解壓後有兩個資料夾,我們進入nexus-3.x.x
資料夾下的bin
目錄,我們在當前目錄下開啟cmd
或者從任意位置開啟cmd,然後cd到上述目錄.執行nexus.exe /run
來安裝nexus
註冊服務
安裝完成以後,執行nexus.exe /install Nexus Service
來註冊服務
啟動服務
執行命令nexus.exe /start Nexus Service
來啟動服務
通過以上操作,實際上是往windows服務裡面新增了一個名字叫作
nexus service
的服務,我們可以通過powerhsell命令Get-Service "nexus service"
來找到這個服務,通過Restart-Service "nexus service"
來重啟它.
以上執行完成以後,就可以通過開啟瀏覽器,輸入localhost:8081
來訪問它,也可以通過其它區域網主機使用IP:8081
方式來訪問它.
通過首頁,我們可以看到Nexus羅列出來的支援的倉庫型別,非常豐富.
注意,大家可能看到我訪問的埠號並不是
8081
而是8443,這是因為我設定的http自動跳轉到https,並且指定的https埠為8443
,這裡之所以要啟用https是因為下面即將講到的docker映象上傳需要使用https.這部分內容將在下一節講解.
登陸
注意,如果沒有登陸,Nexus並不是以顯著的方式提示你登陸,但是非登陸使用者功能受限.要想實現一些管理功能,必須登陸.登陸需要點選右上角
sign in
按鈕.預設登陸使用者名稱為admin
密碼為admin123
.
Nexus搭建docker映象倉庫
上一節我們講了如何在windows下安裝nexus,本節我們講解如何來搭建nexus來搭建docker映象倉庫.
我們進入web管理介面,點選齒輪
圖示,然後點選Repositories
.如下圖示
注意,以上操作需要登陸.登陸方式為點選右上角
sign in
,然後用預設admin
,admin123
登陸.詳細請見上一節內容
然後點選create repository
按鈕.如下圖操作
頁面出來了非常多的倉庫型別供選擇,由於我們要建立的是docker倉庫,這裡選擇的是docker hosted
點選後出現如下介面
配置上面填寫的內容,填寫完成後我們點選左下角create repository
來建立倉庫
nexus伺服器支援https配置
由於我們使用的是https方式通訊,因此我們需要對nexus伺服器進行配置,以支援https.由於我們的證照是自己生成的,因此docker客戶端也需新增對自己生成key的信任.
服務端開啟監聽ssl協議埠
進到nexus-xxx-xxx
目錄下(前面一節提到的從官網下載的nexus壓縮包解壓後的一個目錄),進到ect
目錄下,裡面有一個nexus-default.properties
檔案,用文字編輯器開啟它
在# Jetty section
註釋下面新增一行,內容為application-port-ssl=8443
在nexus-args
一行尾部新增,${jetty.etc}/jetty-http-redirect-to-https.xml
,以指示伺服器自動將http跳轉到https
生成證照祕鑰
網上有很多生成密碼證照的部落格文章,使用的工具也不盡相同.這裡,我們使用java jkd自帶的keytool.exe
來生成ssl證照.
進入到nexus-xxx-xxx
目錄下的ect/ssl
目錄下,執行以下命令:
keytool -genkeypair -keystore keystore.jks -storepass nexus3 -keypass nexus3 -alias jetty -keyalg RSA -keysize 2048 -validity 5000 -dname "CN=${NEXUS_DOMAIN}, OU=Example, O=Sonatype, L=Unspecified, ST=Unspecified, C=US" -ext "SAN=DNS:${NEXUS_DOMAIN},IP:${NEXUS_IP_ADDRESS}" -ext "BC=ca:true"
其中${NEXUS_IP_ADDRESS}
替換為你的實際ip地址,${NEXUS_DOMAIN}如果沒有域名可以隨便填寫
需要注意的是,如果由於環境變數配置問題導致
keytool
命令找不到,則需要顯式指定keytool.exe
完整路徑,然後後面帶上要執行的命令.
修改jetty-https.xml
進入到nexus-xxx-xxx
目錄下的etc/jetty
目錄下,用文字編輯器開啟jetty-https.xml
檔案
把裡面對應的內容修改為如下配置:
<Set name="KeyStorePath"><Property name="karaf.etc"/>/ssl/keystore.jks</Set>
<Set name="KeyStorePassword">nexus3</Set>
<Set name="KeyManagerPassword">nexus3</Set>
<Set name="TrustStorePath"><Property name="karaf.etc"/>/ssl/keystore.jks</Set>
<Set name="TrustStorePassword">nexus3</Set>
注意以上內容全是修改,而不是新增,修改的時候找到相同key的修改即可.
重啟nexus伺服器
可以通過上一節介紹的powershell命令Restart-Service "nexus service
來重啟服務,以使配置生效.
需要注意的是,執行以上命令需要以管理員身份啟動powershell.除了使用命令以外,也可以進入到服務管理裡面找到名為
nexus service
的服務,然後手動重啟它.
執行完以上配置以後,我們再開啟瀏覽器訪問https://..localhost:8443
或者http://localhost:8081
注意,重啟服務以後,如果以上內容不能馬上響應,可以等一會時間再觀察看看.
配置客戶端信任ca證照
我的docker伺服器安裝在192.168.122.65
上面.下面介紹centos和ubuntu下如何新增證照信任
centos下新增證照信任
#生成cert檔案
[root@localhost ~]# keytool -printcert -sslserver 192.168.124.43:8443 -rfc >nexus.crt
[root@localhost ~]# yum install ca-certificates
[root@localhost ~]# update-ca-trust force-enable
# 還可以放在/etc/docker/certs.d/192.168.124.43:8443目錄下
[root@localhost ~]# mv nexus.crt /etc/pki/ca-trust/source/anchors/nexus.crt
[root@localhost ~]# update-ca-trust
[root@localhost ~]# service docker restart
[root@localhost ~]# docker login -u admin -p admin123 192.168.124.43:8002
Login Succeeded
ubuntu下新增信任證照
對於Ubuntu系統來說certificate的存放路徑是 /usr/local/share/ca-certificates
### 生成cert檔案
[root@localhost ~]# keytool -printcert -sslserver 192.168.124.43:8443 -rfc >nexus.crt
# 還可以放在/etc/docker/certs.d/192.168.124.43:8443目錄下
[root@localhost ~]# mv nexus.crt /usr/local/share/ca-certificates/nexus.crt
[root@localhost ~]# update-ca-certificates
[root@localhost ~]# service docker restart
[root@localhost ~]# docker login -u admin -p admin123 192.168.124.43:8002
在redhat系統中,如果報Unkonw authority錯誤,修改
/etc/pki/tls/openssl.cnf
。在其中的[ v3_ca]
部分,新增subjectAltName
選項
[ v3_ca ]
subjectAltName = IP:192.168.124.43
然後再執行以下命令
[root@localhost ~]# service docker restart
[root@localhost ~]# docker login -u admin -p admin123 192.168.124.43:8002
Login Succeeded
注,網上有不少介紹使用http訪問的方法,但是卻沒有執行成功,大家可以嘗試一下
[root@localhost centos]# vi /etc/docker/daemon.json
{
"insecure-registries": [
"192.168.124.43:8003"
],
"disable-legacy-registry": true
上傳映象到docker倉庫
- 為映象打標籤
docker tag 映象名:tag名 192.168.124.43:8002/映象名:tag名
我裡,我沒有自己建立映象,而是隨便找了一個已以存在的映象,然後打上標籤,如下
192.168.124.43:8002/rancher/nginx-ingress-controller-defaultbackend
通過執行docker push
命令把它推到遠端私服倉庫
[root@localhost ~]# docker push 192.168.124.43:8002/rancher/nginx-ingress-controller-defaultbackend
The push refers to a repository [192.168.124.43:8002/rancher/nginx-ingress-controller-defaultbackend]
d62604d5d244: Pushed
1.4: digest: sha256:f63ced70bc85ca753e715c93b0adc3115510a6575129102383236c30112379e5 size: 528
[root@localhost ~]#
注意,推送前是需要先登陸的,登陸的方法上面也介紹過了
我們登陸nexus web管理介面,點選左側Broswe
,可以看到已經有內容push進來了
我們執行docker search
命令
[root@localhost ~]# docker search 192.168.124.43:8002/rancher/nginx-ingress-controller-defaultbackend
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
192.168.124.43:8002/rancher/nginx-ingress-controller-defaultbackend:1.4 0
[root@localhost ~]#
可以看到能夠從遠端伺服器上搜尋到它.
拉取上傳的映象
實際環境中,生成docker映象和伺服器和使用docker映象的伺服器往往不是同一臺伺服器.這裡我們使用另一個伺服器192.168.124.59
來拉取剛剛上傳的映象
需要注意的是,這裡基於的前提是用於拉取映象的伺服器已經安裝了docker,docker的安裝可以參考其它章節或者網路上的教程
執行
keytool -printcert -sslserver 192.168.59.1:8443 -rfc >nexus.crt
執行
yum install ca-certificates
來安裝
-緊接著執行update-ca-trust force-enable
執行
mv nexus.crt /etc/pki/ca-trust/source/anchors/nexus.crt
- 執行
update-ca-trust
- service docker restart
執行login
docker login -u admin -p admin123 192.168.124.43:8002
[root@k8s-master ~]# docker login -u admin -p admin123 192.168.124.43:8002
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
然後我們執行docker pull
[root@k8s-master ~]# docker pull 192.168.124.43:8002/rancher/nginx-ingress-controller-defaultbackend:1.4
1.4: Pulling from rancher/nginx-ingress-controller-defaultbackend
5990baa43a5e: Pull complete
Digest: sha256:f63ced70bc85ca753e715c93b0adc3115510a6575129102383236c30112379e5
Status: Downloaded newer image for 192.168.124.43:8002/rancher/nginx-ingress-controller-defaultbackend:1.4
[root@k8s-master ~]#
注意pull的時候要帶上版本的tag
以上,我們從一臺伺服器(192.168.122.65)推送映象到私服,然後用另一臺伺服器拉取(192.168.124.59).需要注意的是,由於服務端使用了自已生成的https證照,因此docker映象生產端和消費端都要新增ca證照信任