Nexus3最佳实践系列:搭建Docker私有仓库 | 张戈博客

  • 时间:
  • 浏览:90
  • 来源:言午博客 - 专注共享福佳博客活动

容器仓库是容器化管理中非常重要的一环,大慨SVN在守护进程运行研发、运维发布中的地位。不会 ,另一个多多稳定、可靠的容器仓库尤为重要。

目前我知道的的数据仓库有:

  • Docker官方的Registry原生仓库
  • SuSE团队推出的出的Portus:https://github.com/SUSE/Portus
  • VMWare中国团队推出的企业级仓库—Harbor
  • 亲戚亲戚朋友 熟知的Maven私服:Sonatype Nexus3

本文主要介绍下Sonatype Nexus 3这俩功能强大的产品,它不仅要能用于创建Maven私服,还可不都要用来创建yum、pypi、npm、nuget、rubygems等各种私有仓库。不会 ,Nexus从3.0版本也并且并且刚开始 支持创建Docker镜像仓库了!

不会 ,在上述几只产品后边我毫不犹豫的选择了Nexus3作为部门的公共数据仓库,一举多得。

一、部署

这里依然使用最简单的Docker化部署,过程非常之简单!在一台有外网的机器上安装好docker并且,执行如下启动脚本即可:

#!/bin/bash
docker run -dti \
        --net=host \
        --name=nexus \
        --privileged=true \
        --restart=always \
        -e INSTALL4J_ADD_VM_PARAMS="-Xms4g -Xmx4g -XX:MaxDirectMemorySize=8g" \ # 不可能

不都要限制java内存请删除此行
        -v /etc/localtime:/etc/localtime \
        -v /data/nexus:/nexus-data \
        sonatype/nexus3:latest

大慨2分钟左右可不都要完成启动,此时可不都要通过浏览器访问 http://IP地址:60 81 即可再次再次出现nexus的web界面:

Nexus前台启动界面

二、配置

1、配置Blob存储

点击右上角的Sign in,输入默认账号密码:admin/admin123 登录到管理员身份。

打开控制页面的按钮,默认进入了仓库配置界面,选择Blob Stores并且并且刚开始 创建存储空间:

我这边创建了如下Blob,以备后用:

2、创建Docker仓库

回到前面的repository界面,点击repositories打开页面后点击【create repository】打开仓库类型选择界面(真的非常充沛!):

可不都要看了Docker有某种类型,分别是docker(group),docker(hosted),docker(proxy)。其含义解释如下:

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

下面并且并且刚开始 创建Docker仓库:

首先,亲戚亲戚朋友 创建另一个多多docker代理仓库,点击docker(proxy),如图填写信息:

往下翻页,勾上 “”,允许Docker V1 API请求。

至于代理的对象,不会 你选择官方的镜像地址:https://registry-1.docker.io,不会 官方的不难 ,要是 这里亲戚亲戚朋友 可不都要填写国内的Docker镜像加速器地址,比如阿里云或DaoCloud的容器加速:

我这里选择了DaoCloud的镜像加速,这里为了确保要能拉取DockerHub最新的镜像,我选择了Use DockerHub 这俩Index。

接着,再创建另一个多多本地仓库,这里比较简单,只都要填写本地仓库的名称,比如 docker-hosted,不会 填写HTTP端口即可,比如60 83:

保存并且,最后创建另一个多多聚合仓库(group),将代理仓库和本地仓库聚合到并肩使用,这里我命名为docker,不会 端口选择60 82:

这里成员仓库的顺序可不都要稍微规划下,一般来说将本地的放前面,代理第三方的放后边,好处要是 优先使用本地或小众的镜像仓库。我这边是用了多个第三方仓库,所有有多个:

至此,nexus在docker这俩块是部署不可能 完成了,不会 另另一个多多不想能很好的使用。不可能 group仓库不想能推送镜像,不可能 你推送当时人制作的镜像到仓库还得通过本地仓库的端口去推送,很不方便!

下面分享一下我这边原创的补救方式:通过Nginx来判断推镜像还是拉镜像,不会 代理到不同端口,补救这俩问提,还是非常巧妙的。

3、配置Nginx

在部署Nginx主次,亲戚亲戚朋友 先都要生成自签名SSL证书,不可能 后边不会在docker pull的并且都要带另一个多多端口!这里亲戚亲戚朋友 都要另一个多多域名,另一个多多用来展示nexus前台,另另一个多多用做docker仓库,比如:

nexus前台:repo.xxx.com

docker仓库:idocker.io

生成自签名SSL证书的方式网上要是 ,这里推荐另一个多多一键生成工具,亲戚亲戚朋友 可不都要尝试使用:https://github.com/Fishdrowned/ssl ,使用方式请参考作者说明。

Ps:不可能 你打算做外网仓库服务,那也可不都要去申请另一个多多免费SSL证书,我这边是内部oa域名使用,也都要能 都要能 用自签名证书了。

Nginx的规则如下:

upstream nexus_web {
    server 192.168.1.60

:60

81;
}

upstream nexus_docker_get {
    server 192.168.1.60

:60

82;
}

upstream nexus_docker_put {
    server 192.168.1.60

:60

83;
}
server {
    listen 60

;
    listen 443 ssl;
    server_name idocker.io;
    access_log /data/wwwlogs/idocker.io.log access_log_json;
    # 证书
    ssl_certificate /data/wwwroot/ssl/out/idocker.io/idocker.io.crt;
    ssl_certificate_key /data/wwwroot/ssl/out/idocker.io/idocker.io.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";
    }
    # 都要能要能


本地仓库才支持搜索,要是

将搜索请求转发到本地仓库,不会

再次再次出现60

0报错
    if ($request_uri ~ '/search') {
        set $upstream "nexus_docker_put"; 
    }  
    index index.html index.htm index.php;
    location / {
            proxy_pass http://$upstream;
            proxy_set_header Host $host;
            proxy_connect_timeout 360
0;
            proxy_send_timeout 360
0;
            proxy_read_timeout 360
0;
            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;
    }
}
server {
    listen 60

;
    listen 443 ssl;
    server_name repo.xxx.com;
    index index.html index.htm index.php;
    ssl_certificate /data/wwwroot/ssl/out/repo.xxx.com/repo.xxx.com.crt;
    ssl_certificate_key /data/wwwroot/ssl/out/repo.xxx.com/repo.xxx.com.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;
    access_log /data/wwwlogs/repo.xxx.com.log access_log_json;
    location /download {
        root /data/wwwroot/repo.xxx.com;
    }
    location / {
            proxy_pass http://nexus_web;
            proxy_set_header Host $host;
            client_max_body_size 512m;
            proxy_connect_timeout 360
0;
            proxy_send_timeout 360
0;
            proxy_read_timeout 360
0;
            proxy_buffering off;
            proxy_request_buffering off;
    }
}

Nginx部署完成并且,亲戚亲戚朋友 还都要将自签名的根证书(ca.crt)导入到客户端才可不都要正常使用,不会 会报不信任错误。

在上文介绍的一键生成自签名工具中,会生成另一个多多根证书,名称为ca.crt,亲戚亲戚朋友 将这俩文件上传到客户端服务器的 /etc/docker/certs.d/idocker.io 目录即可(注意目录都要创建,最后的文件夹名称和仓库域名保持一致:idocker.io)。

为了方便后边的人使用,我将上述部署证书的过程弄成另一个多多在线脚本,实现快速部署:

#!/bin/bash
bakfile=/tmp/hosts_$RANDOM
# 定义仓库域名和nexus前台域名
docker_domain=idocker.io
repo_domain=repo.xxx.com
# 绑定仓库域名解析
cp /etc/hosts $bakfile || exit 1
echo "/etc/hosts is bakcup to $bakfile"
if grep -q "$idocker_domain" /etc/hosts;then
    sed -i 's/.*$docker_domain/192.168.1.60

 $docker_domain/g' /etc/hosts
else
    echo "192.168.1.60

 $docker_domain" >> /etc/hosts
fi
echo
# 探测到仓库是否畅通
if which telnet >/dev/null 2>&1;then
    echo start trying to connect to $docker_domain:443 ...
    if ! echo "e" | telnet -e "e" $docker_domain 443 >/dev/null;then
       echo "Can not connect to $docker_domain:443,Plz check!"
    else
       echo connect success.
    fi
fi
echo
# 并且并且刚开始

部署证书
mkdir -p /etc/docker/certs.d/$docker_domain
curl -s -o /etc/docker/certs.d/$docker_domain/ca.crt http://$repo_domain/download/cert/ca.crt

echo Docker repository init success, you need login when you want upload docker images.
echo 'Plz Run "docker login --username=idocker $docker_domain"'

脚本保存为 docker_init.sh,上传到nginx服务器的 /data/wwwroot/repo.xxx.com/download/cert 目录即可。

最终,亲戚亲戚朋友 可不都要使用如下命令行一键部署docker证书:

curl -sSL http://repo.xxx.com/download/scripts/docker_init.sh | sh -s

是都是非常方便?

4、关于高可用

相信用心的同学不可能 注意到了,Nexus3占据 另一个多多单点问提。在看了官方文档后,发现Nexus3的免费版本仅支持单点,都要能要能 收费版才支持集群模式:

在高可用方面,我前后做了另一个多多尝试:

①、将数据保存到ceph分布式存储:能用,不会 push的带宽我觉得不敢恭维!layer文件越小越慢。

②、折中方案:另内部署另一个多多节点,每隔一段时间将主节点数据同步过去,不会 备份节点每隔一段时间重启一次(不重启语句数据不想更新),不会 数据再同步一份到ceph确保安全。在Nginx中,将备份节点加入到backup,当主节点宕机的并且,备机可不都要顶上来继续使用。

当然, 我觉得另另一个多多做还缺乏的同学也可不都要参考官方的备份文档进一步优化:https://help.sonatype.com/repomanager3/high-availability/designing-your-cluster-backup-restore-process

三、小结

docker仓库的使用不会 你不再赘述了,nexus亲戚亲戚朋友 使用的是group这俩聚合仓库,本地那末的镜像会去外网搜索,不可能 占据 则拉取并缓存到本地,下次再拉取则直接使用缓存数据。要是 ,在拉取外网的镜像时,第一次会不难 ,第二次就和本地基本一致了。

上文提到,Nexus还有一点要是 实用仓库,比如yum、python、npm、maven等等。我所在的部门也完整版用到了,非常好用!感兴趣的同学可不都要当时人去尝试配置,都非常直观简单!当然,后边有空我也会下发一下各个种类仓库的最佳实践,比如各种仓库一键初始化的经验,敬请期待!