容器方式安装 nexus3 并作为yum私服

nexus 3 笔记

  • new,2022-10-19,chenxizhan1995@163.com

目标

  • 虚拟机上 docker 形式搭建 nexus 服务,用作 yum 私服和 container image 私服,为 k8s 集群提供基础
  • 了解 nexus 数据存储目录,把数据存储到单独的磁盘上,可以迁移

资料阅读

要点归纳

  • nexus: 名词,关系,合流点

  • OSS:Object Storage Service,对象存储服务

  • nexus 是 sonatype 公司的产品。sonatype 有好几种产品,我们通常说的用作 Maven
    仓库私服的是 Nexus Repository Manager。其他产品如 Nexus Lifecycle、Nexus Firewall、Nexus Container。
    Nexus Repository,分免费版和专业版,专业版叫 Nexus Pro,免费版叫 Nexus OSS。
    免费版功能受限,但足以应对大多数情况,功能对比
    免费和专业版的版的安装包相同的。
    官方对此产品的称呼是 Nexus Repository Manager (NXRM)

  • 安装: 官方提供压缩包和Docker镜像安装方式

  • 备份和恢复:NXRM 把构建存储在 blob stores 中,把配置和元数据独立存储在数据库中,
    所以备份的时候,两个一起。
    Prepare a Backup

    • blob 目录 $data_dir/blobs

    • Node ID $data_dir/keysotres/node

    • 数据库数据

    • 容器方式安装时,只要备份容器内的 /nexus-data/ 目录即可。

    • 压缩包下载地址 Download

容器方式安装 nexus 过程记录


  • 系统要求 Linux、Windows、Mac OS 都可以,但 Linux 是测试最充分的
  • 建议使用专用账户,通常叫 nexus,并且此账户必须有 shell 权限;安全考虑,不要用 root 账号
  • NXRM3 需要使用大量文件句柄,通常超过系统对每个用户的默认限制,应调整此限制为 65536。否则若文件句柄不足,可能会导致数据丢失。
  • 硬件要求:官网称至少 4C8G
  • 数据目录(data_dir):取决于存放的构件。当剩余空间不足4G时,nexus变为只读的。

  • Nexus服务默认用户 admin,密码在数据目录下的 admin.password 文件中,随机密码
  • /opt/sonatype/nexus 是 nexus 的安装目录
  • /nexus-data 是 nexus 的数据目录,存储 configuration, logs, and storage。
    nexus 进程要求具有对该目录的写入权限,UID=200。
    mkdir /some/dir/nexus-data && chown -R 200 /some/dir/nexus-data
  • 环境变量 NEXUS_CONTEXT 指定服务的入口地址,默认 /
  • INSTALL4J_ADD_VM_PARAMS 指定nexus给JVM的启动参数,默认
    -Xms2703m -Xmx2703m -XX:MaxDirectMemorySize=2703m -Djava.util.prefs.userRoot=${NEXUS_DATA}/javaprefs
# 这个带 sha256 的方式拉取镜像会失败
# podman pull sonatype/nexus3:3.42.0@sha256:7e7abd3418d507d5263460eda83e239aff758cd362f8add54d9c9846cada2533

podman --log-level=debug pull sonatype/nexus3:3.42.0
# nexus 的安装路径 /var/data/nexus
mkdir -pv /var/data/nexus/nexus-data
cd /var/data/nexus
chown -R 200 nexus-data
podman run -dit -p 8081:8081 --name nexus \
  -v $PWD/nexus-data:/nexus-data \
  -e 'INSTALL4J_ADD_VM_PARAMS=-Xms512M -Xmx512M -XX:MaxDirectMemorySize=512M -Djava.util.prefs.userRoot=${NEXUS_DATA}/javaprefs' \
  sonatype/nexus3:3.42.0

# 取得初始密码
podman exec -it nexus cat /nexus-data/admin.password
# 重设密码为 admin/admin

# 官网推荐 8C8G 的配置
# 实测通过指定 INSTALL4J_ADD_VM_PARAMS 参数,2C2G 的虚拟机配置也能成功启动。内存还剩500MB

在 /var/data/nexus 下写个 makefile

pushd /var/data/nexus
cat >/var/data/nexus/Makefile <<\EOF
podman=podman
name=nexus
start stop:
:tab $(podman) $@ $(name)
logs.tf logs:
:tab @echo 查看末尾20行日志并追踪
:tab $(podman) logs --tail 20 -f $(name)
logs.all:
:tab @echo 查看所有日志
:tab $(podman) logs $(name)
password passwd:
:tab $(podman) exec -it $(name) cat /nexus-data/admin.password; echo -n
EOF
sed -i '/:tab /s/^:tab /\t/g' Makefile
popd

附:环境信息

  • 操作系统 Ubuntu 22.04.1 LTS
  • 内核 5.15.0-50-generic x86_64
  • Nexus 版本 3.42.0
  • podman 版本 3.4.4

Ubuntu 运行在虚拟机上。Virtualbox 创建的虚拟机,virtualbox 版本 6.1.38r153438;宿主机 Win10。

附:错误

  • 拉取镜像 sonatype/nexus3:3.42.0 失败:invalid character ‘<’
$ podman --log-level=debug pull sonatype/nexus3:3.42.0
...
DEBU[0000] GET https://baidubce.comexample.com/v2/
...
Error: initializing image from source docker://sonatype/nexus3:3.42.0: invalid character '<' looking for beginning of value

root@lhc:~# podman version
Version:      3.4.4
API Version:  3.4.4
Go Version:   go1.17.3
Built:        Thu Jan  1 00:00:00 1970
OS/Arch:      linux/amd64

原因:镜像源的问题,把镜像从 “https://mirror.baidubce.com” 替换为 “https://hub-mirror.c.163.com” 就好了。

以 nexus 做yum源

  • 先安装 nexus

最终的地址:http://localhost:8081/repository/group-yum/

# 测试
mkdir -pv /etc/yum.repos.d/nexus-test-bak
cd /etc/yum.repos.d
mv *.repo nexus-test-bak
cat > /etc/yum.repos.d/nexus.repo <<\EOF
[nexus-base]
name=Nexus-base
baseurl=http://192.168.17.5:8081/repository/group-yum/$releasever/os/$basearch/
enabled=1
gpgcheck=0

[nexus-update]
name=Nexus-update
baseurl=http://192.168.17.5:8081/repository/group-yum/$releasever/updates/$basearch/
enabled=1
gpgcheck=0

[nexus-extras]
name=Nexus-extra
baseurl=http://192.168.17.5:8081/repository/group-yum/$releasever/extras/$basearch/
enabled=1
gpgcheck=0
EOF
# k8s 的阿里镜像源
cat >/etc/yum.repos.d/k8s.repo<<\EOF
[k8s]
name=Nexus-k8s
baseurl=http://192.168.17.5:8081/repository/proxy-aliyun-k8s-yum/repos/kubernetes-el7-x86_64
gpgcheck=0
EOF
# docker 的镜像源

yum clean all
yum makecache

# 对于触发初次下载内容的主机,要设置超时时间
# 在 yum.conf 里的  [main] 下面加上
# 有两个相关参数,当下载速度低于 minrate,持续时间超过 timeout 秒的时候,yum 断开连接
# minrate 默认值 1000 byte/s,timeout 默认值 30s
[main]
timeout=600
# 顺便全局关掉插件
plugins=0

# yum 'Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds')
# https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64

附相关链接

使用nexus3配置docker私有仓库 | 二丫讲梵
yum 仓库镜像。
Q. 为什么教程中本地 yum makecache,远程nexus私服的yum仓库就有元数据了呢?
nexus3作为yum私服的使用_wc1695040842的博客-CSDN博客
前一个教程,有不必要的操作,造成困惑,结合这第二个教程,取其交集,不难推测 nexus 私服的原理。

使用Nexus3搭建Yum仓库源 | jack007的博客
看来,yum仓库格式需要简单了解一下

Yum Repositories

附:源配置

docker 源

[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg

  • https://download.docker.com/linux/centos/$releasever/$basearch/stable
  • nexus 镜像目标:https://download.docker.com/linux/centos
cat >/etc/yum.repos.d/nexus-docker.repo<<\EOF
[docker]
name=Nexus-docker
baseurl=http://192.168.17.5:8081/repository/proxy-docker-yum/$releasever/$basearch/stable
gpgcheck=0
EOF

# 刷新缓存
yum makecache

yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

版权声明:本文为chenxizhan1995原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。