Docker镜像仓库可以实现镜像的分发,Docker镜像仓库可分为共有仓库和私有仓库两种,使用公有仓库时,我们可以选择Docker官方的DockerHub,或者国内的镜像仓库,如阿里云等;如果是企业的业务镜像,通常不会放在公有仓库,而是选择私有仓库,目前使用最广的是由Docker官方提供的Docker Registry。
- Docker Registry简介
1.1 Docker Registry功能
Docker Registry作为Docker的核心组件之一,负责镜像内容的存储和分发,Docker客户端的docker pull和docker push命令都直接与Registry进行交互。
1.2 Docker Registry发展史
Docker Registry最初由Python实现,但存在安全性、性能和API的诸多缺陷,在0.9版本后停止了开发。
新一代的Docker Registry又名Distribution,由GO语言开发,所有的API、底层存储方式和系统架构等都进行了全面重新设计。新一代的Docker Registry在2016年4月发布了2.0版本,Docker从1.6版本开始支持Docker Registry2.0版本。Docker Registry从2.4版本开始支持回收站机制,即可以删除镜像,目前已更新到2.8.1版本。
- 部署Docker Registry
2.1 下载Docker Registry镜像
下载Docker Registry镜像时,如果我们不想使用最新版,也可以通过Docker官方去查看有哪些版本,以及如何获取指定版本(查看历史版本界面:https://hub.docker.com/_/registry?tab=tags),例如笔者选择的是2.6.2版本(建议使用2.4之后的版本)。
2.2 登录认证
下载好Docker Registry镜像后,我们可以直接部署,但为了提高镜像仓库的安全性,建议设置Docker Registry的密码认证。
2.2.1 创建授权目录
创建授权使用目录用来管理认证文件,并将该目录挂载到容器内。
2.2.2 创建授权用户和密码
创建授权用户和密码时,需要用到htpasswd命令,如果没有该命令,Ubuntu安装apache2-utils包,CentOS和Rocky安装httpd-tools包。
利用--entrypoint参数将htpasswd命令生成的授权用户和密码传递给Registry仓库,并且将用户名和密码信息保存到授权目录下。
2.3 启动Docker Registry
因为设置了密码验证,启动Docker Registry时需要加较多的参数,具体如下图。容器启动完毕,可以看到5000端口已经打开,并且容器处于运行状态。
Docker Registry启动参数说明:
(1)--restart=always表示容器能随着宿主机进行重启;
(2)-v部分表示将宿主机的授权目录挂载到容器中;
(3)-e部分表示使用环境变量,指定认证信息的位置。
- 测试环节
3.1 登录报错
Docker Registry启动后,直接登录仓库时即使用户名和密码使用正确也会报错。例如笔者使用另一台安装过Docker的主机登录部署好Docker Registry的服务器仓库,会提示使用了http协议给https协议的客户端。
3.2 登录失败解决方案
Docker客户端登录Docker Registry时默认走的是https协议,要想在私有仓库中能成功登录仓库,需要在各个需要登录仓库的Docker服务器中设置--insecure-registry参数,信任本地仓库。
3.2.1 修改docker.service文件
3.2.1.1 添加--insecure-registry参数
通过docker.service文件设置--insecure-registry参数时,需要指定镜像仓库服务器的IP和端口,修改完毕重新加载并启动Docker。查看Docker信息时,“Insecure Registries”部分要能显示镜像仓库的IP和端口。
3.2.1.2 登录测试
此时,Docker客户端已经可以利用授权用户名和密码进行登录。
3.2.1.3 上传镜像
上传镜像时建议将Docker客户端的镜像修改为与本地Docker镜像仓库相同类型的tag,再使用docker push命令将镜像上传到本地私有仓库。
3.2.2 修改daemon.jason文件
3.2.2.1 添加--insecure-registry参数
Docker客户端信任本地仓库的另一种解决方案是修改daemon.jason文件,注意使用此方案时,registries要使用复数。修改完也是重新加载并启动Docker。
3.2.2.2 登录并下载镜像
使用Docker Registry服务器授权的账号名和密码登录本地仓库后,可以使用docker pull命令拉取上一步另一台Docker客户端上传到本地仓库的alpine镜像,并能使用该镜像启动使用容器,说明搭建的Docker Registry是可用的。