Ubuntu 24.04 使用 Docker 部署 Nexus 3 完整教程

2026.02.12
苦温集 · 部署教程 Linux · Docker · Nexus3

实现 Maven + Docker + npm 仓库功能

📋 目录

  1. 环境准备
  2. 安装 Docker 和 Docker Compose
  3. 部署 Nexus 3
  4. 初始化配置
  5. 配置 Maven 仓库
  6. 配置 Docker 仓库
  7. 配置 npm 仓库
  8. 客户端配置
  9. 常见问题解决

🔧 环境准备

系统要求

  • 操作系统: 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. 配置匿名访问(可选)

  • 点击右上角齿轮图标 ⚙️(设置)
  • 选择 AnonymousSettings
  • 勾选 Allow anonymous users to access the server
  • 点击 Save

6. 启用 npm Bearer Token Realm(重要!)

  • 点击齿轮图标 ⚙️ → SecurityRealms
  • Available 列表中找到 npm Bearer Token Realm
  • 点击 > 按钮将其添加到 Active 列表
  • 点击 Save

📦 配置 Maven 仓库

1. 查看默认 Maven 仓库

Nexus 默认已经配置了以下 Maven 仓库:

  • maven-central: 代理 Maven 中央仓库
  • maven-releases: 发布版本仓库
  • maven-snapshots: 快照版本仓库
  • maven-public: 聚合仓库(包含上述三个仓库)

2. 创建自定义 Maven Hosted 仓库(可选)

如果需要创建自定义仓库:

  1. 点击齿轮图标 ⚙️ → Repositories
  2. 点击 Create repository
  3. 选择 maven2 (hosted)
  4. 配置参数:
    • Name: my-maven-releases
    • Version policy: Release
    • Layout policy: Strict
    • Deployment policy: Allow redeploy
  5. 点击 Create repository

3. 创建 Maven Proxy 仓库(可选)

如果需要代理其他 Maven 仓库:

  1. 点击 Create repository
  2. 选择 maven2 (proxy)
  3. 配置参数:
    • Name: aliyun-maven
    • Remote storage: https://maven.aliyun.com/repository/public
    • Version policy: Mixed
  4. 点击 Create repository

4. 创建 Maven Group 仓库(可选)

如果需要聚合多个仓库:

  1. 点击 Create repository
  2. 选择 maven2 (group)
  3. 配置参数:
    • Name: maven-all
    • Group: 将需要的仓库添加到右侧列表
  4. 点击 Create repository

🐳 配置 Docker 仓库

1. 创建 Docker Hosted 仓库(私有仓库)

用于存储自己的 Docker 镜像:

  1. 点击齿轮图标 ⚙️ → Repositories
  2. 点击 Create repository
  3. 选择 docker (hosted)
  4. 配置参数:
    • Name: docker-hosted
    • HTTP: 勾选,端口 8083
    • Deployment policy: Allow redeploy
    • Write policy: Allow onceAllow redeploy
  5. 点击 Create repository

2. 创建 Docker Proxy 仓库(代理仓库)

用于代理 Docker Hub:

  1. 点击 Create repository
  2. 选择 docker (proxy)
  3. 配置参数:
    • Name: docker-proxy
    • Remote storage: https://registry-1.docker.io
    • Docker Index: Use Docker Hub
    • HTTP: 勾选,端口 8084
  4. 点击 Create repository

3. 创建 Docker Group 仓库(聚合仓库)

用于统一访问所有 Docker 仓库:

  1. 点击 Create repository
  2. 选择 docker (group)
  3. 配置参数:
    • Name: docker-group
    • HTTP: 勾选,端口 8082
    • Group: 将 docker-hosteddocker-proxy 添加到右侧列表
    • 确保顺序:docker-hosted 在前,docker-proxy 在后
  4. 点击 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 包:

  1. 点击齿轮图标 ⚙️ → Repositories
  2. 点击 Create repository
  3. 选择 npm (hosted)
  4. 配置参数:
    • Name: npm-hosted
    • Deployment policy: Allow redeploy
    • Write policy: Allow redeploy
  5. 点击 Create repository

2. 创建 npm Proxy 仓库(代理仓库)

用于代理 npm 官方仓库:

  1. 点击 Create repository
  2. 选择 npm (proxy)
  3. 配置参数:
    • Name: npm-proxy
    • Remote storage: https://registry.npmjs.org
    • Version policy: Mixed
  4. 点击 Create repository

3. 创建 npm Group 仓库(聚合仓库)

用于统一访问所有 npm 仓库:

  1. 点击 Create repository
  2. 选择 npm (group)
  3. 配置参数:
    • Name: npm-group
    • Group: 将 npm-hostednpm-proxy 添加到右侧列表
    • 确保顺序:npm-hosted 在前,npm-proxy 在后
  4. 点击 Create repository

4. 配置 npm 用户和权限

创建 npm 读取角色

  1. 点击齿轮图标 ⚙️ → SecurityRoles
  2. 点击 Create role
  3. 配置参数:
    • Role ID: npm-reader
    • Role Name: NPM Package Reader
    • Privileges: 添加 nx-repository-view-npm-npm-group-readnx-repository-view-npm-npm-group-browse
  4. 点击 Create role

创建 npm 发布角色

  1. 点击 Create role
  2. 配置参数:
    • Role ID: npm-publisher
    • Role Name: NPM Package Publisher
    • Privileges: 添加 nx-repository-view-npm-npm-hosted-readnx-repository-view-npm-npm-hosted-addnx-repository-view-npm-npm-hosted-editnx-repository-view-npm-nexus-group-readnx-repository-view-nexus-group-browse
  3. 点击 Create role

创建 npm 用户

  1. 点击齿轮图标 ⚙️ → SecurityUsers
  2. 点击 Create local user
  3. 配置参数:
    • User ID: npm-publisher
    • First Name: NPM
    • Last Name: Publisher
    • Email: publisher@example.com
    • Password: 设置强密码
    • Roles: 添加 nx-adminnpm-readernpm-publisher
    • Status: Active
  4. 点击 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 私有仓库 - 管理前端依赖和私有包
仓库代理 - 加速访问公共仓库
仓库聚合 - 统一访问入口
权限管理 - 安全的访问控制

三种仓库对比:

仓库类型用途仓库类型
MavenJava 项目依赖管理hosted, proxy, group
Docker容器镜像管理hosted, proxy, group
npmNode.js 包管理hosted, proxy, group

下一步建议:

  1. 配置 HTTPS 访问(生产环境必需)
  2. 设置定期备份任务
  3. 配置日志轮转
  4. 监控仓库使用情况
  5. 根据团队需求调整仓库策略
  6. 配置 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/