但有时候使用Docker Hub这样的公共仓库可能不方便,这种情况下用户可以使用registry创建一个本地仓库供私人使用,这点跟Maven的管理类似。
使用私有仓库有许多优点:

1)节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可;
2)提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。

目前Docker Registry已经升级到了v2,最新版的Docker已不再支持v1。Registry v2使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。如果需要安装registry v2,只需下载registry:2.2即可。Docker官方提供的工具docker-registry可以用于构建私有的镜像仓库。废话不多说了,下面记录下Docker私有仓库构建的过程:

选择一台服务器(内外网地址:192.168.1.23)作为注册服务器,用于搭建私有仓库。(该机器要安装了Docker环境)
1)从Docker官方仓库里下载registry镜像
[root@localhost ~]# docker pull registry:2.2
----------------------------------------------------------------
或者:
[root@localhost ~]# docker pull registry
[root@localhost ~]# docker pull registry:2.1.1
----------------------------------------------------------------
下载完之后,可以通过该镜像启动一个容器
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat7 latest 97c6a43dd69c 12 minutes ago 562.3 MB
docker.io/registry 2.2 ad379b517aa6 14 months ago 224.5 MB 默认情况下,会将私有仓库存放于容器内的/tmp/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失。
所以一般情况下会指定本地一个目录挂载到容器内的/tmp/registry下,如下:
[root@localhost ~]# docker run -d --name=my_registry -p 5000:5000 -v /opt/data/registry:/tmp/registry docker.io/registry:2.2
9fe45329bda17f61da04e6e8d2faf124fb22665a25270421bb8979a419809446 [root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8e98b1068cd docker.io/registry:2.2 "/bin/registry /etc/d" About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp my_registry 由上可以看到,已经启动了一个容器,地址为:192.168.1.23:5000。 2)测试
接下来可以把一个本地镜像push(如下面的tomcat7镜像)到私有仓库中。
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat7 latest 97c6a43dd69c 18 minutes ago 562.3 MB
docker.io/registry 2.2 ad379b517aa6 14 months ago 224.5 MB 修改一下该镜像的tag标识。
[root@localhost ~]# docker tag tomcat7 192.168.1.23:5000/tomcat7 [root@localhost ~]# docker tag tomcat7 192.168.1.23:5000/tomcat7 //修改了tag后的镜像若要删除,docker rmi后面不能用镜像ID了,需要用docker rmi 192.168.1.23:5000/tomcat7:latest
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.23:5000/tomcat7 latest 97c6a43dd69c 18 minutes ago 562.3 MB
tomcat7 latest 97c6a43dd69c 18 minutes ago 562.3 MB
docker.io/registry 2.2 ad379b517aa6 14 months ago 224.5 MB 接下来把上面修改tag后的镜像上传到私有仓库。
[root@localhost ~]# docker push 192.168.1.23:5000/tomcat7
The push refers to a repository [192.168.1.23:5000/tomcat7]
unable to ping registry endpoint https://192.168.1.23:5000/v0/
v2 ping attempt failed with error: Get https://192.168.1.23:5000/v2/: http: server gave HTTP response to HTTPS client
v1 ping attempt failed with error: Get https://192.168.1.23:5000/v1/_ping: http: server gave HTTP response to HTTPS client 出现上面错误的原因分析:
因为Docker从1.3.X之后,与docker registry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务,所以当与私有仓库交互时就会报上面的错误。
为了解决这个问题需要在启动docker server时增加启动参数为默认使用http访问。
需要在docker的配置文件/etc/sysconfig/docker (ubuntu系统中的docker配置文件时/etc/default/docker )添加参数“--insecure-registry=192.168.1.23:5000”。
-----------------------------------------------------------------------------------------------------------
温馨提示:
这个是在客户机的docker配置文件里添加的(即上传镜像到私有仓库里或从私有仓库下载镜像的客户机)。
比如说在A机器上将它的镜像上传到192.168.1.23的私有仓库上或从该私有仓库下载镜像,那么就在A机器的本地docker配置文件中添加。
我这里测试用的是同一台机器(centos7),即将注册机192.168.1.23本机的镜像上传到它的仓库内。 [如果是centos6系统,就在other_args选项后面添加。other_args="--graph=/docker --insecure-registry=192.168.1.234:5000"]
-----------------------------------------------------------------------------------------------------------
[root@localhost ~]# vim /etc/sysconfig/docker
.......
OPTIONS='--selinux-enabled --log-driver=journald'
改为
OPTIONS='--selinux-enabled --log-driver=journald --insecure-registry=192.168.1.23:5000' [root@localhost ~]# service docker restart 由于docker服务重启后,所有容器都会被关闭。所以需要在docker重启后再次启动容器
[root@localhost ~]# docker start my_registry
my_registry
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8e98b1068cd docker.io/registry:2.2 "/bin/registry /etc/d" About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp my_registry 再次提交到私有仓库
[root@localhost ~]# docker push 192.168.1.23:5000/tomcat7
The push refers to a repository [192.168.1.23:5000/tomcat7]
c6d7ce9e90d7: Pushed
34e7b85d83e4: Pushed
latest: digest: sha256:5fdcbaf254cb44dd26645f606cccea8de76118baff03485e40853c691a15956d size: 720 上面命令执行无误后,就表示镜像已经push到私有仓库中去了。
查看私有仓库里的镜像(一定要保证下面能查看到仓库里有镜像!如果仓库里没有镜像,那么客户端机器就无法从该私有仓库下载镜像了)
[root@localhost ~]# curl -XGET http://192.168.1.23:5000/v2/_catalog //即该私有仓库里有tomcat7镜像
{"repositories":["tomcat7"]}
[root@localhost ~]# curl -XGET http://192.168.1.23:5000/v2/tomcat7/tags/list
{"name":"tomcat7","tags":["latest"]}
或者浏览器里访问(103.110.186.23是注册机的外网ip,iptables防火墙内开放5000端口访问):
http://103.110.186.23:5000/v2/_catalog
http://103.110.186.23:5000/v2/tomcat7/tags/list 现在可以将本地的tomcat7和192.168.1.23:5000/tomcat7镜像都删除,然后从私有仓库中下载
[root@localhost ~]# docker rmi tomcat7
[root@localhost ~]# docker rmi 192.168.1.23:5000/tomcat7 [root@localhost ~]# docker pull 192.168.1.23:5000/tomcat7
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.23:5000/tomcat7 latest 5hc8a2ip413w 3 days ago 562.3 MB -----------------------------------------------------------------------------
这样,也就可以在同一局域网内的其他机器上,从该私有仓库中pull下来该镜像。
比如在192.168.1.17服务器上拉取该私有仓库的tomcat镜像进行容器创建(注意,要在该机器的/etc/sysconfig/docker配置文件里添加--insecure-registry=192.168.1.23:5000参数)
[root@linux-node2 ~]# docker pull 192.168.1.23:5000/tomcat7 [root@linux-node2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.23:5000/tomcat7 latest 2ec9e2eb978a 3 days ago 562.3 MB 这样就搭建了Docker私有仓库,上面搭建的仓库是不需要认证的,我们可以结合nginx和https实现认证和加密功能。

注意查看镜像方法(docker pull registry:2.1.1):

# curl -XGET http://registry_ip:5000/v2/_catalog
# curl -XGET http://registry_ip:5000/v2/image_name/tags/list

Docker容器学习梳理 - 私有仓库Registry使用的更多相关文章

  1. Docker容器学习梳理 - 日常操作总结

    使用Docker已有一段时间了,今天正好有空梳理下自己平时操作Docker时的一些命令和注意细节: Docker 命令帮助 $ sudo docker Commands: attach Attach ...

  2. Docker容器学习梳理 - 应用程序容器环境部署

    关于国内Docker镜像,可以参考:Docker容器学习梳理--基础知识(2) 的Docker镜像使用. 如果我们需要在Docker环境下部署tomcat.redis.mysql.nginx.php等 ...

  3. docker 查询或获取私有仓库(registry)中的镜像

    docker 查询或获取私有仓库(registry)中的镜像,使用 docker search 192.168.1.8:5000 命令经测试不好使. 解决: 1.获取仓库类的镜像: [root@sha ...

  4. Docker容器学习梳理 - 基础知识(2)

    之前已经总结了Docker容器学习梳理--基础知识(1),但是不够详细,下面再完整补充下Docker学习的一些基础. Docker是个什么东西 Docker是一个程序运行.测试.交付的开放平台,Doc ...

  5. Docker容器学习梳理 - Dockerfile构建镜像

    在Docker的运用中,从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低.所以就需要一 种文件或脚本,我们把想执行的操作以命令的方式写入其 ...

  6. Docker容器学习梳理 - 容器硬盘热扩容

    前面已介绍了docker很多知识点的操作记录,今天这里梳理下docker容器空间扩展的操作.默认情况下,物理机下创建的docker容器的空间是10G(虚拟机下创建的docker容器空间就是虚拟机的空间 ...

  7. Docker容器学习梳理 - 基础知识(1)

    Docker是PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源.Docker是通过内核虚拟化技 ...

  8. Docker容器学习梳理 - 容器间网络通信设置(Pipework和Open vSwitch)

    自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信.下面将分别针对这两方面,对容 ...

  9. Docker容器学习梳理 - Volume数据卷使用

    之前部署了Docker容器学习梳理--基础环境安装,接下来看看Docker Volume的使用. Docker volume使用 Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker ...

随机推荐

  1. python第七十一天---堡垒机

    堡垒机的表结构图:

  2. 用Python做股市数据分析(二)

    本文由 伯乐在线 - 小米云豆粥 翻译.未经许可,禁止转载!英文出处:Curtis Miller.欢迎加入翻译组. 这篇博文是用Python分析股市数据系列两部中的第二部,内容基于我在犹他大学 数学3 ...

  3. Windows批处理 -- 打造MySQLCleaner

    批处理打造MySQLCleaner 1. 简介       在我们卸载MySQL数据库的时候,往往除了需要卸载软件,还需要删除各种注册表信息,隐藏文件,卸载服务,否则当我们再次安装MySQL时就会出现 ...

  4. <20190303>大厂的风度,firmware每年更新!

    哪怕是最普通的型号, 思科Cisco 每隔一个周期都会推送一个新的firmware, 来提高 路由器的稳定性,和整体兼容性, 2015年买的路由器, 今年年初又发布一个更新包. Release Not ...

  5. select for update引发死锁分析

    本文针对MySQL InnoDB中在Repeatable Read的隔离级别下使用select for update可能引发的死锁问题进行分析. 1. 业务案例 业务中需要对各种类型的实体进行编号,例 ...

  6. 对数组的操作splice() 和slice() 用法和区别

    JavaScript splice() 方法 定义和用法 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目. 注释:该方法会改变原始数组. 语法 arrayObject.spli ...

  7. (8)Python判断结构

  8. web socket RFC6455 frame 打包、解包

    #ifndef __APP_WEBSOCKET_FRAME_H__ #define __APP_WEBSOCKET_FRAME_H__ #include "memory.hpp" ...

  9. Spark本地运行成功,集群运行空指针异。

    一个很久之前写的Spark作业,当时运行在local模式下.最近又开始处理这方面数据了,就打包提交集群,结果频频空指针.最开始以为是程序中有null调用了,经过排除发现是继承App导致集群运行时候无法 ...

  10. jQuery-iframe加载完成后触发的事件监听

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 最近遇到一个问题,要写一个后台管理系统的layout,里面content是一个ifra ...