使用 Nexus OSS 为 Docker 镜像提供代理/缓存功能
今天记录一下利用 Nexus OSS 建立 Docker 镜像代理的过程。
前言
众所周知,在国内直接使用 docker 的官方镜像速度是很慢的,一般都需要使用镜像代理。不过,国内的代理一般采用定时同步的方式,镜像的版本更新不够及时,而且像 Github (ghcr.io),Google (gcr.io)等第三方库一般都是没有代理的,这就需要自行搭建镜像代理。除此之外,一些公司需要私有仓库上传一些内部的镜像,也可以用 nexus 实现。
搭建
这边我准备使用 docker 容器的方式搭建 nexus,不容易出现问题。
启动 Nexus 容器
这里选用 nexus3 的最新版本,当前为 3.34.1-01
1 | docker run -d --name nexus --restart=always \ |
docker-compose 方式:
1 | version: "3.8" |
nexus 官方镜像的默认参数要求还挺高的。根据 nexus 的 dockerfile,可以看到可以通过环境变量INSTALL4J_ADD_VM_PARAMS
覆盖默认参数。如果机器配置挺高的,可以不加上面的环境变量。
默认参数:
1 | ENV INSTALL4J_ADD_VM_PARAMS=-Xms2703m -Xmx2703m -XX:MaxDirectMemorySize=2703m -Djava.util.prefs.userRoot=/nexus-data/javaprefs |
当 8081 端口可以访问后,启动就完成了。
注意,给挂载的文件夹高点的权限,我这边直接给了 777,不然会报错,部分文件夹建不出来。
配置 Nexus OSS
初始账号 admin,密码在挂载文件夹中的 admin.password
文件中。通过以下命令获取初始密码:
1 | docker exec nexus3 cat /nexus-data/admin.password |
为 Docker Hub 添加 Docker Proxy Repository
点击创建 Repository
可以看到支持非常多的内容,这里选择docker(proxy)
。
关键内容:
Proxy
-Remote storage
配置成https://registry-1.docker.io
Proxy
-Docker Index
选择Use Docker Hub
,能够保持最新
保存即可
为 ghcr.io 添加 Docker Proxy Repository
这边再为 ghcr.io 创建一个代理,其他第三方仓库可以参考。
创建一个 Docker Group Repository
现在创建一个 Docker Group Repository,这是我用 nexus 而不是官方的 docker registry 来创建代理的一个重要原因,可以把所有 docker 代理集合在一起共用一个地址。
这个 Repository 是我实际访问的仓库,所以要创建一个 http connector,端口自定,只要不是 8081。勾选 Allow anonymous docker pull
,允许不登录执行 docker pull
。
权限配置
这里要在Security
-Realms
里面启用Docker Bearer Token Realm
,否则 docker 无法使用。
Nginx 代理
也许你注意到,我刚刚配置的是 http connector,而且也没有给 nexus 配置 ssl。如果不想配置,可以直接使用刚刚的 8082
端口使用了。
这里是我的 nginx 配置,注意替换 server_name,和 nexus 的地址,大家参考着来。这样配置,可以让 docker 仓库 、其他仓库(maven)和 webui 共用地址。
1 | server |
使用
直接使用
范例:
这样拉取一个官方 redis 镜像。
1 | docker pull nexus.example.com/redis |
这样拉取一个 Github(ghcr.io) 的 zvonimirsun/yourls 镜像。
1 | docker pull nexus.example.com/zvonimirsun/yourls |
注意:
- docker pull 的时候不要加
https://
- docker api 不支持 content-path,docker pull 直接使用根地址加上对应的包名,不要使用 repo 列表后面复制的 url。
配置到镜像
现在可以将地址配置到 docker 配置中了,nexus 本地找不到的仓库会依次去 group 中配置的 proxy repo 里面查找。
/etc/docker/daemon.json
1 | { |
如果是 http 地址,则配置到 insecure-registries 里。
现在 docker pull 使用的就是 nexus 的代理地址了,可以省去前面的地址了。