安装nexus3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mkdir -p /usr/local/nexus3
chown -R 200 /usr/local/nexus3

docker run -d \
--privileged=true \
--name=nexus3 \
-u root \
-p 8081:8081 \
# 这几个端口给docker私有仓库使用,在创建仓库时指定,并且在Dockers中需要添加配置 "insecure-registries": ["ip:port"]
-p 8001:8001 \
-p 8002:8002 \
-p 8003:8003 \
# 启动容器时加入时间挂载,使用宿主机时间
-v /etc/localtime:/etc/localtime:ro \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro \
-v /usr/local/nexus3/nexus-data:/nexus-data \
-v /usr/local/nexus3/sonatype:/opt/sonatype \
-e INSTALL4J_ADD_VM_PARAMS="-Xms512M -Xmx512M -XX:MaxDirectMemorySize=2048M" \
docker.io/sonatype/nexus3

登录仓库页面:http://ip:8081
默认账号admin,初始密码则存在容器中的 /nexus-data/admin.password 文件中。

问题补记

问题:nexus启动失败,报错 cannot open local storage ‘/nexus-data/db/{config或者component}‘ with mode=rw

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 切记在磁盘满了的情况不要随意清除blob下vol文件,但可以尝试拷贝出去,之后启动nexus成功后再拷贝回来

java -jar /usr/local/sonatype/nexus/lib/support/nexus-orient-console.jar
# 有时候在连接数据库这一步会报错,错误内容跟最初的错误很类似,但主要信息是这段:Storage '{config或者component}' was not closed properly. Will try to recover from write ahead log...,此时需要进入到数据库的文件目录,删除*.wal文件,然后重新打开console工具,执行修复
# rm -rf /usr/local/nexus3/nexus-data/db/{config或者component}/*.wal
orientdb> CONNECT PLOCAL:/usr/local/nexus3/nexus-data/db/{config或者component} admin admin
orientdb> rebuild index *
orientdb> repair database --fix-links
orientdb> repair database --fix-graph
orientdb> repair database --fix-ridbags
orientdb> repair database --fix-bonsai
orientdb> disconnect

chmod 777 -R /usr/local/nexus3/nexus-data/db

# 如果修复后依旧启动失败可尝试重建
java -jar /usr/local/sonatype/nexus/lib/support/nexus-orient-console.jar
orientdb> CONNECT PLOCAL:/usr/local/nexus3/nexus-data/db/{config或者component} admin admin
orientdb> export database config-export
orientdb> drop database
orientdb> create database plocal:/usr/local/nexus3/nexus-data/db/{config或者component} admin admin
orientdb> import database config-export.json.gz -preserveClusterIDs=true
orientdb> rebuild index *
orientdb> disconnect

# 注:如果有多个数据库被损坏,重复上面的步骤,即可,注意修改数据库文件夹的目录。此时基本解决了所有启动问题,重新启动Nexus服务即可

docker仓库规划(一)

在Nexus3中支持3种Docker仓库:

  • hosted:本地仓库,同Docker官方仓库一样。
  • proxy:代理仓库,提供代理其他仓库的功能,如我内网只有一台主机能上网,其他主机不能上网,则可以在可以上网的主机上面配置这种代理仓库,然后别的不能上网的主机就可以通过该代理仓库下载docker镜像了。
  • group:聚合仓库,将多个仓库组合成一个仓库。

我需要配置这三种类型的仓库,现规划如下:

仓库类型仓库名称HTTP端口号HTTPS端口号支持docker操作
proxy代理仓库docker-proxy8001不设置pull
hosted本地仓库docker-hosted8002不设置pull、push
group聚合仓库docker-group8003不设置pull

创建docker blob 对象

为了使docker的blob和其他的不同,我们创建一个docker的blob,用来存储docker相关的文件。

依次点击【Repository】--【Blob Stores】--【Create Blob Store】:

Blob类型选择File

然后,名称设置为docker,不勾选【Soft Quota】,最后点击【Save】保存:

可以看到,新的Blob创建成功:

然后,创建docker-proxy代理仓库。

创建docker-proxy代理库

进入到设置页面后,点击左侧的【Repositories】进入到仓库管理页面,点击【Create Repository】按钮,我们需要使用的docker仓库,以看到docker(proxy)

`进入到docker代理仓库配置界面,依次填写相关信息。

docker代理仓库说明:

  • name: docker-proxy
  • format: docker
  • type: proxy
  • HTTP端口:8001
  • HTTPS端口:不勾选,忽略
  • Allow anonymous docker pull ( Docker Bearer Token Realm required ): 允许匿名下载镜像,勾选该处。
  • Enable Docker V1 API: 允许docker客户端使用V1 API,勾选该处。
  • Remote storage: 远程存储仓库的URL地址【可以配置成国内加速源地址】。
  • Docker Index: 这里为了确保能够拉取 DockerHub 最新的镜像,我选择了 Use DockerHub 这个 Index。
  • HTTP request setting,HTTP请求设置,我们一般只需要设置一下User-Agent请求头即可,如填写"Sync docker image. email: mzh.whut@gmail.com"。

注意,代理URL请使用科大镜像、网易、阿里云等加速源,或者腾讯内网地址https://mirror.ccs.tencentyun.com ,不要使用截图中的腾讯外网地址 https://mirrors.cloud.tencent.com

使用 docker Blob存储,最后点击【Create repository】创建仓库即可。

创建后,点击新创建的docker-proxy仓库,可以看到仓库详情:

创建docker-hosted本地仓库

创建docker-hosted本地仓库:

docker本地仓库说明:

  • name: docker-hosted
  • format: docker
  • type: hosted
  • HTTP端口:8002
  • HTTPS端口:不勾选,忽略
  • Allow anonymous docker pull ( Docker Bearer Token Realm required ): 允许匿名下载镜像,勾选该处。
  • Enable Docker V1 API: 允许docker客户端使用V1 API,勾选该处
  • Blob store: 选择【docker】blob对象
  • Deployment policy: 测试时,先可以选择【Allow redeploy】允许重复发布,后期如果用在正式生产环境时,可以将该修改为【Disable redeploy】。

相关信息填写好后,最后点击【Create repository】创建仓库即可。

创建docker-group聚合仓库

创建docker-group聚合仓库:

docker聚合仓库说明:

  • name: docker-group
  • format: docker
  • type: group
  • HTTP端口:8003
  • HTTPS端口:不勾选,忽略
  • Allow anonymous docker pull ( Docker Bearer Token Realm required ): 允许匿名下载镜像,勾选该处。
  • Enable Docker V1 API: 允许docker客户端使用V1 API,勾选该处
  • Blob store: 选择【docker】blob对象
  • Group: Member Repositories,将【docker-hosted】和 【docker-proxy】添加到右侧,这里成员仓库的顺序可以稍微规划下,一般来说将本地的放前面,代理第三方的放后面,好处就是优先使用本地或小众的镜像仓库。

相关信息填写好后,最后点击【Create repository】创建仓库即可。

这样我们三个docker仓库已经创建好了:

开启匿名访问权限/Token

依次点击【Security】--【Realms】,将【Docker Bearer Token Tealm】添加到右侧

配置是否允许匿名登录【勾选上红框标记的位置】

最后点击【Save】保存即可。

测试代理仓库下载镜像

先修改/etc/docker/daemon.json配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@master ~]# cd /etc/docker/
# 备份
[root@master docker]# mv daemon.json daemon.json.bak
# 修改配置文件
[root@master docker]# vi daemon.json
# 查看配置文件内容
[root@master docker]# cat daemon.json
{
"insecure-registries":[
"nexushub.com:8001",
"nexushub.com:8002",
"nexushub.com:8003"
],
"registry-mirrors":[
"http://nexushub.com:8001",
"http://nexushub.com:8002",
"http://nexushub.com:8003"
]
}
[root@master docker]#

重启docker服务:

1
2
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker

执行下载镜像之类后,在nexus上面检查Blob对象:

在nexus Browse中也可以看到对应的镜像信息:

如果能够正常代理,则下载镜像时,上面两个位置的信息会发生变化,blob对象会增加,Browse浏览器中也可以看到新下载的镜像信息。

docker仓库规划(二)

  • 仅创建一个docker hosted仓库供push和pull私有镜像
  • pull第三方镜像使用国内镜像源优化速度

新建docker blob

创建docker-hosted仓库

添加Token/配置匿名

配置docker

在daemon.json中添加如下配置

1
2
3
4
5
6
7
8
{
"insecure-registries": [
"local.docker.repo:8002"
],
"registry-mirrors": [
"国内镜像源【腾讯云主机优先考虑https://mirror.ccs.tencentyun.com】"
]
}