| 导语 前面我们讲了镜像的制作,知道了镜像是怎么生成的。但是镜像制作好了后,要怎么管理?他们存在哪里。通过本篇文章的讲解,大家就清楚了。
前面我们讲docker架构的时候,有一张图,如下:
我们注意右边,发现有个Registry,这就是仓库。仓库在docker架构里是很重要的一部分。镜像会因为业务的需要以不同类型的方式存在。所以,这么多类型的镜像如果没有一个很好的机制去管理,那么肯定会乱套。好比一生产车间,生产需要各种各样的螺丝钉、齿轮等配件,如果没有一个很好的仓库管理员负责对配件进行管理,那么车间里将乱七八糟。同样的,docker 镜像也需要标准化管理,那么负责这块功能的模块就是Registry。
Docker的仓库分为共有仓库和私有仓库,接下来我们通过分别讲解这两种仓库跟大家说说Registry仓库的功能和特点。
Docker Hub(https://hub.docker.com/) 是默认的 Registry,由 Docker 公司自己维护,上面有数以万计的镜像,用户可以自由下载和使用。当然除了docker hub,咱们国内也有很多共有仓库,因为docker hub因为当初有“墙”的原因,有时候会很慢,后来国内一些公司也搞了一些国内的共有仓库。做仓库其实是有盈利点的,所以大家开始都愿意去做,抢那风头。
我们接下来通过两大方面去跟大家介绍共有仓库的一些特点和使用方式。
1. 共有仓库的特点
共有仓库Docker Hub的特点总结下有这么四个:
共有仓库比如docker hub,都是运营了多年的、公认不错的仓库。里面的镜像都是官方推出的,由docker公司自己维护,所以自然而然官方权威。一些比较流行的开源软件都会先在官方仓库发布推荐。
共有仓库一般运营了多年,里面聚集着世界上所有容器爱好者以及相关公司存储的镜像。大家有最新、最好的镜像一般都会先在共有仓库docker hub里发布,所以数量大、种类多。基本上你想要的一些比较流行的镜像,这里都能找到。
正因为docker hub的官方、权威,所以上面的镜像都是经得住考验的,无论是稳定性、可靠性都能得以保证。
这个特点是docker hub比较重大的特点,因为docker hub是镜像仓库的原始发源地,是所有镜像仓库的“根”,加上它是放在公网上,所以前面不存在命名空间去区分。
2. 共有仓库的使用方式
我们使用Docker Hub有这么三种方式,一种是命令、一种是web界面,最后一种是API。
我们可以通过login、docer search、pull和push等命令连接操作Docker Hub服务。
登录我们一般执行docker login 就默认会登录docker hub的官方仓库里,当然你也可以带一些参数,比如带上用户名和密码(一般不推荐):
# docker login -u 用户名 -p 密码
如果想登录其他的仓库地址,只要跟上其他仓库的地址名就可以了:
# docker login registry.tencent.com
# docker login localhost:8080
如果想退出,那就执行:
# docker logout
登录到仓库后,你就能做接下来的一些命令了,比如search、pull和push。比如你要搜索一个你想要的镜像,直接执行 docker search 镜像名 即可。pull 是下载你要的镜像命令,push是你要上传的镜像命令。
界面的方式操作docker hub或者其他官方仓库那就很简单的,你只要登录它的地址,做好注册,然后登录即可根据界面的提示进行操作。比如下面这个界面就是登录后的界面,我们可以看到这上面的那几个链接功能,可以创建自己的仓库、创建组织、浏览提供的镜像列表、构建镜像、共享镜像等等。
界面操作,只要自己登录一下多操作两下基本就熟悉了。
现在的平台架构都讲究REST风格,所以都有API接口提供给用户去使用,这样能做一些自动化或者二次开发的操作。
这里有张关于API的表,大家可以参考使用:
方法 | 路径 | 分类 | 描述 |
---|---|---|---|
GET | /v2/ | Base | 检查是否支持2.0接口 |
GET | /v2/<image>/tags/list | Tags | 获取镜像标签列表 |
GET | /v2/<image>/manifests/<referevce> | Manifest | 获取镜像主要信息 |
PUT | /v2/<image>/manifests/<referevce> | Manifest | 修改镜像主要信息 |
DELETE | /v2/<image>/manifests/<reference> | Manifest | 删除镜像的主要信息 |
GET | /v2/<image>/blobs/<digest> | Blob | 获得镜像层 |
DELETE | /v2/<image>/blobs/<digest> | Blob | 删除镜像层 |
POST | /v2/<image>/blobs/uploads/ | Initiate Blob Upload | 开始分块上传 |
GET | /v2/<image>/blobs/uploads/<uuid> | Blob Upload | 获得分块上传的速度 |
PATCH | /v2/<image>/blobs/uploads/<uuid> | Blob Upload | 分块上传数据 |
PUT | /v2/<image>/blobs/uploads/<uuid> | Blob Upload | 完成上传 |
DELETE | /v2/<image>/blobs/uploads/<uuid> | Blob Upload | 取消上传 |
GET | /v2/_catalog | Catalog | 获得镜像列表 |
另外,如果大家想更加详细的了解API的一些信息,可以访问官方 API v2说明文档:
https://docs.docker.com/registry/spec/api/
3. 比较好用的共有仓库推荐
官方的docker hub仓库肯定不用说了,这是首推的仓库站点。但是有时候访问国外的有点慢,如果你想快点,可以看看国内的一些docker镜像仓库,这里推荐几个,大家可以采用,当然你也可以自己到网上搜搜,寻找自己合适的。
购买了腾讯云的CVM就能免费使用腾讯的CCS服务,CCS产品里面有免费的镜像仓库。好用不收费!赞!
据说DaoCloud是国内第一家Dock Hub加速器提供商 注意,加速器 2.0 需要使用 DaoCloud 自己的云服务器才可以使用。官方宣称会继续支持加速器1.0。 网址: https://dashboard.daocloud.io/mirror
阿里做云比较早,容器方面也是早有涉及。它的镜像仓库在国内也有很多人用,可以参考学习!
https://dev.aliyun.com/search.html
上面我们说的共有仓库特点很多,也非常好用。但是,共有仓库也有它不能满足的地方。比如公司企业级的一些私有镜像,这些镜像涉及到一些机密的数据和软件,私密性比较强,就不太适合放在共有仓库里。另外,假如你们的服务器环境不允许上外网,那么也无法下载到共有仓库的镜像。因此,为了解决这两大问题,我们就需要搭建自己的私有仓库,存储我们自己的私有镜像。
1. 私有仓库的特点
这个不难理解,共有仓库是放在公网,维护都是第三方,所以你没法控制它的私密和安全性。如果大家私有仓库,你可以跟外网进行隔离,这样一定程度上保证了你的私密性和安全性。加上有些涉及到公司机密的镜像,还是放在自家的仓库里放心。
私有仓库一般是放在公司内网的,当然不受外网访问的限制影响。
共有仓库再怎么方便还是别人搭建的仓库,你的使用方式、管理镜像的方式都得按照别人的来,所以,当你需要添加存储空间、做一些额外定制化功能的时候,你就受到制约了。如果是自己搭建的仓库,那么想怎么玩就怎么玩,自主性、维护性比较高。
2. 私有仓库的搭建
那么如何搭建属于自己的私有仓库呢?这里咱们只要用到docker提供的镜像分发工具Registry就可以了。
Registry是docker公司发布的一个用于打包、传输、存储和分发镜像的工具集,它是镜像仓库的核心。
接下来我们具体说说如何搭建私有仓库,其实很简单,之需要做几步操作即可。
# docker pull registry
一般的装好了docker,registry都有的,如果没有那就执行这条命令。Registry虽然是工具集,但是docker也把它打包成镜像了,使用它就是pull下载它即可。
因为镜像是占存储空间的,所以你需要在你服务器上预留一个路径专门存储镜像文件。一般的,我们会专门的用一个服务器做docker的仓库server。这里我们举例把 /data/docker_images 路径作为本地存储镜像的地址。然后Registry镜像内部,也定个路径存储镜像,我们定为 /var/lib/registry/images 路径。最后我们要把这两路径映射起来就OK了。
# docker run -d --name private-registry --restart=always -hostname localhost -p 5000:5000 -v /data/docker_images:/var/lib/registry/images registry:2
我们知道Registry就是一个镜像,所以我们只要执行docker run命令就能把它给启动了,里面所有的功能都通过这个Registry镜像提供了,不需要再做其他什么额外配置,本身就是容器。
然后我们再分析下上面那命令,第一次看好像比较复杂,其实仔细看下很简单理解。private-registry就是自己设置的私有仓库的名字;--restart=always意思是永久启动,不会关闭被轻易删除;locahost就是设置本地路径为仓库服务地址;5000:5000就是你要给仓库设置的端口,一般都给5000,你也可以设置成其他的,注意你的服务器里防火墙把端口打开;后面那个路径就是本地路径和容器内部路径的映射了;最后一个是标明使用Registry的版本,现在是v2版本。
通过前面这几步,私有仓库其实已经搭建好了。你可以执行docker push localhost:5000/test/centos:latest这样的命令去上传你制作好的镜像。但是在实际生产环境中,直接暴露了5000的端口是不安全的,内网还好,但是如果你的仓库要放到公网那就不安全了。这里我们需要设置下HTTPS的方式加固下安全。
设置HTTPS的方法有很多,结合openssl和nginx做反向代理即可。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。