在已有 Nexus3 的基础上搭建 Docker 私有镜像仓库

在已有 Nexus3 的基础上搭建 Docker 私有仓库(支持 Push / Pull / Proxy)

本文介绍如何在已部署好的 Nexus 3 上配置完整的 Docker 仓库体系,包括私有仓库(hosted)、代理仓库(proxy)和组合仓库(group),实现对 Docker 镜像的上传(push)、下载(pull)及对 Docker Hub 的缓存代理。


前置条件

  • 已部署 Nexus Repository OSS 3.x(如 3.73.0-12)
  • Nexus Web UI 可访问(默认:http://:8081)
  • 服务器已开放用于 Docker 仓库的监听端口(如 5000, 5001, 5002)
  • Docker 客户端可连接 Nexus,配置了 insecure-registries(如果使用 HTTP)

关于Nexus的部署,可以参考着这篇文章:

https://blog.csdn.net/kaka_buka/article/details/149228494


一、创建 3 类仓库:hosted、proxy、group

1️. 创建 Docker Hosted 仓库(用于 push)

用于上传你自己的镜像。

  • 路径:Repositories → Create repository → docker (hosted)
  • 配置示例:
配置项 示例值
Name docker-hosted
HTTP Port 5002
Deployment Policy Allow redeploy
Allow anonymous pull ✅(可选)

点击 Create repository


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

用于拉取公共镜像并自动缓存。

  • 路径:Repositories → Create repository → docker (proxy)
  • 配置示例:
配置项 示例值
Name docker-proxy
HTTP Port 5001
Remote Storage https://registry-1.docker.io
Docker Index Use Docker Hub
Allow anonymous pull ✅(推荐)

点击 Create repository


3️. 创建 Docker Group 仓库(统一出口)

用于统一 pull/push 地址。

  • 路径:Repositories → Create repository → docker (group)
  • 配置示例:
配置项 示例值
Name docker-group
HTTP Port 5000
Group members 添加顺序:docker-hosteddocker-proxy

点击 Create repository


二、开启匿名 pull(可选,但强烈推荐)

默认情况下,Nexus 的 Docker 仓库 不允许匿名访问 ,如果你不想让每个人都执行 docker login 才能 pull 镜像,需要额外开启匿名权限。以下是完整设置流程。


步骤 1:开启允许匿名 pull

  1. 登录 Nexus Web 控制台(默认地址:http://<NEXUS_IP>:8081)

  2. 在左侧菜单中点击:"Repositories"

  3. 找到你的 Docker 仓库(如 docker-proxydocker-group

  4. 点击对应仓库右侧的 "⛭" 配置按钮(Manage)

  5. 滑到页面底部,找到配置项:

    复制代码
    [✔] Allow anonymous docker pull
  6. 勾选它后,点击右上角 "Save" 按钮保存设置


步骤 2:启用 Docker Bearer Token Realm

❗ 注意:即使你勾选了"Allow anonymous pull",如果没有启用名为 Docker Bearer Token Realm 的安全模块,匿名访问仍然会失败(出现 unauthorized 错误)

  1. 在左侧菜单点击:"Security → Realms"

  2. 页面分为两列:

    • 左侧:可用的认证模块(Available)
    • 右侧:已启用的模块(Active)
  3. 检查右侧是否包含:

    复制代码
    Docker Bearer Token Realm
  4. 如果没有,点击左侧的该项,然后点击中间的 按钮移动到右侧

  5. 最后点击右上角 "Save" 保存配置


可选:启用匿名用户访问 Nexus

若你希望 Nexus 的匿名用户也能正常访问仓库(适合公网访问或 CI 使用):

  1. 左侧菜单点击:"Security → Anonymous"

  2. 勾选:

    复制代码
    [✔] Allow anonymous users to access the server
  3. 点击保存


验证匿名 pull 是否生效

你可以在未登录状态下,在任意 Docker 客户端执行:

bash 复制代码
docker pull <NEXUS_IP>:5001/library/hello-world

如果返回:

复制代码
Using default tag: latest
latest: Pulling from library/hello-world
...

说明匿名 pull 成功。如果提示 unauthorized,请重新检查 Realm 是否启用。


注意事项

项目 描述
Realm 必须启用 Docker Bearer Token Realm 是匿名访问的关键组件
Proxy/Group 都要设置 要允许匿名 pull,proxygroup 仓库都需要分别开启勾选
Docker client 无需 login 开启后,pull 镜像时不用执行 docker login,适合公共环境或 CI

三、客户端 Docker 设置(使用 HTTP 时)

修改 /etc/docker/daemon.json

json 复制代码
{
  "insecure-registries": ["<NEXUS_IP>:5000", "<NEXUS_IP>:5001", "<NEXUS_IP>:5002"]
}

重启 Docker 服务:

bash 复制代码
sudo systemctl restart docker

四、使用示例:push & pull

登录(push 时必须)

bash 复制代码
docker login <NEXUS_IP>:5002

使用 Nexus 的用户凭证(如 admin / 密码)。


上传你自己的镜像(push)

bash 复制代码
docker tag nginx <NEXUS_IP>:5002/nginx:mytag
docker push <NEXUS_IP>:5002/nginx:mytag

拉取官方镜像(走 proxy 或 group)

bash 复制代码
# 使用 proxy 仓库
docker pull <NEXUS_IP>:5001/library/redis:7

# 使用 group 仓库(推荐)
docker pull <NEXUS_IP>:5000/library/redis:7

注意:Docker Hub 官方镜像需要加上 library/ 前缀。


拉取你自己的镜像

bash 复制代码
# 从 hosted 仓库拉取
docker pull <NEXUS_IP>:5002/nginx:mytag

# 或从 group 仓库拉取
docker pull <NEXUS_IP>:5000/nginx:mytag

五、推荐仓库结构总结

仓库类型 名称 端口 用途
hosted docker-hosted 5002 Push 私有镜像
proxy docker-proxy 5001 拉取并缓存公共镜像
group docker-group 5000 开发统一入口,建议客户端都用它

六、构建相关问题排查:docker build 强制走 HTTPS 导致拉取失败

当你已经通过 Nexus 正常配置并成功拉取镜像后,可能在执行 docker build 时,仍然会出现如下错误:

bash 复制代码
failed to do request: Head "https://docker.local.com/v2/library/openjdk/manifests/17-slim": Connect failed

问题原因

该问题本质上是:

  • 使用了域名访问私库,IP访问就不会又这个问题
  • Docker 构建引擎(BuildKit)默认强制使用 HTTPS
  • 即使你在 /etc/docker/daemon.json 配置了 insecure-registries,BuildKit 仍然忽略它
  • 所以在私有 Nexus(HTTP)环境下会导致构建失败

解决方案

方法一:临时关闭 BuildKit(推荐)
bash 复制代码
DOCKER_BUILDKIT=0 docker build -t your-image .

适用于本地调试或 CI 构建任务。


方法二:全局禁用 BuildKit

修改 /etc/docker/daemon.json

json 复制代码
{
  "insecure-registries": ["docker.local.com"],
  "features": {
    "buildkit": false
  }
}

然后重启 Docker:

bash 复制代码
sudo systemctl restart docker

问题总结

操作 是否使用 insecure-registries 是否默认使用 HTTPS
docker pull ✅ 是 ❌ 否
docker build ⚠️ 依赖 BuildKit 是否开启 ✅ 是

BuildKit 是 Docker 的新一代构建器,虽然性能强,但目前对私有 HTTP 仓库的兼容性仍有问题。在不使用 HTTPS 的场景下,关闭 BuildKit 是最稳妥的解决方案

结语

通过上述配置,你的 Nexus 3 就能作为一套完整的私有 Docker 镜像仓库,支持上传、下载、代理三大功能。不仅便于团队统一镜像源、提高构建速度,还能完全脱离公网依赖。

参考链接