搭建本地Maven仓库Nexus
使用 Docker 安装
docker volume create --name nexus_data
docker run -d -p 8081:8081--name nexus -v nexus_data://nexus-data sonatype/nexus3- 8081 是 Nexus UI 端口
使用 Docker Compose 安装
services: nexus: image: sonatype/nexus3 platform: linux/amd64 ports: - "8081:8081" volumes: - nexus_data://nexus-data - /etc/localtime://etc/localtime:ro
volumes: nexus_data:访问并配置 Nexus
访问 http://127.0.0.1:8081/ 或者是 http://<your IP>:8081,用户名为 admin ,初始密码在容器里的 /nexus-data/admin.password 文件
docker ps
# docker-nexus-1 为容器名称docker exec -it docker-nexus-1 cat /nexus-data/admin.password登录之后,将密码修改为自己的密码,比如:admin。
开启匿名访问权限
依次点击【Security】—【Realms】,将【Docker Bearer Token Tealm】添加到右侧,然后保存。
创建 Maven 仓库
Nexus 提供三种类型的仓库:
hosted : 本地存储
proxy : 提供代理其他仓库的类型,如阿里云镜像加速器
groudp : 组类型,实质作用是组合多个仓库为一个地址
创建一个 maven(proxy) 仓库,名称:aliyun,Version Policy 选择 Mixed,URL 地址:https://maven.aliyun.com/nexus/content/groups/public/,并修改 maven-public 仓库,将 aliyun 加入 maven-public 的 Group 中。
注意:保持 hosted 仓库在 proxy 仓库之前,这样方便下载依赖时先从本地查找。
创建 Docker 仓库
先创建一个 blob store 用于存储 docker 文件。
然后,创建三个仓库:
- 创建一个 docker(hosted) 仓库,名称为:docker-local,Blob store 选择上面创建的 docker,选择 Allow anonymous docker pull 。
- 创建一个 docker(proxy) 仓库,名称为:docker-remote,地址填 https://docker.1panel.live/ 或其他代理地址也行,Docker Index 选择:User Docker Hub,Blob store 选择上面创建的 docker,选择 Allow anonymous docker pull。
- 创建一个 docker(group) 仓库,名称为:docker
修改 docker 配置:
vim /etc/docker/daemon.json
{ "registry-mirrors" : [ "https://docker-registry.chensoul.cc" ]}重启 docker。
配置反向代理
准备好 SSL 文件,放置 /etc/nginx/ssl 目录
使用源码编译安装 nignx,安装目录 /usr/local/nginx
修改 /usr/local/nginx/conf/nginx.conf 文件,添加
include /etc/nginx/conf.d/*.conf#user nobody;worker_processes 1;events {worker_connections 1024;}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;include /etc/nginx/conf.d/*.conf;}为 nexus 配置反向代理
/etc/nginx/conf.d/ 目录下添加 nexus.conf 文件:
server {listen 80;server_name nexus.chensoul.cc;rewrite ^ https://$http_host$request_uri? permanent;}server {listen 443 ssl;server_name nexus.chensoul.cc;ssl_certificate /etc/nginx/ssl/all.crt;ssl_certificate_key /etc/nginx/ssl/all.key;ssl_session_timeout 5m;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;ssl_prefer_server_ciphers on;client_max_body_size 1g;access_log /var/log/nginx/nexus.log;location / {proxy_pass http://192.168.1.107:8081;proxy_read_timeout 90;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}- 192.168.1.107 为 nexus 所在服务器的 IP 地址
为 docker 注册中心配置反向代理
参考 https://gist.github.com/abdennour/74c5de79e57a47f3351217d674238da8 ,在 /etc/nginx/conf.d/ 目录下添加 docker-registry.conf 文件:
server {listen 80;server_name docker-registry.chensoul.cc;rewrite ^ https://$http_host$request_uri? permanent;}server {listen 443 ssl;server_name docker-registry.chensoul.cc;ssl_certificate /etc/nginx/ssl/all.crt;ssl_certificate_key /etc/nginx/ssl/all.key;ssl_session_timeout 5m;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;ssl_prefer_server_ciphers on;access_log /var/log/nginx/docker-registry.log;# disable any limits to avoid HTTP 413 for large image uploadsclient_max_body_size 0;# required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)chunked_transfer_encoding on;location ~ ^/(v1|v2)/[^/]+/?[^/]+/blobs/ {if ($request_method ~* (POST|PUT|DELETE|PATCH|HEAD) ) {rewrite ^/(.*)$ /repository/docker-local/$1 last;}rewrite ^/(.*)$ /repository/docker/$1 last;}location ~ ^/(v1|v2)/ {if ($request_method ~* (POST|PUT|DELETE|PATCH) ) {rewrite ^/(.*)$ /repository/docker-local/$1 last;}rewrite ^/(.*)$ /repository/docker/$1 last;}location / {proxy_pass http://192.168.1.107:8081/;proxy_read_timeout 90;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto "http";}}
如果使用 docker 中的 nginx 配置反向代理,则 docker-compose 文件如下:
services: nginx: image: nginx:1.27-alpine volumes: - ./nginx.conf://etc/nginx/nginx.conf ports: - "80:80"
nexus: image: sonatype/nexus3 platform: linux/amd64 ports: - "8081:8081" volumes: - nexus_data://nexus-data - /etc/localtime://etc/localtime:ro
volumes: nexus_data:./nginx.conf 文件见上面。
测试
Maven 测试
配置maven的配置文件settings.xml:
<?xml version="1.0" encoding="UTF-8"?><settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 http://maven.apache.org/xsd/settings-1.2.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <servers> <server> <username>nexus-release</username> <password>admin</password> <id>central</id> </server> <server> <username>nexus-snapshot</username> <password>admin</password> <id>snapshots</id> </server> </servers>
<mirrors> <mirror> <id>nexus</id> <name>nexus repository</name> <url>https://nexus.chensoul.cc/repository/maven-public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
<profiles> <profile> <repositories> <repository> <snapshots> <enabled>false</enabled> </snapshots> <id>central</id> <name>nexus-release</name> <url>https://nexus.chensoul.cc/repository/maven-release</url> </repository> <repository> <snapshots /> <id>snapshots</id> <name>nexus-snapshot</name> <url>https://nexus.chensoul.cc/repository/maven-snapshot</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <snapshots> <enabled>false</enabled> </snapshots> <id>central</id> <name>nexus-release</name> <url>https://nexus.chensoul.cc/repository/maven-release</url> </pluginRepository> <pluginRepository> <snapshots /> <id>snapshots</id> <name>nexus-snapshot</name> <url>https://nexus.chensoul.cc/repository/maven-snapshot</url> </pluginRepository> </pluginRepositories> <id>nexus</id> </profile> </profiles>
<activeProfiles> <activeProfile>nexus</activeProfile> </activeProfiles></settings>docker 测试
登录:
docker login docker-registry.chensoul.cc拉取镜像:
$ docker pull alpine:3.143.16: Pulling from library/alpine550f8bf8502c: Pull completeDigest: sha256:452e7292acee0ee16c332324d7de05fa2c99f9994ecc9f0779c602916a672ae4Status: Downloaded newer image for alpine:3.16docker.io/library/alpine:3.16从日志可以看到是从 docker.io 下载镜像。
接下来,试试从 docker-registry.chensoul.cc 下载镜像
$ docker pull docker-registry.chensoul.cc/alpine:3.163.16: Pulling from alpineDigest: sha256:452e7292acee0ee16c332324d7de05fa2c99f9994ecc9f0779c602916a672ae4Status: Downloaded newer image for docker-registry.chensoul.cc/alpine:3.16docker-registry.chensoul.cc/alpine:3.16从日志可以看到是从 docker-registry.chensoul.cc 下载镜像,并且在 https://nexus.chensoul.cc/#browse/browse:docker 可以看到下载的镜像。
推送镜像:
$ docker tag alpine:3.16 docker-registry.chensoul.cc/alpine:3.16-custom
$ docker push docker-registry.chensoul.cc/alpine:3.16-customThe push refers to repository [docker-registry.chensoul.cc/alpine]edbfd2db8ef2: Pushed3.16-custom: digest: sha256:4bdb4ac63839546daabfe0a267a363b3effa17ce02ac5f42d222174484c5686c size: 528