Skip to content

Docker Nexus 部署指南

🕒 发布时间: 🕒 阅读时间: 0 分钟✍︎ 文章字数: 0

部署nexus3

nexus3支持多种安装方法,这次选择使用docker 安装

1. 配置docker compose 配置文件

创建一个docker-compose.yml,填入以下内容

YAML
version: '3.1'

services:
  nexus3:
image: sonatype/nexus3
ports:
  - 8081:8081
  - 8088:8088
  - 8082:8082
volumes:
  - ./nexus-data:/nexus-data
restart: always

volumes:
  nexus-data:

在docker-compose同目录下,创建nexus-data文件夹,用来挂载nexus3的数据。

由于linux有严格的权限管理,容器无法获取到物理目录的权限。

所以使用一行命令开放挂载文件夹的权限

Bash
chmod 777 ./nexus-data

这会带来一定的安全风险,在末尾我会放出参考文章,待寻找有更好的方案。

2. 启动服务

在上一步完成后,在docker-compose.yml同目录输入

Bash
docker compose up

如果控制台出现了如下内容

Bash
nexus-rp-nexus3-1  | -------------------------------------------------
nexus-rp-nexus3-1  | 
nexus-rp-nexus3-1  | Started Sonatype Nexus OSS 3.50.0-01
nexus-rp-nexus3-1  | 
nexus-rp-nexus3-1  | -------------------------------------------------

代表服务启动成功,下次启动可以用

Bash
docker compose up -d
// -d 代表在后台启动

启动成功访问 http://127.0.0.1:8081,就会看到如下页面

3. 修改管理员密码

启动成功后,我们还要去获取管理员密码。

在nexus3开始,密码不再是默认的adminxxx,需要手动去读取文件获取密码。

Bash
# 进入容器
docker compose exec nexus3 /bin/bash

# 获取密码
cat /opt/sonatype/sonatype-work/nexus3/admin.password
# eg:338f5b2b-29ec-42c3-8171-4b23967f99a7

就会获取到一串密码,点击页面右上角sign in就可以登录

txt
用户名:admin
密码:获取到的密码

登录成功后,会让你重新自定义一个密码,然后就可以开始部署私有仓库。

搭建docker 私有仓库

1. 创建对象存储

这一步在与给docker私有仓库创建对应的存储位置。

在nexus3登录管理员账户后,点击设置

导航至 _Repository-->Blob Stores,_配置对象存储。

点击右上角的"Create Blob Store",选择File类型,创建一个名为"docker-blob"的Blob。

最好开启内存警告,避免硬盘占满。

如图:

2. 创建仓库(私有、代理、群组)

在开始前,先说清楚在nexus3中创建仓库的三个概念。

如图

  • Group: 群组,用于拉取Proxy和hosted仓库的内容,一般只用来拉取。
  • Proxy: 代理仓库,用于从官方仓库拉取镜像并在本地保存,限制为只读。
  • Hosted 私有仓库,用于保存私有镜像

2.1 创建私有仓库(hosted)

导航到Repository -> Repositories,点击右上角的"Create repository",

选择"docker (hosted)",然后如图填入对应参数

在这其中

  • Name 是仓库名,任意取,必填
  • Http 是传输协议,填入对应端口,就可以用独立端口去访问。
  • Blob Store 存储对象,选择第一步所创建的存储对象。
  • Enable Docker V1 API 兼容性选项,建议打勾。

这样就创建好了一个私有仓库。

2.2 创建代理仓库

与第一步相同,在选择仓库类型时候选择"docker (proxy)",然后如图填入对应参数:

重复参数和上一步一样,就不再介绍,介绍主要参数。

  • Remote storage 被代理的远程仓库地址,这里填入"https://registry-1.docker.io"
  • Http 可以不填,一般都会访问Group服务器

2.3 创建群组仓库

创建仓库时,选择"docker(group)",然后如图填入对应参数:

  • Group 群组成员,访问的话就会去members里的仓库里拉取
  • Http 端口填8082 ,这样访问时候就用8082端口。

这样一个群组仓库就创建完成了。

3. 测试仓库可用性

3.1 测试是否可以连接

Bash
docker login -u admin -p adminxxx 127.0.0.1:8088 #hosted
docker login -u admin -p adminxxx 127.0.0.1:8082 #group

# 出现以下内容就连接成功
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/Deer404/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

3.2 测试拉取镜像

拉取文件

Bash
docker pull 127.0.0.1:8082/redis

# 出现以下内容就代表代理仓库拉取成功
Using default tag: latest
latest: Pulling from redis
Digest: sha256:7b83a0167532d4320a87246a815a134e19e31504d85e8e55f0bb5bb9edf70448
Status: Image is up to date for 127.0.0.1:8082/redis:latest
127.0.0.1:8082/redis:latest

查看一下,代理仓库的内容,如图就代表拉取成功。

3.3 测试推送镜像

Bash
# docker推送前,要给镜像打tag
docker tag python 127.0.0.1:8088/python
# 推送前记得docker login hosted仓库
docker push 127.0.0.1:8088/python

# 出现以下内容就成功了
The push refers to repository [127.0.0.1:8088/python]
7db0b7dc960a: Pushed 
76ff57e73979: Pushed 
13cf5de1dd97: Pushed 
5c563cc8b216: Pushed 
d4514f8b2aac: Pushed 
5ab567b9150b: Pushed 
a90e3914fb92: Pushed 
053a1f71007e: Pushed 
ec09eb83ea03: Pushed 
latest: digest: sha256:aa25de88a84b4c966ce581bda763553da7a093a06315adec8830c3d39b832196 size: 2218

这样一个docker私有仓库就算搭建完成了。

搭建npm 私有仓库

通过搭建docker仓库,基本步骤以及熟悉,接下来简化流程,只讲参数 npm包连接可以不用独立端口,所以都可以不勾选http。

1. 创建对象存储

导航至 _Repository-->Blob Stores,_配置对象存储。

点击右上角的"Create Blob Store",选择File类型,创建一个名为"npm-blob"的Blob。

最好开启内存警告,避免硬盘占满。

如图:

2. 创建仓库(私有、代理、群组)

2.1 创建私有仓库(hosted)

导航到Repository -> Repositories,点击右上角的"Create repository",

选择"npm (hosted)",然后如图填入对应参数

在这其中

  • Name 是仓库名,任意取,必填

  • Http 是传输协议,填入对应端口,就可以用独立端口去访问。(选填)

  • Blob Store 存储对象,选择第一步所创建的存储对象。

  • Deployment policy 控制部署和更新的权限,建议是"Allow redeploy"

这样就创建好了一个私有仓库。

2.2 创建代理仓库

与第一步相同,在选择仓库类型时候选择"npm (proxy)",然后如图填入对应参数:

重复参数和上一步一样,就不再介绍,介绍主要参数。

2.3 创建群组仓库

创建仓库时,选择"npm(group)",然后如图填入对应参数:

  • Group 群组成员,访问的话就会去members里的仓库里拉取 这样一个群组仓库就创建完成了。

3. 测试仓库可用性

3.1 设置为远程仓库

Bash
npm config set registry http://127.0.0.1:8081/repository/npm-group/

npm config get registry
http://127.0.0.1:8081/repository/npm-group/

3.2 测试拉取仓库

Bash
npm install -g live-server

# 出现以下内容就是安装成功
added 204 packages in 8s

查看一下,代理仓库的内容,如图就代表拉取成功。

3.3 测试推送npm包

推送到npm包前,需要先去nexus创建新用户和添加对npm用户的授权。

导航到Security -> Realms里,添加对npm Token的鉴权,如图:

然后,导航到Security -> User里,点击“Create local user”,在跳转的表单里,填入如下图参数:

  • ID npm登录时的用户名
  • Email npm登录时的邮箱
  • Password npm登录时的密码
  • Status 账户状态,选择"Active",激活账户。
  • Roles: 用户组添加,添加到nx-admin。

完成上两步操作以后,就可以开始测试推送npm包了。 创建一个项目文件夹,名为"js-demo-lib"。 使用npm yarn等包管理工具初始化项目,例如:

Bash
npm init

在生成的"package.json"里,修改以下内容:

JSON
// package.json
"type":"module",
// 设置推送仓库
 "publishConfig": {
"registry": "http://localhost:8081/repository/npm-hosted/"
  }

打开终端,输入以下命令

Bash
npm adduser --registry=http://localhost:8081/repository/npm-hosted/

# 成功会出现如以下内容 eg:
Username: deer
Password:
Email: (this IS public) [email protected]
Logged in as deer on http://localhost:8081/repository/npm-hosted/.

接着在项目根目录,输入

Bash
npm publish

# 成功会出现以下内容 eg:
npm notice 
npm notice 📦  [email protected]
npm notice === Tarball Contents === 
npm notice 92B  index.js
npm notice 315B package.json
npm notice === Tarball Details === 
npm notice name:  js-demo-lib 
npm notice version:   1.0.0   
npm notice filename:  js-demo-lib-1.0.0.tgz   
npm notice package size:  396 B   
npm notice unpacked size: 407 B   
npm notice shasum:3422c6806526147eb226da09d5df396be8f3d064
npm notice integrity: sha512-yM9HeFBcX14nC[...]tr0FZbG25YhYQ==
npm notice total files:   2   
npm notice 
npm notice Publishing to http://localhost:8081/repository/npm-hosted/

这样就推送成功到了私有仓库,我们可以验证一下。 导航到 Browse -> npm-hosted,如图:

成功推送!这样一个npm私有仓库就算完成了,平常拉取都是从group仓库,只有推送时,才使用hosted仓库。

参考文章

  1. 解决docker compose volume 权限问题: https://stackoverflow.com/questions/66004339/docker-compose-permission-denied-with-volume

Last updated: