1. 下载 nexus3 镜像

docker pull sonatype/nexus3

2. 新建挂载目录

这里将 nexus 的目录挂载到宿主机的​​/usr/soft/nexus-data​​文件夹下,并修改文件夹权限

mkdir -p /usr/soft/nexus-data && chmod 751 /usr/soft/nexus-data

3. 创建容器

这里使用了宿主机的8081端口,可随意修改为自己需要的端口,不过要与后面上传私服的jar包的脚本命令里面要保持一致。

docker run -d \
--privileged=true \
--restart=always \
--name test-nexus3 \
-p 8081:8081 \
-v /etc/localtime:/etc/localtime \
-v /usr/soft/nexus-data:/nexus-data \
sonatype/nexus3

运行成功后,可以查看容器日志,看下nexus是否正常启动: ​​docker logs --since 3m 65219e8d6b41​​ ,正常会打印nexus启动成功的信息。

2021-10-25 02:49:47,323+0000 INFO  [jetty-main-1] *SYSTEM org.sonatype.nexus.siesta.SiestaServlet - Initialized
2021-10-25 02:49:47,330+0000 INFO [jetty-main-1] *SYSTEM org.sonatype.nexus.repository.httpbridge.internal.ViewServlet - Initialized
2021-10-25 02:49:47,372+0000 INFO [jetty-main-1] *SYSTEM org.eclipse.jetty.server.handler.ContextHandler - Started o.e.j.w.WebAppContext@35c1e7bf{Sonatype Nexus,/,file:///opt/sonatype/nexus/public/,AVAILABLE}
2021-10-25 02:49:47,421+0000 INFO [jetty-main-1] *SYSTEM org.eclipse.jetty.server.AbstractConnector - Started ServerConnector@122436cd{HTTP/1.1, (http/1.1)}{0.0.0.0:8081}
2021-10-25 02:49:47,421+0000 INFO [jetty-main-1] *SYSTEM org.eclipse.jetty.server.Server - Started @39348ms
2021-10-25 02:49:47,422+0000 INFO [jetty-main-1] *SYSTEM org.sonatype.nexus.bootstrap.jetty.JettyServer -
-------------------------------------------------

Started Sonatype Nexus OSS 3.30.1-01

-------------------------------------------------

上面命令中没有挂载时区的话,日志时间与当前时间会相差8小时,然后访问 http://IP:8081/ 就可以看到nexus的欢迎页 进行登录,修改用户密码。

Docker 安装 nexus 私服_java

如果上面挂载出来了​​/nexus-data​​ 目录,可以直接在宿主机的文件夹里面查看admin的密码:见 admin.password 文件内容

[10:51:05][root@nexus nexus-data]# 
[10:51:10][root@nexus nexus-data]# docker ps
[10:51:10]CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[10:51:10]65219e8d6b41 sonatype/nexus3 "sh -c ${SONATYPE_DI…" 9 minutes ago Up 2 minutes 0.0.0.0:8081->8081/tcp test-nexus3
[10:51:18][root@nexus nexus-data]# docker exec -it 65219e8d6b41 bash
[10:51:20]bash-4.4$ ls
[10:51:20]bin dev help.1 lib licenses media nexus-data proc run srv tmp uid_template.sh var
[10:51:20]boot etc home lib64 lost+found mnt opt root sbin sys uid_entrypoint.sh usr
[10:51:22]bash-4.4$ cd nexus-data/
[10:51:23]bash-4.4$ ls
[10:51:23]admin.password blobs cache db elasticsearch etc generated-bundles instances javaprefs karaf.pid keystores lock log orient port restore-from-backup tmp
[10:51:25]bash-4.4$ cat admin.password
[10:51:25]admin123456

admin.password 文件的内容就是我们登录的admin账号的初始密码,第一次登录的时候可以用这个,登录成功后,会提示修改密码,如果自定义了用户密码后,这个文件就会自动删除了。

登录之后,可以看到这里是空的:

Docker 安装 nexus 私服_java_02


当然如果是上传单独的jar包,nexus 3.0后仅支持网页端 手动上传,不能直接上传至服务器了。手动上传直接点击菜单栏的​​Upload​​,

Docker 安装 nexus 私服_上传_03


填写相关信息,选择上传的jar包文件,即可。

Docker 安装 nexus 私服_docker_04


这种方式,在我们后面新增第三方包的时候,可以这样整,第一次我们可以批量上传本地仓库的jar包到私服里面。

4. 上传本地的maven仓库jar包到maven私服

这里可以直接将本地仓库里面的jar包压缩后上传至服务器某个目录,然后使用命令批量将jar包上传至刚才搭建好的私服里。

  • 新建临时文件夹,用来存放本地仓库的压缩包
mkdir update-maven-LocalRepository
  • 上传压缩包,并解压
[11:13:02][root@nexus update-maven-LocalRepository]# ls
[11:13:03]LocalRepository.rar
[11:13:41][root@nexus update-maven-LocalRepository]# unrar x LocalRepository.rar
  • 解压成功后目录如下,LocalRepository 文件夹下即为各种jar包,文件夹自定义,然后对应即可:
[11:18:35][root@nexus rar]# cd /usr/soft/update-maven-LocalRepository/
[11:18:36][root@nexus update-maven-LocalRepository]# ls
[11:18:37]LocalRepository LocalRepository.rar

Docker 安装 nexus 私服_容器_05

  • 接着在 LocalRepository 文件夹下新建自动化上传脚本:​​mavenimport.sh​​,此脚本可以循环遍历当前目录所有的jar 然后自动配置,上传至maven私服。
[11:19:32][root@nexus update-maven-LocalRepository]# cd LocalRepository
[11:19:48][root@nexus LocalRepository]# vim mavenimport.sh

脚本内容:

#!/bin/bash
# copy and run this script to the root of the repository directory containing files
# this script attempts to exclude uploading itself explicitly so the script name is important
# Get command line params
while getopts ":r:u:p:" opt; do
case $opt in
r) REPO_URL="$OPTARG"
;;
u) USERNAME="$OPTARG"
;;
p) PASSWORD="$OPTARG"
;;
esac
done

find . -type f -not -path './mavenimport\.sh*' -not -path '*/\.*' -not -path '*/\^archetype\-catalog\.xml*' -not -path '*/\^maven\-metadata\-local*\.xml' -not -path '*/\^maven\-metadata\-deployment*\.xml' | sed "s|^\./||" | xargs -I '{}' curl -u "$USERNAME:$PASSWORD" -X PUT -v -T {} ${REPO_URL}/{} ;

给脚本添加执行权限:​​chmod +x mavenimport.sh​

5. 执行脚本,上传本地仓库jar包

根据已配置的账号密码,及实际ip+port,启动脚本

./mavenimport.sh -u admin -p admin123456 -r http://127.0.0.1:端口/repository/maven-releases/

其中admin123456是我这里设置的密码。然后就会自动打印上传信息,等待脚本执行完毕,可以看到nexus私服中已存在刚才我们上传的jar包信息了。

Docker 安装 nexus 私服_上传_06

使用的话,直接在本地电脑安装的maven配置文件里面添加对应的地址和账号即可。

  • 在 ​​servers​​ 节点里面新增用户名和密码:
<server>
<id>nexus</id>
<!-- 用户名和密码 -->
<username>admin</username>
<password>admin123</password>
</server>
  • 在节点 ​​profiles​​ 里添加nexus地址:
<profile>
<id>test_nexus</id>
<repositories>
<repository>
<id>nexus</id>
<name>maven-public</name>
<url>http://IP:端口/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
  • 激活仓库, 在 ​​profiles​​​ 节点下面新增 ​​activeProfiles​​ 节点,这步如果不操作,是无法从nexus上面拉取jar包的。
<activeProfiles>
<!-- 激活仓库 id要对应 -->
<activeProfile>test_nexus</activeProfile>
</activeProfiles>

然后可以测试是否能正常从nexus 上拉取jar包了。这里我直接将本地配置的 ​​mirror​​ 节点信息注释掉了,原来配的是阿里云的镜像仓库。

前面提到,上传jar包只能使用网页端登录后,手动上传了,那么上传后的文件到哪里去了呢?

[11:39:33]bash-4.4$ cd nexus-data/
[11:39:34]bash-4.4$ ls
[11:39:34]blobs cache db elasticsearch etc generated-bundles instances javaprefs karaf.pid keystores lock log orient port restore-from-backup tmp
[11:39:46]bash-4.4$ cd blobs/
[11:39:47]bash-4.4$ ls
[11:39:47]default
[11:39:49]bash-4.4$ cd default/
[11:39:49]bash-4.4$ ls
[11:39:49]D2F3C4CA-703D3B6C-B4E7F095-6C75BF1C-04819336-deletions.index D2F3C4CA-703D3B6C-B4E7F095-6C75BF1C-04819336-metrics.properties content metadata.properties
[11:39:56]bash-4.4$ cd content/
[11:39:58]bash-4.4$ ls
[11:39:58]tmp vol-03 vol-06 vol-09 vol-12 vol-15 vol-18 vol-21 vol-24 vol-27 vol-30 vol-33 vol-36 vol-39 vol-42
[11:39:58]vol-01 vol-04 vol-07 vol-10 vol-13 vol-16 vol-19 vol-22 vol-25 vol-28 vol-31 vol-34 vol-37 vol-40 vol-43
[11:39:58]vol-02 vol-05 vol-08 vol-11 vol-14 vol-17 vol-20 vol-23 vol-26 vol-29 vol-32 vol-35 vol-38 vol-41
[11:40:11]bash-4.4$
[11:40:11]bash-4.4$
[11:40:21]bash-4.4$ cd vol-03/
[11:40:22]bash-4.4$ ls
[11:40:22]chap-01 chap-04 chap-07 chap-10 chap-13 chap-16 chap-19 chap-22 chap-25 chap-28 chap-31 chap-34 chap-37 chap-40 chap-43 chap-46
[11:40:22]chap-02 chap-05 chap-08 chap-11 chap-14 chap-17 chap-20 chap-23 chap-26 chap-29 chap-32 chap-35 chap-38 chap-41 chap-44 chap-47
[11:40:22]chap-03 chap-06 chap-09 chap-12 chap-15 chap-18 chap-21 chap-24 chap-27 chap-30 chap-33 chap-36 chap-39 chap-42 chap-45
[11:40:29]bash-4.4$ cd chap-01
[11:40:30]bash-4.4$ ls
[11:40:30]1179a4bf-8264-4769-acc6-e2c6d7a235e9.bytes 45519cd9-30ba-4751-9916-6cea2ce2e2c7.bytes bdc80889-cbc7-48fb-b7c0-95e5fb5bd1cf.bytes
[11:40:30]1179a4bf-8264-4769-acc6-e2c6d7a235e9.properties 45519cd9-30ba-4751-9916-6cea2ce2e2c7.properties bdc80889-cbc7-48fb-b7c0-95e5fb5bd1cf.properties
[11:40:30]1ac35681-ca18-477a-9e72-d7ff2dfc6015.bytes 59edbd37-ff46-4440-bbb7-58849821cb31.bytes cb2eb78d-cdfd-488a-b995-2ba02516fc75.bytes
[11:40:30]1ac35681-ca18-477a-9e72-d7ff2dfc6015.properties 59edbd37-ff46-4440-bbb7-58849821cb31.properties cb2eb78d-cdfd-488a-b995-2ba02516fc75.properties
[11:40:30]30bd1bd8-c135-4b71-ad78-403b931ef953.bytes 608aa46d-238e-40f5-af85-b6c558cd3a5c.bytes da9a146a-85e0-4f10-937c-e962326d7fd2.bytes
[11:40:30]30bd1bd8-c135-4b71-ad78-403b931ef953.properties 608aa46d-238e-40f5-af85-b6c558cd3a5c.properties da9a146a-85e0-4f10-937c-e962326d7fd2.properties
[11:40:30]430ff506-9e8d-4c91-9c61-c32f24d3aade.bytes a7056f20-f971-4abb-898d-d1d2d7ea4c4c.bytes fd3efea6-7c57-4ac1-bd84-6a529c84974b.bytes
[11:40:30]430ff506-9e8d-4c91-9c61-c32f24d3aade.properties a7056f20-f971-4abb-898d-d1d2d7ea4c4c.properties fd3efea6-7c57-4ac1-bd84-6a529c84974b.properties
[11:40:34]bash-4.4$ cd /

这里看到的 ​​.bytes​​ 结尾的文件,就是我们上传的jar包,对于我们不是可读的,对于nexus是可读的。这也就是为什么我们不能像原来一样手动放置jar包到服务器上的原因了。