在已有 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-hosted 、docker-proxy |
点击 Create repository。
二、开启匿名 pull(可选,但强烈推荐)
默认情况下,Nexus 的 Docker 仓库 不允许匿名访问,如果你不想让每个人都执行
docker login
才能 pull 镜像,需要额外开启匿名权限。以下是完整设置流程。
步骤 1:开启允许匿名 pull
-
登录 Nexus Web 控制台(默认地址:http://<NEXUS_IP>:8081)
-
在左侧菜单中点击:“Repositories”
-
找到你的 Docker 仓库(如
docker-proxy
或docker-group
) -
点击对应仓库右侧的 “⛭” 配置按钮(Manage)
-
滑到页面底部,找到配置项:
[✔] Allow anonymous docker pull
-
勾选它后,点击右上角 “Save” 按钮保存设置
步骤 2:启用 Docker Bearer Token Realm
❗ 注意:即使你勾选了“Allow anonymous pull”,如果没有启用名为
Docker Bearer Token Realm
的安全模块,匿名访问仍然会失败(出现unauthorized
错误)。
-
在左侧菜单点击:“Security → Realms”
-
页面分为两列:
- 左侧:可用的认证模块(Available)
- 右侧:已启用的模块(Active)
-
检查右侧是否包含:
Docker Bearer Token Realm
-
如果没有,点击左侧的该项,然后点击中间的
→
按钮移动到右侧 -
最后点击右上角 “Save” 保存配置
可选:启用匿名用户访问 Nexus
若你希望 Nexus 的匿名用户也能正常访问仓库(适合公网访问或 CI 使用):
-
左侧菜单点击:“Security → Anonymous”
-
勾选:
[✔] Allow anonymous users to access the server
-
点击保存
验证匿名 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,proxy 和 group 仓库都需要分别开启勾选 |
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
五、推荐仓库结构总结
仓库类型 | 名称 | 端口 | 用途 |
---|---|---|---|
hosted | docker-hosted | 5002 | Push 私有镜像 |
proxy | docker-proxy | 5001 | 拉取并缓存公共镜像 |
group | docker-group | 5000 | 开发统一入口,建议客户端都用它 |
六、构建相关问题排查: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 配置说明