续我的上篇博文:https://mp.csdn.net/postedit/88555615
参考文档:https://docs.docker.com/registry/deploying/#get-a-certificate
docker搭建私有镜像仓库有两种办法:
- 第一种用docker命令拉取docker registry,将docker的仓库镜像拉取到本地,在本地构建一个docker仓库,这种方法要自己对仓库进行权限管理,没有图形化页面操作,命令操作比较繁琐,另外在dockertoolbox下搭建私有镜像库出现的问题比较多,建议还是安装linux系统进行搭建。
- 第二种集成harbor,docker-compose可以进行图形化页面仓库以及图形化权限管理,harbor也集成了mysql和log。
1.docker hub公共仓库的使用方法:
docker hub是docker公司维护的公共仓库,用户可以免费使用,也可以购买私有仓库。
首先在https://cloud.docker.com/(或https://hub.docker.com/)网站注册一个帐号
在docker主机上登陆
docker hub为了区分不同用户的同名镜像,要求镜像的格式是:username/xxx:tag
上传镜像到docker hub
从docker hub拉取镜像
删除镜像
2.docker hub公共仓库的缺点:
docker hub虽然方便,但是还是有限制
- 需要internet连接,速度慢;
- 所有人都可以访问;
- 由于安全原因企业不允许将镜像放到外网。
好消息是docker公司已经将registry开源,我们可以快速搭建企业私有仓库。
在 Docker 中,当我们执行 docker pull xxx 的时候,可能会比较好奇,Docker 会去哪儿查找并下载镜像呢?
它实际上是从 registry.hub.docker.com 这个地址去查找,这就是Docker公司为我们提供的公共仓库,上面的镜像,大家都可以看到,也可以使用。所以,我们也可以带上仓库地址去拉取镜像, 如:docker pull registry.hub.docker.com/library/alpine,不过要注意,这种方式下载的镜像的默认名称就会长一些。
如果要在公司中使用 Docker,我们基本不可能把商业项目上传到公共仓库中,那如果要多个机器共享,又能怎么办呢?
正因为这种需要,所以私有仓库也就有用武之地了。
所谓私有仓库,也就是在本地(局域网)搭建的一个类似公共仓库的东西,搭建好之后,我们可以将镜像提交到私有仓库中。这样我们既能使用 Docker 来运行我们的项目镜像,也避免了商业项目暴露出去的风险。
下面我们用官方提供的registry镜像来搭建私有镜像仓库,当然还有其它很多方法。
1.selinux和firewalld状态为disabled
2.各主机信息如下:
主机 | ip |
---|---|
server1(Docker) | 172.25.83.1 |
3.在/opt目录下创建目录registry,用于存放registry私有仓库的镜像数据(这个目录也可以是别的目录,目录的名称随意给)
[root@server1 ~]# cd /opt/
[root@server1 opt]# mkdir registry
若server1没有registry镜像,则需下载registry.tar,并将其导入为registry镜像。
1、导入registry仓库镜像
[root@server1 ~]# docker load -i registry.tar
2、建立本地仓库服务,设定仓库对外的端口是5000(开启容器)
[root@server1 ~]# docker run -d --name registry -p 5000:5000 -v /opt/registry/:/var/lib/registry registry:2.3.1 # 通过-v参数来将镜像文件存放在本地的指定路径上
[root@server1 ~]# 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
3、上传localhost:5000/rhel7:nginx4(要上传的镜像随便选,但是/前面必须是本地localhost或localhost:5000))
[root@server1 ~]# docker tag rhel7:nginx4 localhost:5000/rhel7:nginx4 #修改镜像的tag(要求镜像名为username/xxx:tag)
[root@server1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost:5000/rhel7 nginx4 50b384766482 2 hours ago 23.6MB
[root@server1 ~]# 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
4、测试:下载localhost:5000/rhel7:nignx4
在下载之前,
1.我们需要先获取registry仓库类的镜像:
[root@server1 docker]# curl http://172.25.83.1:5000/v2/_catalog #或curl http://localhost:5000/v2/_catalog {"repositories":["rhel7"]}
2.我们需要获取某个镜像的标签列表:
错误做法:
[root@server1 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"}}]}
正确做法:
[root@server1 registry]# curl http://172.25.83.1:5000/v2/rhel7/tags/list #或curl http://localhost:5000/v2/rhel7/tags/list {"name":"rhel7","tags":["nginx4"]}
注意:因为是本机下载,所有删除原有的镜像才能看到效果
[root@server1 registry]# docker rmi localhost:5000/rhel7:nginx4 #删除本地镜像
[root@server1 registry]# docker rm -f vm8 #因为上篇博客的内容,所以需要先删除占用rhel7:nginx4镜像的容器vm8
[root@server1 registry]# docker rmi rhel7:nginx4
[root@server1 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
##如果看不惯镜像localhost:5000/rhel7:nginx4这个名字,可以改名字
[root@server1 registry]# docker tag localhost:5000/rhel7:nginx4 rhel7:nginx4
[root@server1 registry]# docker rmi localhost:5000/rhel7:nginx4
搭建本地仓库只是对本机可用,很明显不符合生产要求,于是乎就有了下篇博文的registry私有仓库的加密仓库。