Nexus3 作为docker 私有仓库
创建一个proxy repo
proxy repo 是作为docker 镜像源的一个repo,当从proxy repo 拉取镜像时,如果proxy repo没有这个镜像,就会从配置的源地址拉取,将镜像存到本地,然后再给到docker。当再次拉取时,就可以直接从本地拉取镜像,不需要再去docker hub 获取了。
对于如果有镜像更新的情况,不用担心,每次拉取镜像时,repo 都会去校验当前的镜像是否时最新的,如果不是,则会重新拉取一份最新的镜像,再给到docker。
- 在nexus3 后台页面中创建一个repository,类型选择
docker(proxy)
- 填入相关参数
- Name:repo 名
- Allow anonymous docker pull:允许未登录的用户拉取镜像,看自己情况勾选
- Proxy-Remote storage:代理的docker 镜像源。可以填入docker 官方镜像源
https://registry-1.docker.io
- Proxy-Docker Index:选择
Use Docker Hub
- Storage-Blob store:本地镜像存储的地址
- HTTP-Authentication:选填,
Username
和Password
填入docker 官网的用户名和密码,填的话每天可以下载更多镜像(大概是这么个效果,但不填影响不大)
- 点击
Create repository
创建
创建一个host repo
host repo 作为本地创建的镜像的存放地址,如果不想将镜像存到docker hub,就可以上传到这边。
- 在nexus3 后台页面中创建一个repository,类型选择
docker(host)
- 填入相关参数
- Name:repo 名
- HTTP:用于推送到本repo 的http 端口
- Allow anonymous docker pull:允许未登录的用户拉取镜像,看自己情况勾选
- Storage-Blob store:本地镜像存储的地址
- Host-Deployment policy:上传镜像的规则
- Allow redeploy:允许重传,一般选择这个即可
- Disable redeploy:禁止重传
- 点击
Create repository
创建
创建一个group repo
group repo 可以将多个其他repo 聚合起来,拉取镜像时直接选择group repo 即可。
- 在nexus3 后台页面中创建一个repository,类型选择
docker(group)
- 填入相关参数
- Name:repo 名
- Allow anonymous docker pull:允许未登录的用户拉取镜像,看自己情况勾选
- Storage-Blob store:本地镜像存储的地址
- Group-Menber repositiories:当前repo 包括的其他repo,将之前创建host repo 和proxy repo 加入右边的
Members
列表中(host repo 可以优先于proxy repo,以优先拉取本地上传的镜像)
- 点击
Create repository
创建
启用Docker Bearer Token Realm
以允许docker 登录nexus
- 进入nexus 后台管理页面,
Security - Realms
- 将
Docker Bearer Token Realm
添加到右边Active
栏内 - 保存
nginx 代理配置
为了使用域名访问nexus,可以添加一层nginx 的反向代理。由于免费版Nexus 3 不支持推送到group repo,拉取镜像需要从group repo 拉,推送的话 就需要推送到host repo 了。因此将nginx 分出来两个域名,一个用以拉取,一个用以推送。
推送的端口就是之前再host repo 中配置的HTTP 端口。
拉取的端口使用默认的nexus 端口即可,但需要改一下路径。或者在创建的时候手动给group repo 分配一个端口,就不用改路径了。
参考的nginx 配置如下:
server {
listen 80;
server_name docker-push.nexus.m6.persipa.site;
access_log /var/log/nginx/nexus/docker/access.log;
error_log /var/log/nginx/nexus/docker/error.log;
location / {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://nexus:8082/;
client_max_body_size 0;
}
}
server {
listen 80;
server_name docker.nexus.m6.persipa.site;
access_log /var/log/nginx/nexus/docker/access.log;
error_log /var/log/nginx/nexus/docker/error.log;
location /v2 {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://nexus:8081/repository/docker-group/$request_uri;
}
location /v1 {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://nexus:8081/repository/docker-group/$request_uri;
}
location / {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://nexus:8081;
}
}
docker 配置
daemon.json 修改和配置
- 配置docker 默认拉取的镜像为nexus3,需要修改
/etc/docker/daemon.json
文件,添加以下内容:{ "registry-mirrors": ["https://<my-docker-mirror-host>"] }
- 如果nexus/nginx 没有配置ssl 访问的话,还需要标记镜像源为"insecure-registry"。同样修改
/etc/docker/daemon.json
文件,添加以下内容:{ "insecure-registries": ["<my-docker-mirror-host>"], }
- 刷新配置 重启docker
systemctl daemon-reload systemcrl restart docker.service
- 验证拉取和推送镜像
如果之前创建repo的时候勾选了Allow anonymous docker pull
,则现在就可以直接拉取镜像了。否则需要先登录再拉取- 登录
docker login [SERVER]
- 登录
验证
docker pull
如果之前创建repo的时候勾选了Allow anonymous docker pull
,则现在就可以直接拉取镜像了。docker pull hello-world:latest
。首次拉取,Nexus 会从配置的镜像源先拉取,在给到本地,本地镜像删除后,再次拉取会直接从Nexus 本地返回,就非常快了。
docker auth
如果没有勾选Allow anonymous docker pull
或者是需要推送镜像到Nuxes 仓库的话,那么需要登录了。
使用docker login [SERVER]
命令,如我的拉取地址是docker.nexus.m6.persipa.site
,那么就是docker login docker.nexus.m6.persipa.site
,根据提示输入nexus 的用户名和密码即可。
注意:由于配置的拉取和推送服务器地址不一样,所以拉取和推送的两个地址都需要登录一次。
在登录成功后,默认情况下,docker 会将登录信息保存到~/.docker/config.json
文件。可以查看改文件,确认是否有登录成功。
docker push
配置好了Nexus 私服,需要将自己的镜像推送到私服的话,大致需要以下几个步骤。以nginx:latest 镜像推送到docker.nexus.m6.persipa.site
,改镜像名为persipa/mynginx
并修改版本号为1.0.0
为例:
- 使用
docker login
登录到私服,仅需要登录一次即可。登录方法以上已经讲过,不再细说 - 将需要推送的镜像加上一个tag。
格式为:docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
。
其中源镜像可以是镜像名:tag
也可以是镜像的image id。
目标tag 的格式必须为:push-host[:host-port]/image-name[:tag]
以nginx:latest
镜像推送到docker.nexus.m6.persipa.site
,改镜像名为persipa/mynginx
并修改版本号为1.0.0
为例,即是:docker tag nginx:latest docker.nexus.m6.persipa.site/persipa/mynginx:1.0.0
- 推送镜像:
docker push NAME[:TAG]
,接上例,即是:docker push docker.nexus.m6.persipa.site/persipa/mynginx:1.0.0
参考文档:
Docker Registry - Sonatype Documentation
Docker Authentication - Sonatype Documentation
Nexus3最佳实践系列:搭建Docker私有仓库
使用nexus3配置docker私有仓库
Registry as a pull through cache#Configure the Docker daemon - docker docs
Daemon CLI (dockerd)#Insecure registries - docker docs