大数据

解决Nexus Docker仓库搜索镜像返回500错误

之前用Nexus给团队搭建了一个数据仓库,其中Docker仓库配置教程已经整理分享到了博客《Nexus3最佳实践系列:搭建Docker私有仓库》,但是一直有个小问题,使用docker search来搜索会返回500错误: 因为平常不怎么使用搜索,而且Nexus前台也有镜像浏览页面,所以一直没花时间去解决。年前封网好不容易有点空闲,寻思着解决下。 经过定位,发现了问题所在:Nexus里面的Docker有3种类型仓库:group、hosted、proxy,也就是组合仓库、本地仓库和代理仓库,其中组合仓库就是本地仓库和代理仓库的聚合,通过测试发现只有本地仓库才支持search请求,其他2种类型仓库都会500错误。所以,报错的直接原因就是我将search的请求转发到了组合仓库导致的。 解决办法非常简单,在nginx转发里面加一条规则即可: Ps:详见之前的文章:https://zhang.ge/5139.html 。 以下是定位过程,不感兴趣的可以忽略。。。 1、确认Nginx代理日志是正常打开状态,并tail -f idocker.io.log实时查看日志; 2、执行docker search发起搜索: 3、回过来查看日志:发现500错误的内容如下(我这边Nginx改成了json格式): 2个重要的信息:搜索请求使用的是GET方法,请求路径是 /v1/search?q=hello-world&n=25。 4、直接对仓库后端一次发起请求,首先试了下group组合仓库,端口8082: 终于看到了关键的报错: 大概意思是不支持SEARCH,于是继续试了下hosted本地仓库,端口8083: 很明显是可以的,然后再试了下proxy代理仓库,都不行。因此确定只有本地仓库是可以搜索的! 回头看了下Nginx代理的配置,发现我之前将所有GET都丢给了组合仓库,也就是转发了拉取请求,将PUT丢给了本地仓库,意思是转发了推送请求。看来,还需要多加一个规则,将搜索请求转发到本地仓库。 也就是得出了上文的规则: 这个规则明显要加到PUT转发规则之后,以覆盖之。 生效后,再次执行 docker search idocker.io/hello-world,结果如下: 问题得到解决~! 当然,还有点遗憾的是代理和组合仓库不支持搜索~希望后续Nexus版本能够考虑加上这个特性。
阅读全文
大数据

Nexus3最佳实践系列:搭建Docker私有仓库

容器仓库是容器化管理中非常重要的一环,相当于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之后,执行如下启动脚本即可: 大概2分钟左右可以完成启动,此时可以通过浏览器访问 http://IP地址:8081 即可出现nexus的web界面: 二、配置 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),如图填写信息: 往下翻页,勾上 “Allow clients to use the V1 API to interact with this Repository”,允许Docker V1 API请求。 至于代理的对象,我可以选择官方的镜像地址:https://registry-1.docker.io,但是官方的比较慢,所以这里我们可以填写国内的Docker镜像加速器地址,比如阿里云或DaoCloud的容器加速: 我这里选择了DaoCloud的镜像加速,这里为了确保能够拉取DockerHub最新的镜像,我选择了Use DockerHub 这个Index。 接着,再创建一个本地仓库,这里比较简单,只需要填写本地仓库的名称,比如 docker-hosted,然后填写HTTP端口即可,比如8083: 保存之后,最后创建一个聚合仓库(group),将代理仓库和本地仓库聚合到一起使用,这里我命名为docker,然后端口选择8082: 这里成员仓库的顺序可以稍微规划下,一般来说将本地的放前面,代理第三方的放后面,好处就是优先使用本地或小众的镜像仓库。我这边是用了多个第三方仓库,所有有多个: 至此,nexus在docker这一块是部署已经完成了,但是这样并不能很好的使用。因为group仓库并不能推送镜像,因为你推送自己制作的镜像到仓库还得通过本地仓库的端口去推送,很不方便! 下面分享一下我这边原创的解决方法:通过Nginx来判断推镜像还是拉镜像,然后代理到不同端口,解决这个问题,还是非常巧妙的。 3、配置Nginx 在部署Nginx部分,我们先需要生成自签名SSL证书,因为后面不想在docker pull的时候还要带一个端口!这里我们需要2个域名,一个用来展示nexus前台,另一个用做docker仓库,比如: nexus前台:repo.xxx.com docker仓库:idocker.io 生成自签名SSL证书的方法网上很多,这里推荐一个一键生成工具,大家可以尝试使用:https://github.com/Fishdrowned/ssl ,使用方法请参考作者说明。 Ps:如果你打算做外网仓库服务,那也可以去申请一个免费SSL证书,我这边是内部oa域名使用,所以只能用自签名证书了。 Nginx的规则如下: Nginx部署完成之后,我们还需要将自签名的根证书(ca.crt)导入到客户端才可以正常使用,否则会报不信任错误。 在上文介绍的一键生成自签名工具中,会生成一个根证书,名称为ca.crt,我们将这个文件上传到客户端服务器的 /etc/docker/certs.d/idocker.io 目录即可(注意目录需要创建,最后的文件夹名称和仓库域名保持一致:idocker.io)。 为了方便后面的人使用,我将上述部署证书的过程弄成一个在线脚本,实现快速部署: 脚本保存为 docker_init.sh,上传到nginx服务器的 /data/wwwroot/repo.xxx.com/download/cert 目录即可。 最终,我们可以使用如下命令行一键部署docker证书: 是不是非常方便? 4、关于高可用 相信用心的同学已经注意到了,Nexus3存在一个单点问题。在看完官方文档后,发现Nexus3的免费版本仅支持单点,只有收费版才支持集群模式: 在高可用方面,我前后做了2个尝试: ①、将数据保存到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等等。我所在的部门也全部用到了,非常好用!感兴趣的同学可以自己去尝试配置,都非常直观简单!当然,后面有空我也会整理一下各个种类仓库的最佳实践,比如各种仓库一键初始化的经验,敬请期待!
阅读全文
系统运维

Docker新手入门实战教程

本文从新手视角记录了一个实际的Dokcer应用场景从创建、上传直到部署的详细过程,并简单的介绍了腾讯云容器服务的使用方法。通过Docker快速拉起一个定制服务,极大的简化了部署,加快了业务部署节奏,并降低了运维成本。 ------ 人生苦短,快用Docker。
阅读全文