Docker | 第六章:构建私有仓库

到的问题。公众号:lqdevOps,欢迎关注~个人博客:http://blog.lqdev.cn 博客园 首页 新随笔 联系 订阅 管理 Docker | 第六章:构建私有仓库 前言 上一章节,讲解了利用Dockerfile和commit进行自定义镜像的构建。大部分时候,公司运维或者实施部门在构建了符合公司业务的镜像环境后,一般上不会上传到公共资源库的。这就需要自己搭建一个私有仓库,来存放自己的镜像数据,同时也可以存储其他镜像,方便拉取,比较国内的网络环境连接还是比较慢的。所以,本章节介绍下如何构建私有仓库。 安装Registry 管理Registry Registry接口列表 删除镜像示例 参考资料 总结 最后 老生常谈 安装Registry Docker官方提供了Registry镜像,方便构建自己的私有仓库。所以,接下来讲解下私有仓库服务的安装。 拉取Registry镜像 docker pull registry 启动Registry镜像 由于Registry是一个镜像,运行后若我们删除了容器,里面的资源就都丢失了,所以我们在运行时,指定一个资源的挂载目录,映射到宿主的一个目录下,这样资源就不会丢失了。 docker run -d -v /opt/docker/registry:/var/lib/registry -p 1888:5000 --restart=always --name registry registry:latest 提示:restart=always 是指docker重启时此容器自动启动。 启动后,就能通过:http://宿主IP:1888/v2 ,访问了。 registry http访问 本地推送镜像至仓库 我们在本地创建一个镜像,同时推送到仓库上。 # 利用tag 标记一个新镜像 docker tag hello-world 127.0.0.1:1888/demo/hello-world:latest # 推送镜像 docker push 127.0.0.1:1888/demo/hello-world:latest 此时,访问私有仓库地址:http://宿主IP:1888/v2/_catalog, 即可看见推送的镜像信息了。 所有镜像 远程推送镜像至仓库 直接使用127.0.0.1或者local时,是没有进行安全检验的。当我们使用外部的ip地址推送时,Registry为了安全性考虑,默认是需要https证书支持的。 错误提示: [root@izbp16chpwsnff41nrjtfhz ~]# docker push 47.98.238.247:1888/demo/hello-world:v1 The push refers to repository [47.98.238.247:1888/demo/hello-world] Get https://47.98.238.247:1888/v2/: http: server gave HTTP response to HTTPS client 搜索相关资料后,有两种方案:一种是通过daemon.json配置一个insecure-registries属性;另一种就直接配置一个https的证书了。https的相关配置不在本章节讲解范围了,这里就不示例了,最稳妥的做法可以是:利用nginx进行https证书支持,然后代理到Registry服务。有兴趣的可以自己动手实现下。 针对第一种做法,这里示例下: { "insecure-registries": ["实际的ip:端口"] } 之后重启Docker, systemctl restart docker 之后再进行推送就能推送成功了 docker push 47.98.238.247:1888/demo/hello-world:v1 查看下镜像的版本列表就能知道是否上传成功。 镜像tag列表 管理Registry 仓库很大,要是没有一套管理规则,也是很头疼的事情。所以接下来,讲解下如何管理Registry。 Registry接口列表 以下转至:https://cloud.tencent.com/developer/article/1116799 。详细可点击查看。 方法 路径 分类 描述 GET /v2/ Base 检查是否支持2.0接口 GET /v2/${image}/tags/list Tags 获取镜像标签列表 GET /v2/${image}/manifests/ Manifest 获取镜像主要信息 PUT /v2/${image}/manifests/ Manifest 修改镜像主要信息 DELETE /v2/${image}/manifests/ Manifest 删除镜像的主要信息 GET /v2/${image}/blobs/ Blob 获得镜像层 DELETE /v2/${image}/blobs/ Blob 删除镜像层 POST /v2/${image}/blobs/uploads/ Initiate Blob Upload 开始分块上传 GET /v2/${image}/blobs/uploads/ Blob Upload 获得分块上传的速度 PATCH /v2/${image}/blobs/uploads/ Blob Upload 分块上传数据 PUT /v2/${image}/blobs/uploads/ Blob Upload 完成上传 DELETE /v2/${image}/blobs/uploads/ Blob Upload 取消上传 GET /v2/_catalog Catalog 获得镜像列表 基本上的管理都是通过以上的api接口方式了,大家可自行尝试下。 删除镜像示例 这里就简单示例下比较常用的也比较麻烦的删除镜像方法。这里直接使用curl也可使用POSTMAN等api尝试工具进行. 注意:由于默认是不允许删除镜像的(提示方法不支持),所以需要进行配置,开启删除功能。所以我们在启动时,直接设置参数(REGISTRY_STORAGE_DELETE_ENABLED=true): docker run -d -v /opt/docker/registry:/var/lib/registry -p 1888:5000 --restart=always --name registry -e "REGISTRY_STORAGE_DELETE_ENABLED=true" registry:latest 或者可设置/etc/docker/registry/config.yml,加入storage.delete.enabled设置为true(yaml格式) version: 0.1 log: fields: service: registry storage: cache: blobdescriptor: inmemory filesystem: rootdirectory: /var/lib/registry delete: enable: true http: addr: :5000 headers: X-Content-Type-Options: [nosniff] health: storagedriver: enabled: true interval: 10s threshold: 3 之后重启(restart)容器即可。 提示:对于config.yml配置文件,里面可以设置很多的属性信息,具体属性可查看官网说明:https://docs.docker.com/registry/configuration/ 删除镜像: curl -I -X --header "Accept: application/vnd.docker.distribution.manifest.v2+json" DELETE http://127.0.0.1:1888/v2/demo/hello-world/manifests/sha256:aca41a608e5eb015f1ec6755f490f3be26b48010b178e78c00eac21ffbe246f1 name:镜像名称。 reference:删除时必须是镜像对应sha256值,推送时,可以获悉sha256值。 删除时reference必须为digest sha256值 或者利用get获取对应镜像信息: curl -X GET \ http://47.98.238.247:1888/v2/demo/hello-world/manifests/v1 \ -H 'Cache-Control: no-cache' 再或者可以直接根据存储目录查看(由于挂载宿主目录,所以我们直接在宿主机查看): /opt/docker/registry/docker/registry/v2/repositories/demo/hello-world/_manifests/tags/v2/index/sha256/link 查看目录 利用cat命令 或者 直接打开文件查看: sha256查看 题外话:关于Postman用法,可点击查看 postman方式 删除前: 删除前 资源库大小: 删除前资源库大小 执行删除后,发现tag已经为null了: 删除后 再看看大小,是没有变化的: 删除后资源库大小 因为只删除了tag,镜像文件没有删除。所以我们进入容器执行下回收命令: / # registry garbage-collect /etc/docker/registry/config.yml demo/hello-world test/hello-world test/hello-world: marking manifest sha256:aca41a608e5eb015f1ec6755f490f3be26b48010b178e78c00eac21ffbe246f1 test/hello-world: marking blob sha256:2cb0d9787c4dd17ef9eb03e512923bc4db10add190d3f84af63b744e353a9b34 test/hello-world: marking blob sha256:9db2ca6ccae029dd195e331f4bede3d2ea2e67e0de29d6a0f8c1572e70f32fa7 3 blobs marked, 1 blobs eligible for deletion blob eligible for deletion: sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4 INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/a3/a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4 go.version=go1.7.6 instance.id=de550dcd-7e54-4279-a9e4-d3609c83b11b 这个时候就已经回收了。目前貌似没有自动回收机制。 镜像被回收后大小 可以看见大小发生了变化了,说明镜像已经被清理了。也可以去刚刚查看sha256目录查看,里面的信息已经被删除了 删除后目录 最后想说,利用命令去删除之类的太麻烦了,现在有很多开源的工具可以管理仓库。大家可以自行搜索下。这里可以看看这个开源的删除资源的工具类:https://github.com/burnettk/delete-docker-registry-image,具体使用方法有具体说明。 参考资料 官方的文档还是很齐全的,建议大家还是直接去官网查看相关资料。 官网:https://docs.docker.com/registry https://blog.csdn.net/sunshingheavy/article/details/54143764 https://cloud.tencent.com/developer/article/1116799 https://blog.csdn.net/nklinsirui/article/details/80705306 https://github.com/burnettk/delete-docker-registry-image 总结 本章节主要是介绍如何利用Registry进行私有仓库的创建及管理。对于单纯的api调用而言,有点麻烦,可以上网找写批量的脚本,简化步骤下。由于对linux命令不是很熟悉,大家还是自行谷歌吧。正常而言,还是应该有个管理的UI界面会更方便点。在后面讲解Docker可视化界面管理时再来详细说明下,因为本人也没有搭建过,后面会为了这个章节找些资料,然后分享给大家。敬请期待! 最后 若文中有错误或者遗漏之处,还望指出,共同进步! 老生常谈 个人QQ:499452441 微信公众号:lqdevOps 公众号 个人博客:http://blog.lqdev.cn 原文地址:http://blog.lqdev.cn/2018/08/05/docker/docker-six/ 作者:oKong | 趔趄的猿 出处:blog.lqdev.cn 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 本文如对您有帮助,还请多帮 【推荐】 下此文。 如果喜欢我的文章,请关注我的公众号https://www.cnblogs.com/okong/p/docker-six.html
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信