使用Nexus3 作为docker 私有仓库,并配置Nginx 代理
技术 Docker Nexus Nginx 37

Nexus3 作为docker 私有仓库

创建一个proxy repo

proxy repo 是作为docker 镜像源的一个repo,当从proxy repo 拉取镜像时,如果proxy repo没有这个镜像,就会从配置的源地址拉取,将镜像存到本地,然后再给到docker。当再次拉取时,就可以直接从本地拉取镜像,不需要再去docker hub 获取了。
对于如果有镜像更新的情况,不用担心,每次拉取镜像时,repo 都会去校验当前的镜像是否时最新的,如果不是,则会重新拉取一份最新的镜像,再给到docker。

  1. 在nexus3 后台页面中创建一个repository,类型选择docker(proxy)
  2. 填入相关参数
    • 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:选填,UsernamePassword 填入docker 官网的用户名和密码,填的话每天可以下载更多镜像(大概是这么个效果,但不填影响不大)
  3. 点击Create repository创建

创建一个host repo

host repo 作为本地创建的镜像的存放地址,如果不想将镜像存到docker hub,就可以上传到这边。

  1. 在nexus3 后台页面中创建一个repository,类型选择docker(host)
  2. 填入相关参数
    • Name:repo 名
    • HTTP:用于推送到本repo 的http 端口
    • Allow anonymous docker pull:允许未登录的用户拉取镜像,看自己情况勾选
    • Storage-Blob store:本地镜像存储的地址
    • Host-Deployment policy:上传镜像的规则
      • Allow redeploy:允许重传,一般选择这个即可
      • Disable redeploy:禁止重传
  3. 点击Create repository创建

创建一个group repo

group repo 可以将多个其他repo 聚合起来,拉取镜像时直接选择group repo 即可。

  1. 在nexus3 后台页面中创建一个repository,类型选择docker(group)
  2. 填入相关参数
    • Name:repo 名
    • Allow anonymous docker pull:允许未登录的用户拉取镜像,看自己情况勾选
    • Storage-Blob store:本地镜像存储的地址
    • Group-Menber repositiories:当前repo 包括的其他repo,将之前创建host repo 和proxy repo 加入右边的Members列表中(host repo 可以优先于proxy repo,以优先拉取本地上传的镜像)
  3. 点击Create repository创建

启用Docker Bearer Token Realm以允许docker 登录nexus

  1. 进入nexus 后台管理页面,Security - Realms
  2. Docker Bearer Token Realm添加到右边Active栏内
  3. 保存

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 修改和配置

  1. 配置docker 默认拉取的镜像为nexus3,需要修改/etc/docker/daemon.json文件,添加以下内容:
    {
      "registry-mirrors": ["https://<my-docker-mirror-host>"]
    }	
    
  2. 如果nexus/nginx 没有配置ssl 访问的话,还需要标记镜像源为"insecure-registry"。同样修改/etc/docker/daemon.json文件,添加以下内容:
    {
        "insecure-registries": ["<my-docker-mirror-host>"],
    }
    
  3. 刷新配置 重启docker
    systemctl daemon-reload
    systemcrl restart docker.service
    
  4. 验证拉取和推送镜像
    如果之前创建repo的时候勾选了Allow anonymous docker pull,则现在就可以直接拉取镜像了。否则需要先登录再拉取
    1. 登录
      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为例:

  1. 使用docker login登录到私服,仅需要登录一次即可。登录方法以上已经讲过,不再细说
  2. 将需要推送的镜像加上一个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
  3. 推送镜像: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

使用Nexus3 作为docker 私有仓库,并配置Nginx 代理
https://halo.persipa.site/2023/1013
作者
Persipa
发布于
更新于
许可