一. 仓库概念
仓库即存放镜像的地方,分为公有仓库和私有仓库。Docker 的官方仓库为 hub.docker.com
,工作中我们也经常需要搭建公司内部的私有仓库。
Docker 提供了自己的仓库搭建工具,如我们前面介绍的 registry
,工作中更受欢迎的一个 Docker 私服搭建仓库工作为 Nexus
。
二. Nexus Repository 创建私有仓库
2.1 私服概述
私服是假设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当需要下载构件(Maven/NPM/Docker)时,直接请求私服,私服上存在则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地下载。
使用私服,可以避免所有开发人员都从远程互联网下载同一个构件,提升下载效率。另外一个重要的原因,远程仓库通常不会免费提供一个私有仓库,因此对于公司内部使用的构件,我们需要自己搭建私服。
2.2 下载、安装及配置
首先去官网 https://www.sonatype.com/nexus-repository-oss 下载
oss nexus 开源版本,下载后的文件是一个 nexus-xxx-unix.tar.gz 的压缩文件,如下:
下面开始安装 nexus,拷贝压缩包至 /usr/local/nexus
目录,并解压。解压后的文件包含 nexus-3.12.1-01
和 sonatype-work
两个目录,sonatype-work
为 nexus
的默认工作目录:
将 nexus 的脚本路径配置到环境变量中,打开 \etc\profile
在文件末尾添加如下内容:
使用 source \etc\profile
刷新环境变量,接下来即可运行 nexus run/start/stop/restart
一系列命令了。
下面运行 nexus start
在后台启动 nexus
:
上述命令启动时,提示不建议使用 root 用户运行 nexus ,因为 root 用户的权限大,可能会带来安全隐患。使用如下命令查看 nexus 启动情况:
也可以在浏览器中访问 http://192.168.255.128:8081/ 地址,admin 用户名的登录密码默认为 admin123 :
登录 nexus 后,系统默认已经帮我们创建好了一个 maven 的仓库。细心的读者会发现有个关于文件描述符的警告,消除这个警告,我们需要配置 Linux 内核的参数,vim /etc/security/limits.conf
,在文件末尾添加如下内容:
* soft nofile 65536
* hard nofile 65536
然后重启 nexus 即可。
关于如何将 nexus 启动为服务以及防火墙等设置这里不再详细介绍,推荐一篇比较详细的博文:https://blog.csdn.net/nklinsirui/article/details/90029841
nexus 相关的配置主要集中在 3 个文件中:
-
nexus.rc
可以配置 run_as_user ,以消除启动程序时带来的警告。 -
nexus.vmoptions
用来配置 java 虚拟机的资源等信息。 -
nexus-default.properities
用来配置 IP、端口等应用的基本信息。
2.3 Nexus 常用功能
如下图所示,Repository 的类型一共有3种:group
、hosted
以及 proxy
:
- group 仓库组:Nexus 通过仓库组管理多个仓库,在项目组直接请求仓库组即可请求到组中的多个仓库。
- hosted 宿主仓库:主要用于发布内部项目构建或第三方的项目构件(如购买的商业构件),以及无法从公用仓库获取的构件,如 Oracle 的 JDBC 驱动。
- proxy 代理仓库:代理公共的远程仓库。
通常 hosted 仓库有如下3个常用类型(以Maven为例):
- 3rd party:第三方依赖的仓库,由内部人员下载之后再发布上去;
- releases:内部发布的正式稳定版本;
- snapshots:内部发布的快照,为不稳定版本;
三. Nexus Repository 创建Docker私有仓库
3.1 创建 proxy docker repository
Nexus 是一个多仓库的管理软件,可以管理 maven、pypi、npm 以及 docker。下面,我们使用 Nexus 来搭建一个 Docker 私服。
点击新增 repository :
找到 docker 相关的 repository:
首先创建一个 docker(proxy) 作为中央仓库,命名为 docker-central:
Docker 仓库需要配置 Repository Connectors 端口,我们使用 http 协议,并允许 Docker 客户端使用 5000 端口连接 Nexus 仓库:
配置 Proxy,当私服仓库中没有请求的 docker 镜像时,将从 Remote 仓库下载,此处配置的是阿里云的镜像加速器。
注意:Docker index 必须为 Use Docker Hub,原因可以参考官方文档:https://help.sonatype.com/repomanager3/formats/docker-registry/proxy-repository-for-docker
点击保存,生成我们创建的私有 Docker 仓库:docker-central
接下来,我们需要配置我们本地的 Docker 服务,使其支持 http 协议上传和下载:vim /etc/containers/registries.conf
重启 docker 服务,使配置生效:
systemctl restart docker
查看 docker info:
若上述配置不生效,还可以配置 /etc/docker/daemon.json ,在json中添加 insecure-registries:
{"insecure-registries": ["192.168.255.128:5000"]}
载入配置并重启 docker 服务:
systemctl daemon-reload
systemctl restart docker
现在,我们就可以登录 docker 私有仓库了:
使用代理私服来下载镜像:
查看镜像:
在 Nexus 仓库中查看本地仓库中保存的镜像:
这样,当其它人员需要下载该镜像时,就会直接从 内网的私服仓库 下载,相比从互联网上下载,效率可以得到大大的提升。
3.2 创建 hosted docker repository
hosted 仓库用来存放我们自己上传的 docker 镜像,因此无需配置 proxy,定义一个名称,并指定 Repository Connectors 的端口即可:
下面让我们 commit 一个镜像,并上传到 docker-releases 仓库吧:
在 push 时报错了,原因是我们定义的是 http 5001,提交时使用的是 https 5001,因此我们只需要将 5001端口也添加到 insecure-registries 即可:
{"insecure-registries": ["192.168.255.128:5000","192.168.255.128:5001"]}
同理,重启 docker 服务使配置生效,然后上传镜像:
还是没有成功,不过这次是因为没有登录而已啦,登录授权成功后即可:
成功,在 Nexus 客户端已经可以看到我们刚刚上传的镜像了:
3.3 创建组 group docker repository
在3.2的例子中,上传到 nexus 的 personal-mysql 镜像位于 docker-releases 仓库,因此下载该镜像就必须只能使用 50001 端口,这样的话,当我们下载第三方镜像和内部自制镜像就需要指定不同的地址,非常繁琐。
使用 group 仓库可以组织我们的 hosted 和 proxy 仓库,group 中的 proxy 成员无需对外开放端口,只要 group 仓库对外开放一个公共的下载端口即可。
在开始下面的操作前,注意要先取消掉 docker-central 开放的端口5000,否则端口冲突,新的 repository 将无法保存:
创建一个名为 docker-public 的 group 仓库:
添加组成员:
现在,我们即可从开放的 5000 端口下载 docker-central 和 docker-releases 2 个仓库中的镜像了:
下载 docker-releases hosted 仓库中的镜像:
网友评论