Linux下docker私有仓库registry之实现本地免密仓库(一)(docker版本:18.06.1-ce)

续我的上篇博文:https://mp.csdn.net/postedit/88555615

参考文档:https://docs.docker.com/registry/deploying/#get-a-certificate

 

 

docker搭建私有镜像仓库有两种办法:

  1. 第一种用docker命令拉取docker registry,将docker的仓库镜像拉取到本地,在本地构建一个docker仓库,这种方法要自己对仓库进行权限管理,没有图形化页面操作,命令操作比较繁琐,另外在dockertoolbox下搭建私有镜像库出现的问题比较多,建议还是安装linux系统进行搭建。
  2. 第二种集成harbor,docker-compose可以进行图形化页面仓库以及图形化权限管理,harbor也集成了mysql和log。

 

一.背景

 

1.docker hub公共仓库的使用方法:

docker hub是docker公司维护的公共仓库,用户可以免费使用,也可以购买私有仓库。

Linux下docker私有仓库registry之实现本地免密仓库(一)(docker版本:18.06.1-ce)

 

首先在https://cloud.docker.com/或https://hub.docker.com/)网站注册一个帐号

Linux下docker私有仓库registry之实现本地免密仓库(一)(docker版本:18.06.1-ce)

 

在docker主机上登陆

Linux下docker私有仓库registry之实现本地免密仓库(一)(docker版本:18.06.1-ce)


docker hub为了区分不同用户的同名镜像,要求镜像的格式是:username/xxx:tag

Linux下docker私有仓库registry之实现本地免密仓库(一)(docker版本:18.06.1-ce)

 

上传镜像到docker hub

Linux下docker私有仓库registry之实现本地免密仓库(一)(docker版本:18.06.1-ce)

Linux下docker私有仓库registry之实现本地免密仓库(一)(docker版本:18.06.1-ce)

Linux下docker私有仓库registry之实现本地免密仓库(一)(docker版本:18.06.1-ce)
 

从docker hub拉取镜像

Linux下docker私有仓库registry之实现本地免密仓库(一)(docker版本:18.06.1-ce)


删除镜像

Linux下docker私有仓库registry之实现本地免密仓库(一)(docker版本:18.06.1-ce)

 

2.docker hub公共仓库的缺点:

docker hub虽然方便,但是还是有限制

  1. 需要internet连接,速度慢;
  2. 所有人都可以访问;
  3. 由于安全原因企业不允许将镜像放到外网。

好消息是docker公司已经将registry开源,我们可以快速搭建企业私有仓库。


在 Docker 中,当我们执行 docker pull xxx 的时候,可能会比较好奇,Docker 会去哪儿查找并下载镜像呢?

它实际上是从 registry.hub.docker.com 这个地址去查找,这就是Docker公司为我们提供的公共仓库,上面的镜像,大家都可以看到,也可以使用。所以,我们也可以带上仓库地址去拉取镜像, 如:docker pull registry.hub.docker.com/library/alpine,不过要注意,这种方式下载的镜像的默认名称就会长一些。

如果要在公司中使用 Docker,我们基本不可能把商业项目上传到公共仓库中,那如果要多个机器共享,又能怎么办呢?

正因为这种需要,所以私有仓库也就有用武之地了。

所谓私有仓库,也就是在本地(局域网)搭建的一个类似公共仓库的东西,搭建好之后,我们可以将镜像提交到私有仓库中。这样我们既能使用 Docker 来运行我们的项目镜像,也避免了商业项目暴露出去的风险。

下面我们用官方提供的registry镜像来搭建私有镜像仓库,当然还有其它很多方法。

 

二.实验环境(rhel7.3版本)

1.selinux和firewalld状态为disabled

2.各主机信息如下:

主机 ip
server1(Docker) 172.25.83.1

3.在/opt目录下创建目录registry,用于存放registry私有仓库的镜像数据(这个目录也可以是别的目录,目录的名称随意给)

[[email protected] ~]# cd /opt/
[[email protected] opt]# mkdir registry

 

三.registry私有仓库实现本地免密仓库

 

若server1没有registry镜像,则需下载registry.tar,并将其导入为registry镜像。

1、导入registry仓库镜像

 

[[email protected] ~]# docker load -i registry.tar
  • 查看导入的registry镜像

Linux下docker私有仓库registry之实现本地免密仓库(一)(docker版本:18.06.1-ce)

  • 查看导入的registry镜像的历史

Linux下docker私有仓库registry之实现本地免密仓库(一)(docker版本:18.06.1-ce)

 

2、建立本地仓库服务,设定仓库对外的端口是5000(开启容器)

 

[[email protected] ~]# docker run -d --name registry -p 5000:5000 -v /opt/registry/:/var/lib/registry registry:2.3.1   # 通过-v参数来将镜像文件存放在本地的指定路径上
[[email protected] ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                        NAMES
109cab99f831        registry:2.3.1      "/bin/registry /etc/…"   47 seconds ago      Up 45 seconds       0.0.0.0:5000->5000/tcp                       registry

Linux下docker私有仓库registry之实现本地免密仓库(一)(docker版本:18.06.1-ce)

 

3、上传localhost:5000/rhel7:nginx4(要上传的镜像随便选,但是/前面必须是本地localhost或localhost:5000))

 

[[email protected] ~]# docker tag rhel7:nginx4 localhost:5000/rhel7:nginx4   #修改镜像的tag(要求镜像名为username/xxx:tag)
[[email protected] ~]# docker images 
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
localhost:5000/rhel7     nginx4              50b384766482        2 hours ago         23.6MB
[[email protected] ~]# docker push localhost:5000/rhel7:nginx4   #将本地镜像推送到私有仓库
The push refers to repository [localhost:5000/rhel7]
9fd85e6ca660: Pushed   #看到Pushed表示上传成功 
668afdbd4462: Pushed 
nginx4: digest: sha256:96f12a4c433231a0c36d20af593dba0c135fed0aa2d3c180c2c00ac2a9cd5867 size: 739
  • 我们可以看到/opt/registry目录下有相应的registry私有仓库的镜像数据(分层存储)

Linux下docker私有仓库registry之实现本地免密仓库(一)(docker版本:18.06.1-ce)

 

4、测试:下载localhost:5000/rhel7:nignx4

 

在下载之前,

1.我们需要先获取registry仓库类的镜像:

[[email protected] docker]# curl http://172.25.83.1:5000/v2/_catalog  #或curl http://localhost:5000/v2/_catalog
{"repositories":["rhel7"]}

2.我们需要获取某个镜像的标签列表:

错误做法:

[[email protected] registry]# curl http://172.25.83.1:5000/v2/image_name/tags/list   
{"errors":[{"code":"NAME_UNKNOWN","message":"repository name not known to registry","detail":{"name":"image_name"}}]}

正确做法:

[[email protected] registry]# curl http://172.25.83.1:5000/v2/rhel7/tags/list   #或curl http://localhost:5000/v2/rhel7/tags/list
{"name":"rhel7","tags":["nginx4"]}

 

注意:因为是本机下载,所有删除原有的镜像才能看到效果

[[email protected] registry]# docker rmi localhost:5000/rhel7:nginx4   #删除本地镜像
[[email protected] registry]# docker rm -f vm8   #因为上篇博客的内容,所以需要先删除占用rhel7:nginx4镜像的容器vm8
[[email protected] registry]# docker rmi rhel7:nginx4
[[email protected] registry]# docker pull localhost:5000/rhel7:nginx4   #从私有仓库下载该镜像 
nginx4: Pulling from rhel7
269521def953: Already exists 
ff969636d6bb: Pull complete   #看到Pull complete表示成功
Digest: sha256:96f12a4c433231a0c36d20af593dba0c135fed0aa2d3c180c2c00ac2a9cd5867
Status: Downloaded newer image for localhost:5000/rhel7:nginx4

 

Linux下docker私有仓库registry之实现本地免密仓库(一)(docker版本:18.06.1-ce)

 

##如果看不惯镜像localhost:5000/rhel7:nginx4这个名字,可以改名字
[[email protected] registry]# docker tag localhost:5000/rhel7:nginx4 rhel7:nginx4
[[email protected] registry]# docker rmi localhost:5000/rhel7:nginx4

 


搭建本地仓库只是对本机可用,很明显不符合生产要求,于是乎就有了下篇博文的registry私有仓库的加密仓库。