Ubuntu 24.04 使用 Docker 部署 Nexus 3 完整教程
实现 Maven + Docker + npm 仓库功能
📋 目录
🔧 环境准备
系统要求
- 操作系统: Ubuntu 24.04 LTS
- 内存: 至少 4GB RAM(推荐 8GB)
- 磁盘空间: 至少 20GB 可用空间
- 网络: 能够访问互联网
检查系统信息
# 查看系统版本
lsb_release -a
# 查看内存信息
free -h
# 查看磁盘空间
df -h
🐳 安装 Docker 和 Docker Compose
1. 更新系统包
sudo apt update
sudo apt upgrade -y
2. 安装必要的依赖
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release
3. 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
4. 添加 Docker 仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
5. 安装 Docker Engine
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
6. 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker
7. 验证 Docker 安装
docker --version
docker run hello-world
8. 配置 Docker 用户权限(可选)
# 将当前用户添加到 docker 组
sudo usermod -aG docker $USER
# 重新登录或执行以下命令使更改生效
newgrp docker
🏗️ 部署 Nexus 3
1. 创建工作目录
# 创建 nexus 项目目录
mkdir -p ~/nexus
cd ~/nexus
# 创建数据持久化目录
mkdir -p data
2. 创建 docker-compose.yml 文件
nano docker-compose.yml
复制以下内容到文件中:
version: '3.8'
services:
nexus:
image: sonatype/nexus3:latest
container_name: nexus3
restart: always
# 环境变量配置
environment:
- TZ=Asia/Shanghai
- INSTALL4J_ADD_VM_PARAMS=-Xms1200m -Xmx1200m -XX:MaxDirectMemorySize=2g
# 端口映射
ports:
- "8081:8081" # Nexus Web界面
- "8082:8082" # Docker仓库组端口
- "8083:8083" # Docker hosted仓库端口
- "8084:8084" # Docker proxy仓库端口
# 数据卷挂载
volumes:
- ./data:/nexus-data
# 权限配置
user: root
# 健康检查
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8081/"]
interval: 30s
timeout: 10s
retries: 5
start_period: 120s
3. 设置数据目录权限
# 设置正确的权限(重要!)
sudo chown -R 200:200 ~/nexus/data
sudo chmod -R 777 ~/nexus/data
4. 启动 Nexus 容器
# 启动服务
docker-compose up -d
# 查看启动日志
docker-compose logs -f nexus
5. 等待 Nexus 启动完成
Nexus 首次启动需要 2-5 分钟,请耐心等待。当看到类似以下日志时表示启动成功:
Started Sonatype Nexus OSS 3.x.x
6. 检查容器状态
# 查看容器状态
docker-compose ps
# 查看容器日志
docker logs nexus3
🔐 初始化配置
1. 访问 Nexus Web 界面
打开浏览器,访问:http://<你的服务器IP>:8081
例如:http://192.168.1.100:8081
2. 获取初始管理员密码
# 查看初始密码
cat ~/nexus/data/admin.password
3. 首次登录
- 用户名:
admin - 密码: 上一步获取的密码
4. 修改管理员密码
登录后,系统会要求你修改密码。请设置一个强密码并记住它!
5. 配置匿名访问(可选)
- 点击右上角齿轮图标 ⚙️(设置)
- 选择
Anonymous→Settings - 勾选
Allow anonymous users to access the server - 点击
Save
6. 启用 npm Bearer Token Realm(重要!)
- 点击齿轮图标 ⚙️ →
Security→Realms - 在
Available列表中找到npm Bearer Token Realm - 点击
>按钮将其添加到Active列表 - 点击
Save
📦 配置 Maven 仓库
1. 查看默认 Maven 仓库
Nexus 默认已经配置了以下 Maven 仓库:
maven-central: 代理 Maven 中央仓库maven-releases: 发布版本仓库maven-snapshots: 快照版本仓库maven-public: 聚合仓库(包含上述三个仓库)
2. 创建自定义 Maven Hosted 仓库(可选)
如果需要创建自定义仓库:
- 点击齿轮图标 ⚙️ →
Repositories - 点击
Create repository - 选择
maven2 (hosted) - 配置参数:
- Name:
my-maven-releases - Version policy:
Release - Layout policy:
Strict - Deployment policy:
Allow redeploy
- Name:
- 点击
Create repository
3. 创建 Maven Proxy 仓库(可选)
如果需要代理其他 Maven 仓库:
- 点击
Create repository - 选择
maven2 (proxy) - 配置参数:
- Name:
aliyun-maven - Remote storage:
https://maven.aliyun.com/repository/public - Version policy:
Mixed
- Name:
- 点击
Create repository
4. 创建 Maven Group 仓库(可选)
如果需要聚合多个仓库:
- 点击
Create repository - 选择
maven2 (group) - 配置参数:
- Name:
maven-all - Group: 将需要的仓库添加到右侧列表
- Name:
- 点击
Create repository
🐳 配置 Docker 仓库
1. 创建 Docker Hosted 仓库(私有仓库)
用于存储自己的 Docker 镜像:
- 点击齿轮图标 ⚙️ →
Repositories - 点击
Create repository - 选择
docker (hosted) - 配置参数:
- Name:
docker-hosted - HTTP: 勾选,端口
8083 - Deployment policy:
Allow redeploy - Write policy:
Allow once或Allow redeploy
- Name:
- 点击
Create repository
2. 创建 Docker Proxy 仓库(代理仓库)
用于代理 Docker Hub:
- 点击
Create repository - 选择
docker (proxy) - 配置参数:
- Name:
docker-proxy - Remote storage:
https://registry-1.docker.io - Docker Index:
Use Docker Hub - HTTP: 勾选,端口
8084
- Name:
- 点击
Create repository
3. 创建 Docker Group 仓库(聚合仓库)
用于统一访问所有 Docker 仓库:
- 点击
Create repository - 选择
docker (group) - 配置参数:
- Name:
docker-group - HTTP: 勾选,端口
8082 - Group: 将
docker-hosted和docker-proxy添加到右侧列表 - 确保顺序:
docker-hosted在前,docker-proxy在后
- Name:
- 点击
Create repository
4. 验证 Docker 仓库配置
在浏览器中访问以下 URL 验证:
http://<你的服务器IP>:8082/v2/_catalog(Group 仓库)http://<你的服务器IP>:8083/v2/_catalog(Hosted 仓库)http://<你的服务器IP>:8084/v2/_catalog(Proxy 仓库)
📦 配置 npm 仓库
1. 创建 npm Hosted 仓库(私有仓库)
用于存储自己的 npm 包:
- 点击齿轮图标 ⚙️ →
Repositories - 点击
Create repository - 选择
npm (hosted) - 配置参数:
- Name:
npm-hosted - Deployment policy:
Allow redeploy - Write policy:
Allow redeploy
- Name:
- 点击
Create repository
2. 创建 npm Proxy 仓库(代理仓库)
用于代理 npm 官方仓库:
- 点击
Create repository - 选择
npm (proxy) - 配置参数:
- Name:
npm-proxy - Remote storage:
https://registry.npmjs.org - Version policy:
Mixed
- Name:
- 点击
Create repository
3. 创建 npm Group 仓库(聚合仓库)
用于统一访问所有 npm 仓库:
- 点击
Create repository - 选择
npm (group) - 配置参数:
- Name:
npm-group - Group: 将
npm-hosted和npm-proxy添加到右侧列表 - 确保顺序:
npm-hosted在前,npm-proxy在后
- Name:
- 点击
Create repository
4. 配置 npm 用户和权限
创建 npm 读取角色
- 点击齿轮图标 ⚙️ →
Security→Roles - 点击
Create role - 配置参数:
- Role ID:
npm-reader - Role Name:
NPM Package Reader - Privileges: 添加
nx-repository-view-npm-npm-group-read和nx-repository-view-npm-npm-group-browse
- Role ID:
- 点击
Create role
创建 npm 发布角色
- 点击
Create role - 配置参数:
- Role ID:
npm-publisher - Role Name:
NPM Package Publisher - Privileges: 添加
nx-repository-view-npm-npm-hosted-read、nx-repository-view-npm-npm-hosted-add、nx-repository-view-npm-npm-hosted-edit、nx-repository-view-npm-nexus-group-read和nx-repository-view-nexus-group-browse
- Role ID:
- 点击
Create role
创建 npm 用户
- 点击齿轮图标 ⚙️ →
Security→Users - 点击
Create local user - 配置参数:
- User ID:
npm-publisher - First Name:
NPM - Last Name:
Publisher - Email:
publisher@example.com - Password: 设置强密码
- Roles: 添加
nx-admin、npm-reader和npm-publisher - Status:
Active
- User ID:
- 点击
Create user
5. 获取 npm 用户 Token
# 生成 Base64 编码的认证 token
echo -n 'npm-publisher:你的密码' | openssl base64
注意:记录生成的 token,后面配置 npm 客户端时需要使用。
💻 客户端配置
Maven 客户端配置
1. 配置 Maven settings.xml
编辑 Maven 配置文件 ~/.m2/settings.xml:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- Nexus 认证信息 -->
<servers>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>你的管理员密码</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>你的管理员密码</password>
</server>
</servers>
<!-- Nexus 仓库镜像配置 -->
<mirrors>
<mirror>
<id>nexus-public</id>
<mirrorOf>*</mirrorOf>
<url>http://<你的服务器IP>:8081/repository/maven-public/</url>
</mirror>
</mirrors>
<!-- Nexus 仓库配置 -->
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus-releases</id>
<url>http://<你的服务器IP>:8081/repository/maven-releases/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>false</enabled></snapshots>
</repository>
<repository>
<id>nexus-snapshots</id>
<url>http://<你的服务器IP>:8081/repository/maven-snapshots/</url>
<releases><enabled>false</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus-releases</id>
<url>http://<你的服务器IP>:8081/repository/maven-releases/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>false</enabled></snapshots>
</pluginRepository>
<pluginRepository>
<id>nexus-snapshots</id>
<url>http://<你的服务器IP>:8081/repository/maven-snapshots/</url>
<releases><enabled>false</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
2. 项目 pom.xml 配置
在你的项目 pom.xml 中添加:
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus Releases</name>
<url>http://<你的服务器IP>:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshots</name>
<url>http://<你的服务器IP>:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
3. 部署到 Nexus
# 编译并部署到 Nexus
mvn clean deploy -Dmaven.test.skip=true
Docker 客户端配置
1. 配置 Docker daemon
编辑 /etc/docker/daemon.json:
{
"insecure-registries": [
"<你的服务器IP>:8082",
"<你的服务器IP>:8083",
"<你的服务器IP>:8084"
]
}
2. 重启 Docker 服务
sudo systemctl restart docker
3. 登录到 Nexus Docker 仓库
# 登录到 hosted 仓库
docker login <你的服务器IP>:8083
# 输入用户名: admin
# 输入密码: 你的管理员密码
4. 推送镜像到 Nexus
# 构建镜像
docker build -t myapp:1.0 .
# 标记镜像
docker tag myapp:1.0 <你的服务器IP>:8083/myapp:1.0
# 推送镜像
docker push <你的服务器IP>:8083/myapp:1.0
5. 从 Nexus 拉取镜像
# 从 group 仓库拉取(会自动从 hosted 或 proxy 获取)
docker pull <你的服务器IP>:8082/nginx:latest
# 从 hosted 仓库拉取
docker pull <你的服务器IP>:8083/myapp:1.0
# 从 proxy 仓库拉取(会从 Docker Hub 代理)
docker pull <你的服务器IP>:8084/nginx:latest
npm 客户端配置
1. 配置 .npmrc 文件
在项目根目录或用户主目录创建 .npmrc 文件:
用于发布包的配置(.npmrc):
# 配置私有仓库地址
registry=http://<你的服务器IP>:8081/repository/npm-hosted/
# 配置认证信息
//<你的服务器IP>:8081/repository/npm-hosted/:_auth=你的Base64编码的token
//<你的服务器IP>:8081/repository/npm-hosted/:always-auth=true
用于安装包的配置(.npmrc):
# 配置聚合仓库地址
registry=http://<你的服务器IP>:8081/repository/npm-group/
# 配置认证信息
//<你的服务器IP>:8081/repository/npm-group/:_auth=你的Base64编码的token
//<你的服务器IP>:8081/repository/npm-group/:always-auth=true
2. 使用 npm config 命令配置
# 配置 registry
npm config set registry http://<你的服务器IP>:8081/repository/npm-group/
# 配置认证
npm config set //<你的服务器IP>:8081/repository/npm-group/:_auth 你的Base64编码的token
# 验证配置
npm config list
3. 发布 npm 包到 Nexus
# 进入你的 npm 项目目录
cd your-npm-package
# 确保已登录(如果使用 token 认证,可以跳过)
npm login --registry=http://<你的服务器IP>:8081/repository/npm-hosted/
# 发布包
npm publish --registry=http://<你的服务器IP>:8081/repository/npm-hosted/
4. 从 Nexus 安装 npm 包
# 安装私有包
npm install your-private-package
# 安装公共包(会从 npm-proxy 获取)
npm install express
5. npm 包发布示例
创建一个简单的 npm 包:
# 创建项目目录
mkdir my-private-package
cd my-private-package
# 初始化项目
npm init -y
# 创建 index.js
cat > index.js << 'EOF'
function hello() {
return 'Hello from private package!';
}
module.exports = { hello };
EOF
# 更新 package.json
cat > package.json << 'EOF'
{
"name": "my-private-package",
"version": "1.0.0",
"description": "My private npm package",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
EOF
# 发布到 Nexus
npm publish --registry=http://<你的服务器IP>:8081/repository/npm-hosted/
在另一个项目中使用私有包:
# 创建新项目
mkdir my-app
cd my-app
# 初始化项目
npm init -y
# 安装私有包
npm install my-private-package --registry=http://<你的服务器IP>:8081/repository/npm-group/
# 创建测试文件
cat > test.js << 'EOF'
const { hello } = require('my-private-package');
console.log(hello());
EOF
# 运行测试
node test.js
🔍 常见问题解决
1. Nexus 启动失败
问题: 容器启动后立即退出 解决方案:
# 查看容器日志
docker logs nexus3
# 检查数据目录权限
ls -la ~/nexus/data
# 重新设置权限
sudo chown -R 200:200 ~/nexus/data
sudo chmod -R 777 ~/nexus/data
# 重启容器
docker-compose restart
2. 无法访问 Web 界面
问题: 浏览器无法访问 http://<IP>:8081
解决方案:
# 检查防火墙
sudo ufw status
# 开放端口
sudo ufw allow 8081/tcp
sudo ufw allow 8082/tcp
sudo ufw allow 8083/tcp
sudo ufw allow 8084/tcp
# 检查容器状态
docker-compose ps
# 检查端口监听
sudo netstat -tlnp | grep 8081
3. Docker 推送镜像失败
问题: docker push 时出现错误
解决方案:
# 检查 daemon.json 配置
cat /etc/docker/daemon.json
# 确保 insecure-registries 配置正确
# 重启 Docker 服务
sudo systemctl restart docker
# 重新登录
docker login <你的服务器IP>:8083
# 检查仓库 URL
curl http://<你的服务器IP>:8083/v2/_catalog
4. Maven 部署失败
问题: mvn deploy 时出现认证错误
解决方案:
# 检查 settings.xml 配置
cat ~/.m2/settings.xml
# 确认用户名密码正确
# 检查 pom.xml 中的 repository id 是否与 settings.xml 中的 server id 一致
# 测试连接
curl -u admin:密码 http://<你的服务器IP>:8081/repository/maven-releases/
5. npm 发布失败
问题: npm publish 时出现认证错误
解决方案:
# 检查 .npmrc 配置
cat .npmrc
# 确认 token 正确
# 重新生成 token
echo -n 'npm-publisher:你的密码' | openssl base64
# 检查 Nexus 中的 npm Bearer Token Realm 是否启用
# 测试连接
curl -u npm-publisher:密码 http://<你的服务器IP>:8081/repository/npm-hosted/
6. npm 安装失败
问题: npm install 时出现 401 或 403 错误
解决方案:
# 确保使用的是 npm-group 仓库
npm config set registry http://<你的服务器IP>:8081/repository/npm-group/
# 检查认证信息
npm config list
# 清除 npm 缓存
npm cache clean --force
# 重新安装
npm install
7. 内存不足
问题: Nexus 运行缓慢或崩溃 解决方案:
# 修改 docker-compose.yml 中的 JVM 参数
environment:
- INSTALL4J_ADD_VM_PARAMS=-Xms2g -Xmx2g -XX:MaxDirectMemorySize=3g
# 重启容器
docker-compose down
docker-compose up -d
8. 磁盘空间不足
问题: Nexus 数据目录占用大量空间 解决方案:
# 检查磁盘使用情况
du -sh ~/nexus/data
# 在 Nexus Web 界面中配置清理任务
# Settings → Tasks → Create task
# 选择 "Compact blob store" 或 "Cleanup unused docker manifests"
📊 维护和监控
1. 备份 Nexus 数据
# 停止容器
docker-compose stop
# 备份数据目录
tar -czf nexus-backup-$(date +%Y%m%d).tar.gz ~/nexus/data
# 启动容器
docker-compose start
2. 查看 Nexus 日志
# 查看容器日志
docker logs -f nexus3
# 查看 Nexus 应用日志
tail -f ~/nexus/data/log/nexus.log
3. 监控容器资源使用
# 查看容器资源使用情况
docker stats nexus3
# 查看容器详细信息
docker inspect nexus3
4. 更新 Nexus 版本
# 拉取最新镜像
docker-compose pull
# 重启容器
docker-compose down
docker-compose up -d
5. 查看 npm 仓库内容
# 查看 npm-hosted 仓库中的包
curl -u admin:密码 http://<你的服务器IP>:8081/repository/npm-hosted/
# 查看特定包的信息
curl -u admin:密码 http://<你的服务器IP>:8081/repository/npm-hosted/your-package-name
🎯 总结
恭喜主人!现在您已经成功在 Ubuntu 24.04 上使用 Docker 部署了 Nexus 3,并配置了完整的 Maven + Docker + npm 仓库功能!ヾ(≧▽≦*)o
主要功能:
✅ Maven 私有仓库 - 管理项目依赖和构建产物
✅ Docker 私有仓库 - 存储和管理 Docker 镜像
✅ npm 私有仓库 - 管理前端依赖和私有包
✅ 仓库代理 - 加速访问公共仓库
✅ 仓库聚合 - 统一访问入口
✅ 权限管理 - 安全的访问控制
三种仓库对比:
| 仓库类型 | 用途 | 仓库类型 |
|---|---|---|
| Maven | Java 项目依赖管理 | hosted, proxy, group |
| Docker | 容器镜像管理 | hosted, proxy, group |
| npm | Node.js 包管理 | hosted, proxy, group |
下一步建议:
- 配置 HTTPS 访问(生产环境必需)
- 设置定期备份任务
- 配置日志轮转
- 监控仓库使用情况
- 根据团队需求调整仓库策略
- 配置 CI/CD 集成
快速参考命令:
# Maven 相关
mvn clean deploy -Dmaven.test.skip=true
# Docker 相关
docker login <你的服务器IP>:8083
docker push <你的服务器IP>:8083/myapp:1.0
docker pull <你的服务器IP>:8082/nginx:latest
# npm 相关
npm publish --registry=http://<你的服务器IP>:8081/repository/npm-hosted/
npm install --registry=http://<你的服务器IP>:8081/repository/npm-group/