1. 安装 Nexus3
安装部署参考:Nexus3 安装配置。
2. 配置 Docker 私有库
2.1 创建 blob 存储
为方便管理员进行仓库维护,建议按实际需要创建存储镜像的空间,如果不需要创建 blob
,则可跳过这一章节。
给创建的存储空间命名
Type
选择File
,然后补全Name
信息,Path
路径会自动补全。然后保存即可。
PS,实际生产使用的时候,服务器的存储建议要在 500G 以上。
2.2 创建 hosted 类型的私有库
Nexus3 的仓库类型说明,可查看 Nexus3 仓库类型。
点击 Repository
下面的Repositories
– Create repository
– docker(hosted)
:
Name
: 定义一个名称docker-localOnline
: 勾选。这个开关可以设置这个Docker repo是在线还是离线。Repository Connectors
下面包含HTTP和HTTPS两种类型的port。
-
有什么用呢?说明讲得很清楚:
- 连接器允许docker客户端直接连接到docker仓库,并实现一些请求操作,如docker pull, docker push, API查询等。但这个连接器并不是一定需要配置的,尤其是我们后面会用group类型的docker仓库来聚合它。
我们把HTTP这里勾选上,然后设置端口为8083。
-
Force basic authentication
勾选。这样的话就不允许匿名访问了,执行docker pull或 docker push之前,都要先登录:docker login
Docker Registry API Support
Docker registry默认使用的是API v2, 但是为了兼容性,我们可以勾选启用API v1。
Storage
Blob store
:我们下拉选择前面创建好的专用blob:idocker-hub。
Hosted
开发环境,我们运行重复发布,因此Delpoyment policy 我们选择Allow redeploy。
整体配置截图如下:
2.3 创建 proxy 类型的代理库
点击 Repository
下面的Repositories
– Create repository
– docker(proxy)
。
在Name
这里填入当前仓库的名称,例如,docker-proxy-dockerhub 。
在 Proxy
- Remote storage
这里,配置 DockerHub 代理时填入 https://registry-1.docker.io
,配置 K8s 仓库时填入https://k8s.gcr.io
,配置 quay.io 仓库时填入https://quay.io
。
在 Proxy
- Docker Index
这里,配置 DockerHub 代理时选择 Use Docker Hub
,配置其他仓库代理时选择 Use proxy registry(specified above)
。
去掉 Proxy
- Auto blocking enabled
这里的对勾。
在 Storage
- Blob store
这里,为当前配置的代理仓库选择前面创建的存储。
去掉 Negative Cache
- Not found cache enabled
这里的对勾。
重复操作,创建完成 3 个仓库:docker-proxy-dockerhub、docker-proxy-k8sgcr、docker-proxy-quayio。
2.4 创建 group 类型的仓库
点击 Repository
下面的Repositories
– Create repository
– docker(group)
。
在 Name
这里填入当前仓库的命名,例如 docker-proxy-group
在 Repository Connectors
这里,勾选 HTTP
并填入一个未被占用的端口,必须与创建容器时映射的端口号一致。这里我使用 2000。
在 Storage
- Blob store
这里选择前面给它创建的存储。
在 Group
- Member repositorles
这里,将需要整合的仓库添加到右边,并按先后顺序排好。这里我需要整合 DockerHub 和 quay.io 两个仓库的代理,即 docker-proxy-dockerhub 和 docker-proxy-quayio。
2.5 配置 Docker 认证
在 Security
- Realms
选项中,将Docker Bearer Token Realm
添加到右边,保存即可。
3. 常见错误
docker pull
错误 log :
Head "https://<nexus3_ip>/v2/<docker_group_name>/<image_name>":http:server gave HTTP respose to HTTPS client
问题分析:
搭建的 Nexus3 私服,使用的是 http 协议;docker 下载镜像时默认下载的是 https 协议的链接,所以导致失败。
解决方案:
# 修改本地 /etc/docker/daemon.json 文件,如果没有,则新建
vim /etc/docker/daemon.json
{
"insecure-registries":"<nexus3_ip>:<docker_group_port>"
}
# 保存推出后,重启 docker 服务,此处需要 sudo 权限
systemctl daemon-reload && systemctl restart docker