Docker Registry本地私有仓库搭建

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Docker Registry本地私有仓库搭建

相比Docker Hub而言,Docker Registry的功能就不够全面了,且需要自己手动配置、升级、维护和管理,所以说对于Docker镜像管理不太熟悉的人员推荐使用Docker Hub。如果开发者想要严格控制镜像存储位置,完全拥有自己的镜像分配渠道,或者要想将镜像存储和分布紧密嵌入到自己开发的程序中,则选择Docker Registry更适合。接下来,本小节将针对Docker Registry本地私有镜像仓库的管理进行详细讲解。

1.启动Docker Registry

使用Docker官方提供的Registry镜像就可以搭建本地私有镜像仓库,具体指令如下。

$ docker run -d
-p 5000:5000
–restart=always
–name registry
-v /mnt/registry:/var/lib/registry
registry:2

在上述指令中,涉及到的参数说明如下:

● -d:表示在后台运行该容器;

● -p 5000:5000:表示将私有镜像仓库容器内部默认暴露的5000端口映射到宿主机的5000端口;

● --restart=always:表示容器启动后自动启动本地私有镜像仓库;

● --name registry:表示为生成的容器命名为registry;

● -v /mnt/registry:/var/lib/registry:表示将容器内的默认存储位置/var/lib/registry中的数据挂载到宿主机的/mnt/registry目录下,这样当容器销毁后,在容器中/var/lib/registry目录下的数据会自动备份到宿主机指定目录。

小提示:

Docker Registry目前有v1和v2两个版本,v2版本并不是v1版本的简单升级,而是在很多功能上都有了改进和优化。v1版本使用的是Python开发的,而v2版本是用go语言开发的;v1版本本地镜像仓库容器中数据默认挂载点是/tmp/registry,而v2版本的本地镜像仓库容器中数据默认挂载点是/var/lib/registry。

2.重命名镜像

之前推送镜像时,都是默认推送到远程镜像仓库,而本次是将指定镜像推送到本地私有镜像仓库。由于推送到本地私有镜像仓库的镜像名必须符合“仓库IP:端口号/repository”的形式,因此需要按照要求修改镜像名称,具体操作指令如下。

$ docker tag hellodocker:latest localhost:5000/myhellodocker

执行上述指令后,再次使用docker images命令查看现有镜像,如图1所示。

图1 镜像列表

从图1中可以看出,在仓库中多了一个名称为localhost:5000/myhellodocker的镜像。

3.推送镜像

本地私有镜像仓库搭建并启动完成,同时要推送的镜像也已经准备就绪后,就可以将指定镜像推送到本地私有镜像仓库了,具体操作指令如下。

$ docker push localhost:5000/myhellodocker

执行上述指令后,就可以完成镜像的推送。为了验证推送结果,我们可以在宿主机浏览器上输入地址http://localhost:5000/v2/myhellodocker/tags/list进行查看(使用该地址时注意镜像名称),其显示效果如图2所示。

图2 本地镜像仓库效果

从图2可以看出,浏览器已经显示出了相应信息,这说明镜像推送成功。

我们在推送镜像的过程中,还将数据映射到了本地磁盘,因此可以在本地磁盘的/mnt/registry/docker/registry/v2/repositories目录(即-v参数指定的宿主机数据映射位置)进行查看,如图3所示。

图3 本地镜像仓库效果

需要注意的是,如果通过浏览器访问发现推送成功,而本地磁盘位置却未发现对应的镜像,这就需要确认在启动本地镜像仓库时是否使用了-v参数,以及数据挂载位置是否正确。

通过上一节搭建的Docker Registry本地镜像仓库虽然可以正常使用,但在实际开发中,为保障系统的安全性及私密性,我们还必须为本地搭建的私有镜像仓库配置认证证书、登录账号等才能用于真正的服务。接下来,本小节将针对Docker Registry本地私有仓库的配置进行详细讲解。

1.Docker Registry本地私有仓库配置

在配置Docker Registry本地私有仓库时,首先我们必须明确在哪台Docker机器上搭建该私有仓库,然后根据私有仓库搭建的相关要求进行逐一配置,其具体操作步骤如下。

(1)查看Docker Registry私有仓库搭建地址

这里我们仍然以前面演示Docker入门程序的Docker主机为例,将在该机器上搭建并配置Docker Registry本地私有仓库。我们可以在Docker机器终端使用ifconfig命令查看该机器的IP地址,具体效果如图1所示。

图1 本地镜像仓库ip地址

从图1可以看出,此次将要搭建和配置的Docker Registry本地私有仓库的Docker主机IP地址为192.168.197.139。

(2)生成自签名证书

要确保Docker Registry本地镜像仓库的安全性,还需要一个安全认证证书,来保证其他Docker机器不能随意访问该机器上的Docker Registry本地镜像仓库,所以需要在搭建Docker Registry本地镜像仓库的Docker主机上先生成自签名证书(如果已购买证书就无需生成),具体操作指令如下。

$ mkdir registry && cd registry && mkdir certs && cd certs

$ openssl req -x509 -days 3650 -subj ‘/CN=192.168.197.139:5000/’

-nodes -newkey rsa:2048 -keyout domain.key -out domain.crt

在终端home目录下执行上述指令后,首先会在home目录下创建并进入registry/certs目录,然后使用openssl生成一个自签名的证书。

关于openssl命令中的一些参数说明如下。

● -x509:x509是一个自签发证书的格式;

● -days 3650:表示证书有效期;

● 192.168.197.139:5000:表示具体部署Docker Registry本地镜像仓库的地址和端口;

● rsa:2048:是证书算法长度;

● domain.key和domain.crt:就是生成的证书文件。

需要特别注意的是,Docker Registry本地镜像仓库的地址和端口,要根据读者自己机器的IP或者域名进行修改。

(3)生成用户名和密码

在Docker Registry本地镜像仓库所在的Docker主机上生成自签名证书后,为了确保Docker机器与该Docker Registry本地镜像仓库的交互,还需要生成一个连接认证的用户名和密码,使其他Docker用户只有通过用户名和密码登录后才允许连接到Docker Registry本地镜像仓库。

生成连接认证的具体操作指令如下(继续在上面生成的certs目录下执行以下指令)。

$ cd … && mkdir auth

$ docker run --entrypoint htpasswd registry:2 -Bbn shitou 123 > auth/htpasswd

执行上述指令后,首先会在前面的registry目录下再创建一个auth子目录并进入该子目录,然后使用docker run指令生成用于访问Docker Registry本地镜像仓库服务的用户名和密码(shitou是用户名,123是密码)。

(4)启动Docker Registry本地镜像仓库服务

完成上面的准备工作后,就可以正式部署带有安全认证的本地私有镜像仓库了(需要将前面小节中运行的Docker Registry删除),具体指令如下。

$ docker run -d
-p 5000:5000
–restart=always
–name registry
-v /mnt/registry:/var/lib/registry
*-v pwd/auth:/auth *
-e “REGISTRY_AUTH=htpasswd”
-e “REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm”
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
*-v pwd/certs:/certs *
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key
registry:2

上述指令中的多个参数在7.4.3小节已经有过介绍,除此之外还使用了-v和-e参数在启动Docker Registry仓库服务时配置了认证证书和和连接的用户信息。上述指令是在前面生成的registry目录下执行的,如果在其他目录下执行,需要修改-v参数中auth和certs所在的宿主机文件路径。

(5)配置Docker Registry访问接口

完成Docker Registry本地镜像仓库服务启动后,还需要在搭建了Docker Registry本地镜像仓库所在的Docker主机上配置供其他Docker机器访问的接口,具体指令如下。

$ sudo mkdir -p /etc/docker/certs.d/192.168.197.139:5000

$ sudo cp certs/domain.crt /etc/docker/certs.d/192.168.197.139:5000

在Docker Registry本地镜像仓库所在的Docker主机上分别执行上述指令,就完成了Docker Registry访问客户端的配置。

上述指令中,第一条指令用于创建一个证书目录,要注意的是192.168.197.139:5000目录名要与启动的Docker Registry服务地址端口一致;第二条指令将生成的domain.crt证书复制到刚才创建的证书目录下。

2、验证测试

通过前面几个步骤的操作,配置有安全认证的Docker Registry本地私有仓库就已经完成启动设置,接下来我们就可以在其他Docker主机上向该Docker Registry本地私有仓库推送镜像来进行测试了,具体步骤如下。

(1)Docker Registry私有仓库使用登记

其他Docker机器如果想要与配置有自签名证书和账号认证的私有仓库进行通信,就必须在各自Docker主机上配置该私有仓库地址,进行使用登记(此处就以部署了Docker Registry镜像仓库的Docker机器为例,在同一台机器上进行演示)。

在该Docker机器终端使用sudo vim /etc/docker/daemon.json命令编辑daemon.json文件,在该文件中添加如下内容。

{“insecure-registries”:[“192.168.197.139:5000”]}

上述内容中的192.168.197.139:5000就是要访问的Docker Registry私有仓库地址。

需要注意的是,daemon.json文件中配置的内容都是在同一个大括号“{}”中以“key:value”形式存在的文本,多个“key:value”配置中间用英文逗号“,”分隔,具体效果如图2所示。

图2 daemon.json文件

从图2可以看出,daemon.json文件中的配置内容包括前面小节介绍的镜像加速器,以及Docker Registry私有仓库地址。

编辑完成并保存后,需要重启Docker进程,具体指令如下。

$ sudo /etc/init.d/docker restart

执行完上述操作后,配置了该仓库服务地址的Docker主机就可以与Docker Registry私有仓库进行通信,来完成镜像的搜索、拉取和推送等操作。

(2)准备镜像文件

在该Docker主机上重命名一个Docker镜像,具体指令如下。

$ docker tag hello-world:latest 192.168.197.139:5000/myhelloworld

执行上述指令后,可以通过docker images命令查看当前Docker主机上镜像列表中存在的所有镜像,效果如图3所示。

图3 本地镜像列表

(3)推送镜像

通过docker push指令向Docker Registry本地私有镜像仓库推送该镜像,具体指令如下。

$ docker push 192.168.197.139:5000/myhelloworld

执行上述指令后,就会有错误信息提示,如图4所示。

图4 推送镜像

从图4可以看出,推送过程中出现错误,信息提示为:no basic auth credentials(即没有通过身份验证),所以无法进行推送,这也就说明身份验证的配置有效。要想成功推送,需要先登录成功后再推送。

(4)登录Docker Registry镜像仓库

在该Docker主机上通过docker login指令先登录到Docker Registry本地私有镜像仓库,具体指令如下。

$ docker login 192.168.197.139:5000

使用上述指令就可以进行Docker Registry本地私有镜像仓库的登录了。需要注意的是,这里使用docker login指令后必须添加Docker Registry镜像仓库服务地址和端口。当登录成功后,终端会返回有“Login Succeeded”登录成功的提示信息。

(5)再次推送镜像

登录成功后,再次通过docker push指令向Docker Registry本地私有镜像仓库推送刚才命名的镜像,具体指令与第二步指令相同。

(6)结果验证

通常情况下,通过上一步推送后的返回信息就可以判断是否推送成功,当然最严谨和直观的方法就是在Docker Registry服务挂载的镜像目录上进行结果验证。在本地磁盘的(即-v命令指定的宿主机数据挂载点位置)/mnt/registry/docker/registry/v2/repositories目录进行查看,其显示结果如图5所示。

图5 本地镜像仓库效果

从图5可以看出,名为myhelloworld的镜像已成功推送到了Docker Registry本地私有镜像仓库。至此Docker Registry本地私有镜像仓库的具体管理配置就已讲解完成。

小提示:

Docker官方提供的镜像管理仓库Docker Hub是一个可视化的并且集成了多种功能的镜像管理工具,而Docker提供的本地私有镜像仓库Docker Registry却没有像样的可视化管理工具,虽然这种本地私有镜像仓库完全不影响实际使用,但是从管理和效果上感觉却不是很方便。针对这种情况,一些社区专门开发了Docker Registry的可视化管理工具来方便本地镜像仓库管理,其中比较流行的一款软件叫做Portus,他集成了一些镜像管理功能,可以完全可视化的管理仓库镜像和访问用户,感兴趣的读者可以自行查询相关资料进行学习。


相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
2月前
|
Docker 容器
Docker自建仓库之Harbor高可用部署实战篇
关于如何部署Harbor高可用性的实战教程,涵盖了从单机部署到镜像仓库同步的详细步骤。
137 15
Docker自建仓库之Harbor高可用部署实战篇
|
2月前
|
存储 Kubernetes Cloud Native
部署Kubernetes客户端和Docker私有仓库的步骤
这个指南涵盖了部署Kubernetes客户端和配置Docker私有仓库的基本步骤,是基于最新的实践和工具。根据具体的需求和环境,还可能需要额外的配置和调整。
86 1
|
1月前
|
网络协议 应用服务中间件 nginx
私有的docker私有镜像站仓库harbor
私有的docker私有镜像站仓库harbor
|
2月前
|
存储 测试技术 数据安全/隐私保护
Docker自建仓库之Harbor部署实战
关于如何部署和使用Harbor作为Docker企业级私有镜像仓库的详细教程。
560 12
|
2月前
|
Docker 容器
Docker Hub镜像公共仓库使用
这篇文章介绍了如何使用Docker Hub公共仓库进行镜像的创建、上传、下载和管理。
1004 8
|
2月前
|
运维 数据安全/隐私保护 Docker
Docker自建仓库之Docker Registry部署实战
关于如何使用Docker Registry镜像搭建本地私有Docker仓库的实战教程,包括了下载镜像、创建授权目录和用户名密码、启动Registry容器、验证端口和容器、测试登录仓库、上传和下载镜像的详细步骤。
693 5
|
3月前
|
存储 Docker 容器
阿里云私有docker仓库构建海外镜像
【8月更文挑战第25天】
297 3
|
4月前
|
存储 Docker 容器
入职必会-开发环境搭建50-Docker必会搭建Docker私有仓库
Docker官方的Docker hub(https://hub.docker.com)是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像到本地也可以把我们自己的镜像推送上去。但是有时候我们的服务器无法访问互联网或者不希望将自己的镜像放到公网当中,那么我们就需要搭建自己的Docker私有仓库来存储和管理自己的Docker镜像。
入职必会-开发环境搭建50-Docker必会搭建Docker私有仓库
|
2月前
|
应用服务中间件 nginx 数据安全/隐私保护
使用Harbor搭建Docker私有仓库
Harbor是一款开源的企业级Docker仓库管理工具,分为私有与公有仓库两种类型,其中私有仓库被广泛应用于运维场景。Harbor提供图形化界面,便于直观操作,并且其核心组件均由容器构建而成,因此安装时需预先配置Docker及docker-compose。Harbor支持基于项目的用户与仓库管理,实现细粒度的权限控制;具备镜像复制、日志收集等功能,并可通过UI直接管理镜像,支持审计追踪。部署Harbor涉及配置文件调整、登录认证等步骤,并可通过客户端进行镜像的上传、拉取等操作。系统内置多种角色,包括受限访客、访客、开发者、维护人员及管理员,以满足不同场景下的使用需求。
123 0
|
3月前
|
安全 Linux 数据安全/隐私保护
详解如何登录Docker Registry
【8月更文挑战第24天】
287 0