• 对于注定会优秀的人来说,他所需要的,只是时间----博主
  • 手懒得,必受贫穷,手勤的,必得富足----《圣经》
  • 帮助别人,成就自己。愿君在本站能真正有所收获!
  • 如果你在本站中发现任何问题,欢迎留言指正!
  • 本站开启了防爆破关小黑屋机制,如果您是正常登录但被关进小黑屋,请联系站长解除!

<二>企业级开源仓库nexus3实战应用–使用nexus3配置docker私有仓库

nexus eryajf 4周前 (10-16) 1327°C 已收录 0个评论
本文预计阅读时间 31 分钟

*系列汇总*

一两个星期之前,你如果在我跟前说起私服的事情,我大概会绕着你走,因为我对这个东西真的一窍不通。事实上也正如此,开发同学曾不止一次的跟我说公司的私服版本太旧了,许多新的依赖编译之后不会从远程仓库自动缓存下来,然后每次就需要手动的上传,不方便极了。我听了之后,一方面确实因为各种忙碌没有抽开时间,但另一方面,则是每当打开私服面对着满屏的英文时,我都觉得眼前私服毕竟还能用,就不折腾了。

直到偶然一个契机,在网上看到一篇介绍 nexus3.x 的文章,文章写得也比较清晰,我也有兴致细读下去,就这样,开启了我的 nexus3 私服之旅。

开始我以为这个只是针对 maven 私服而存在的工具,后来才发现它所支持的,竟然将运维日常所面临的各种私服都包括了,这就极大的引发了我的钻研兴致,从 maven 私服的研究开始,一发不可收拾的,就又写出了一个 nexus3 系列教程,涵盖了安装,配置,maven 私服,maven 私服从 2.x 到 3.x 的迁移,docker 私服,npm 私服,yum 私服,纵观全网络,大概也找不到一个人如此这般的,倾尽所有的,知无不言的,言无不尽的将 nexus3 作为一个系列写成文章的了。而现在,如果再有人与我说起私服的事情,至少我不会跑了,或许更想停下来了,,,哈哈。这就是付出学习所给人带来的心境上的转化!

前言啰嗦几句,愿您在这个小系列中,学习愉快!

想要查看本系列其他文章:请点此处跳转

希望正在读这段话的你能够在这个小系列中获得自信以及喜悦!

公司已经有 harbor 作为 docker 的镜像仓库,但 Harbor 只能作为私有仓库,当需要 Docker Hub 或其他远程仓库上的镜像时,他就无能为力了。我们就只能手动到远程仓库上进行下载,再重新打标签,然后在推到 harbor 上,才能使用。

我们想要的仓库应该是既能充当私有仓库,又能在你拉取本地没有的镜像时,同步远程的公共镜像仓库,说了这些,就想起,java 项目的日常依赖解决,大概也是这么一个思路。

而为 java 项目提供私有仓库服务的 nexus3,正好也支持 docker 仓库,不仅如此,他还支持 yum, apt, npm, ruby gems, pypi 等诸多类型的仓库功能。因此,我们大概可以感受到,学会 nexus3,走遍天下都不怕!

那么今天,就先来讲解研究一下,如何使用 nexus3 来配置成 docker 的私有仓库。

1,安装 nexus3。

这个地方略了,安装部署可以参考:nexus3 安装配置。

2,配置走起。

1,创建 blob 存储。

登陆之后,先创建一个用于存储镜像的空间。

定义一个 name,下边的内容会自动补全。

然后保存。

这里因为我用的测试服务器演示,因此存储没有那么大,实际生产中使用,建议服务器存储 500G 或以上。

2,创建一个 hosted 类型的 docker 仓库。

点击步骤如下:

而后可见:

所支持种类之丰富,可见一斑。

这里我们看到 docker 类型有三种:

  • hosted : 本地存储,即同 docker 官方仓库一样提供本地私服功能。
  • proxy : 提供代理其他仓库的类型,如 docker 中央仓库。
  • group : 组类型,实质作用是组合多个仓库为一个地址。

我们先来创建一个 hosted 类型的私有仓库。

点击 Repository下面的 Repositories – Create repository – docker(hosted) :

  • Name: 定义一个名称docker-local
  • Online: 勾选。这个开关可以设置这个 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

    整体配置截图如下:

    3,创建一个 proxy 类型的 docker 仓库。

    创建一个 proxy 类型的仓库

  • Name: proxy-docker-hub
  • Repository Connectors: 不设置。
  • Proxy
  • Docker Index Use Docker Hub
  • Storageidocker-hub
  • 整体配置截图如下:

    4,创建一个 group 类型的 docker 仓库。

  • namedocker-group
  • Repository Connectors:启用了一个监听在8082 端口的 http 连接器;
  • Storage:选择专用的 blob 存储idocker-hub
  • group : 将左边可选的 3 个仓库,添加到右边的members下。
  • 整体配置截图如下:

    到这儿,nexus3 的配置算是完成了,接下来就是使用方面的事情了。

    3,小插曲。

    大家也看到了上边的截图都是比较长的,这几张图来的并不容易。在获取这些图的过程中,我尝试过自己御用的截图工具,也尝试过 Chrome 的网页截图,还尝试过其他的各种截图工具,无论是截全屏,还是滚动截图,无所不用其极,却无一能够截出令自己满意的图,哎,都是完美主义(强迫症)做的怪,于是,趁着公司已经夜深无人,我最终通过如下方式截到了心仪的长图。

    不为别的,只为把所分享的东西做的足够精致。当然,各位观众朋友如果有更好的截图工具,并且在 nexus3 这个界面里截出了像我截的那么长的图的话,欢迎在评论区留言分享。

    4,常规方式使用。

    请注意,这种方式经我测试,总是失败,原因还没查出来。如果有人知道原因是什么,麻烦留言区告知一下。

    1,配置

    配置/etc/docker/daemon.json, 由于不是 https,所以要在 daemon.json 中配置一下:

    { "insecure-registries":["192.168.157.110:8082"] }
    

    2,重启 docker。

    $systemctl daemon-reload
    $systemctl restart docker
    

    3,pull 镜像。

    docker pull redis
    

    4,登陆私服。

    docker login -u admin -p admin123 192.168.157.110:8082
    

    5,打标签。

    docker tag docker.io/redis 192.168.157.110:8082/redis
    

    6,push 镜像。

    [root@docker ~]$docker push 192.168.157.110:8082/redis
    
    然后报错:
    
    The push refers to a repository [192.168.157.110:8082/redis]
    902afb26cfff: Layer already exists
    21497520b817: Layer already exists
    a3514b4102be: Layer already exists
    714e32c05337: Layer already exists
    d98fb630fb3b: Layer already exists
    8b15606a9e3e: Layer already exists
    error parsing HTTP 404 response body: unexpected end of JSON input: ""
    

    暂时不知这个报错问题的原因是什么,因为最终没有采用这种方式,所以没有深入探究。

    5,nginx 代理方式。

    以下内容参考张戈博客,中有删改。

    在部署 Nginx 部分,我们先需要生成自签名 SSL 证书,因为后面不想在 docker pull 的时候还要带一个端口!这里我们需要 2 个域名,一个用来展示 nexus 前台,另一个用做 docker 仓库,比如:

    • nexus 前台:repo.ald.com
    • docker 仓库:idocker.io

    1,安装 nginx。

    先通过curl 192.168.106.10/a | sh安装 nginx。

    2,生成证书。

    生成自签名 SSL 证书的方法网上很多,这里推荐一个一键生成工具,大家可以尝试使用:
    ssl

    这个工具。

    创建方式如下:

    #直接切换到应用目录。
    [root@nexus ~]$cd /usr/local/nginx/conf
    
    #下载工具。
    [root@nexus conf]$git clone https://github.com/Fishdrowned/ssl.git
    Cloning into 'ssl'...
    remote: Enumerating objects: 106, done.
    remote: Total 106 (delta 0), reused 0 (delta 0), pack-reused 106
    Receiving objects: 100% (106/106), 171.53 KiB | 286.00 KiB/s, done.
    Resolving deltas: 100% (48/48), done.
    
    #生成证书。
    [root@nexus ssl]$./gen.cert.sh idocker.io
    Using configuration from ./ca.cnf
    Check that the request matches the signature
    Signature ok
    The Subject's Distinguished Name is as follows
    countryName           :PRINTABLE:'CN'
    stateOrProvinceName   :ASN.1 12:'Guangdong'
    localityName          :ASN.1 12:'Guangzhou'
    organizationName      :ASN.1 12:'Fishdrowned'
    organizationalUnitName:ASN.1 12:'idocker.io'
    commonName            :ASN.1 12:'*.idocker.io'
    Certificate is to be certified until Oct 16 06:18:13 2022 GMT (1461 days)
    
    Write out database with 1 new entries
    Data Base Updated
    
    Certificates are located in:
    lrwxrwxrwx 1 root root 37 Oct 16 14:18 /usr/local/nginx/conf/ssl/out/idocker.io/idocker.io.bundle.crt -> ./20181016-1418/idocker.io.bundle.crt
    lrwxrwxrwx 1 root root 30 Oct 16 14:18 /usr/local/nginx/conf/ssl/out/idocker.io/idocker.io.crt -> ./20181016-1418/idocker.io.crt
    lrwxrwxrwx 1 root root 15 Oct 16 14:18 /usr/local/nginx/conf/ssl/out/idocker.io/idocker.io.key.pem -> ../cert.key.pem
    lrwxrwxrwx 1 root root 11 Oct 16 14:18 /usr/local/nginx/conf/ssl/out/idocker.io/root.crt -> ../root.crt
    

    3,配置 nginx。

    将如下配置写入nginx.conf

    upstream nexus_docker_get {
        server 192.168.157.110:8082;
    }
    
    upstream nexus_docker_put {
        server 192.168.157.110:8083;
    }
    server {
        listen 80;
        listen 443 ssl;
        server_name idocker.io;
        access_log /var/log/nginx/idocker.io.log;
        # 证书
        ssl_certificate /usr/local/nginx/conf/ssl/out/idocker.io/idocker.io.crt;
        ssl_certificate_key /usr/local/nginx/conf/ssl/out/cert.key.pem;
        ssl_protocols TLSv1.1 TLSv1.2;
        ssl_ciphers '!aNULL:kECDH+AESGCM:ECDH+AESGCM:RSA+AESGCM:kECDH+AES:ECDH+AES:RSA+AES:';
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:10m;
        # disable any limits to avoid HTTP 413 for large image uploads
        client_max_body_size 0;
        # required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)
        chunked_transfer_encoding on;
        # 设置默认使用推送代理
        set $upstream "nexus_docker_put";
        # 当请求是 GET,也就是拉取镜像的时候,这里改为拉取代理,如此便解决了拉取和推送的端口统一
        if ( $request_method ~* 'GET') {
            set $upstream "nexus_docker_get";
        }
        index index.html index.htm index.php;
        location / {
                proxy_pass http://$upstream;
                proxy_set_header Host $host;
                proxy_connect_timeout 3600;
                proxy_send_timeout 3600;
                proxy_read_timeout 3600;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_buffering off;
                proxy_request_buffering off;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto http;
        }
    }
    
    如果有一些操作与本文不一致,那么请根据自己实际情况进行修改。

    nginx -t 检查没有问题的话,就可以启动 nginx 了。

    4,客户端配置。

    部署完成之后,我们就可以找一台测试机器进行测试了,不过因为我们刚刚定义的是内部使用的域名,所以需要在测试机器上写 hosts 解析,并将证书拷贝过去,否则会报报不信任的错误。

    在上文介绍的一键生成自签名工具中,会生成一个根证书,名称为/usr/local/nginx/conf/ssl/out/root.crt,我们将这个文件上传到客户端服务器的 /etc/docker/certs.d/idocker.io 目录即可(注意目录需要创建,最后的文件夹名称和仓库域名保持一致:idocker.io)。

    现在到一台新主机上测试:

    [root@docker ~]$echo "192.168.157.110 idocker.io" >> /etc/hosts
    [root@docker ~]$mkdir -p /etc/docker/certs.d/idocker.io
    
    然后去 nexus 主机上,将刚才的证书拷过来:
    
    scp /usr/local/nginx/conf/ssl/out/root.crt root@192.168.157.106:/etc/docker/certs.d/idocker.io/ca.crt
    

    接下来,就可以开始真正的使用了。

    6,正式验证。

    1,pull 镜像。

    [root@docker ~]$docker pull docker.io/nginx
    Using default tag: latest
    Trying to pull repository docker.io/library/nginx ...
    latest: Pulling from docker.io/library/nginx
    f17d81b4b692: Pull complete
    d5c237920c39: Pull complete
    a381f92f36de: Pull complete
    Digest: sha256:4ddaf6043a77aa145ce043d4c662e3768556421d6c0a65d303e89977ad3c9636
    Status: Downloaded newer image for docker.io/nginx:latest
    
    [root@docker ~]$docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    docker.io/nginx     latest              dbfc48660aeb        45 minutes ago      109 MB
    

    2,登陆私服。

    这个地方也可能在登陆的时候会报错,说证书过期什么的,如下:
    [root@moban idocker.io]$docker login -u admin -p admin123 idocker.io
    Error response from daemon: Get https://idocker.io/v1/users/: x509: certificate has expired or is not yet valid
    

    报这个错的情况下,大概原因只有一个,那就是,两台服务器的时间不一致,只需要将两台服务器时间保持一致即可。

    yum -y install ntpdate && ntpdate -u cn.pool.ntp.org
    

    分别在两台主机执行之后,发现登陆就成功了。

    [root@docker ~]$docker login -u admin -p admin123 idocker.io
    Login Succeeded
    

    3,打标签。

    [root@docker ~]$docker tag docker.io/nginx idocker.io/nginx
    
    [root@docker ~]$docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    docker.io/nginx     latest              dbfc48660aeb        49 minutes ago      109 MB
    idocker.io/nginx    latest              dbfc48660aeb        49 minutes ago      109 MB
    

    4,push 镜像。

    [root@docker ~]$docker push idocker.io/nginx
    The push refers to a repository [idocker.io/nginx]
    86df2a1b653b: Pushed
    bc5b41ec0cfa: Pushed
    237472299760: Pushed
    latest: digest: sha256:d98b66402922eccdbee49ef093edb2d2c5001637bd291ae0a8cd21bb4c36bebe size: 948
    

    这里上传成功了,再去 nexus3 里边看看是有上去了。

    5,测试从私服拉镜像。

    [root@docker ~]$docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    
    [root@docker ~]$docker pull idocker.io/nginx
    Using default tag: latest
    Trying to pull repository idocker.io/nginx ...
    latest: Pulling from idocker.io/nginx
    f17d81b4b692: Pull complete
    d5c237920c39: Pull complete
    a381f92f36de: Pull complete
    Digest: sha256:d98b66402922eccdbee49ef093edb2d2c5001637bd291ae0a8cd21bb4c36bebe
    Status: Downloaded newer image for idocker.io/nginx:latest
    
    [root@docker ~]$docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    idocker.io/nginx    latest              dbfc48660aeb        59 minutes ago      109 MB
    

    ,7,代理的功能展示。

    下边,我以拉取 gitlab 镜像为例:

    [root@docker ~]$docker pull docker.io/gitlab/gitlab-ce
    Using default tag: latest
    Trying to pull repository docker.io/gitlab/gitlab-ce ...
    latest: Pulling from docker.io/gitlab/gitlab-ce
    3b37166ec614: Pull complete
    504facff238f: Pull complete
    ebbcacd28e10: Pull complete
    c7fb3351ecad: Pull complete
    2e3debadcbf7: Pull complete
    8e5e9b12009c: Pull complete
    0720fffe6e22: Pull complete
    2f336a213238: Pull complete
    1656ee3e1127: Pull complete
    25fa5248fd38: Pull complete
    36b8c1d869a0: Pull complete
    Digest: sha256:0dd22880358959d9a9233163147adc4c8f1f5d5af90097ff8dfa383c6be7e25a
    Status: Downloaded newer image for docker.io/gitlab/gitlab-ce:latest
    

    因为本地没有这个镜像,所以从远程仓库拉取,然后去仓库里看看啥情况:

    这里可以看到,在我们创建的 proxy 当中,已经自动缓存下来了这个镜像。

    接着去我们用的 group 里边看看。

    我们看到 group 里边也已经有了 gitlab 这个镜像,如果以后再有人拉取 gitlab 这个镜像,直接就可以从本地私服进行拉取了,而不用再到公网去下了,事实上,使用 nexus3 作为 maven 的私服其实也是这样一个原理,从而实现节约带宽,节约时间,等等优势。

    可能有同学测试这个功能的时候会不尽如人意,没有得到应有的效果,请不要灰心,也不要沮丧,因为这个问题有可能是看人品的一个事儿,我经过多次测试,才得出这么一个成功的案例,随后我会再深入研究一下这个地方的原理以及问题。

    至此,基本上关于使用 nexus3 搭建 docker 私有仓库的知识点,基本上已经知无不言,言无不尽的分享完毕了。

    8,参考地址。

    感恩前行者的付出,让我们能够走得如此顺畅,感谢自己认真钻研,从而能够把好东西用更好的方式分享出去!

    https://zhangge.net/5139.html
    https://segmentfault.com/a/1190000015629878#articleHeader5


    二丫讲梵 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明<二>企业级开源仓库 nexus3 实战应用–使用 nexus3 配置 docker 私有仓库
    赞赏
    喜欢 (1)or
    [如果想支持本站,可支付宝赞助]
    分享 (0)
    发表我的评论
    取消评论
    表情 贴图 加粗 删除线 居中 斜体 签到

    Hi,您需要填写昵称和邮箱!

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址
    ×
    订阅图标按钮