当前位置: 首页 > news >正文

在已有 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)
  • 配置示例:
配置项示例值
Namedocker-hosted
HTTP Port5002
Deployment PolicyAllow redeploy
Allow anonymous pull✅(可选)

点击 Create repository


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

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

  • 路径:Repositories → Create repository → docker (proxy)
  • 配置示例:
配置项示例值
Namedocker-proxy
HTTP Port5001
Remote Storagehttps://registry-1.docker.io
Docker IndexUse Docker Hub
Allow anonymous pull✅(推荐)

点击 Create repository


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

用于统一 pull/push 地址。

  • 路径:Repositories → Create repository → docker (group)
  • 配置示例:
配置项示例值
Namedocker-group
HTTP Port5000
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 客户端执行:

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

{"insecure-registries": ["<NEXUS_IP>:5000", "<NEXUS_IP>:5001", "<NEXUS_IP>:5002"]
}

重启 Docker 服务:

sudo systemctl restart docker

四、使用示例:push & pull

登录(push 时必须)

docker login <NEXUS_IP>:5002

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


上传你自己的镜像(push)

docker tag nginx <NEXUS_IP>:5002/nginx:mytag
docker push <NEXUS_IP>:5002/nginx:mytag

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

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

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


拉取你自己的镜像

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

五、推荐仓库结构总结

仓库类型名称端口用途
hosteddocker-hosted5002Push 私有镜像
proxydocker-proxy5001拉取并缓存公共镜像
groupdocker-group5000开发统一入口,建议客户端都用它

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

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

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(推荐)
DOCKER_BUILDKIT=0 docker build -t your-image .

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


方法二:全局禁用 BuildKit

修改 /etc/docker/daemon.json

{"insecure-registries": ["docker.local.com"],"features": {"buildkit": false}
}

然后重启 Docker:

sudo systemctl restart docker

问题总结

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

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

结语

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

参考链接

  • Nexus 3 官方文档 - Docker Registry
  • Docker Hub - openjdk 镜像
  • Docker insecure-registries 配置说明

在这里插入图片描述

http://www.dtcms.com/a/271551.html

相关文章:

  • 如何降低AIGC的有效策略是什么?降AIGC工具的创新与应用前景
  • 如何识别SQL Server中需要添加索引的查询
  • 3 STM32单片机-delay延时驱动
  • langchain从入门到精通(四十)——函数调用技巧与流程
  • 什么是公链?
  • 如何通过配置gitee实现Claude Code的版本管理
  • huggingface 笔记: Trainer
  • 期权盘位是什么意思?
  • 一级缓存与二级缓存深度剖析:作用域、配置与同步方案全解析
  • Unreal Engine 自动设置图像
  • 基于OpenCV的实时人脸检测系统实现指南 ——Python+Haar级联分类器从环境搭建到完整部署
  • 【PTA数据结构 | C语言版】线性表循环右移
  • AI进化论03:达特茅斯会议——AI的“开宗立派”大会
  • 【王阳明代数讲义】心气微积分西方体系汇流历史考述
  • Agent AI(1):多模态交互智能中的背景和动机
  • 2025快手创作者中心发布视频python实现
  • 各类电子设备镜像格式及文件系统统计
  • ETF期权交割日全攻略
  • Linux的 `test`命令(或等价中括号写法 `[空格expression空格]`)的用法详解. 笔记250709
  • 遍历map(LinkedHashMap)
  • 52 spi接口两笔读写耗时多大的问题
  • AP中的Execution Manager“非报告进程”和“伴随进程”概念解析
  • n8n文本语意识别与问题自动补充工作流的深化及企业级部署
  • 代码随想录Day15:二叉树(平衡二叉树、二叉树的所有路径、左叶子之和、完全二叉树的节点个数——全递归版本)
  • 记忆管理框架MemOS——在时序推理上较OpenAI提升159%
  • python+vue的企业产品订单管理系统
  • pytorch常用API
  • [特殊字符] 突破小样本瓶颈:DataDream——用Stable Diffusion生成高质量分类数据集
  • 认证鉴权技术解析:COOKIE | SESSION | TOKEN | JWT | SSO
  • `fatal: bad config value for ‘color.ui‘`错误解决方案