zoukankan      html  css  js  c++  java
  • Docker | 第六章:构建私有仓库

    前言

    上一章节,讲解了利用Dockerfilecommit进行自定义镜像的构建。大部分时候,公司运维或者实施部门在构建了符合公司业务的镜像环境后,一般上不会上传到公共资源库的。这就需要自己搭建一个私有仓库,来存放自己的镜像数据,同时也可以存储其他镜像,方便拉取,比较国内的网络环境连接还是比较慢的。所以,本章节介绍下如何构建私有仓库。

    安装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,具体使用方法有具体说明。

    参考资料

    官方的文档还是很齐全的,建议大家还是直接去官网查看相关资料。

    1. 官网:https://docs.docker.com/registry
    2. https://blog.csdn.net/sunshingheavy/article/details/54143764
    3. https://cloud.tencent.com/developer/article/1116799
    4. https://blog.csdn.net/nklinsirui/article/details/80705306
    5. 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/

  • 相关阅读:
    fzuoj Problem 2177 ytaaa
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Capture the Flag
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Team Formation
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Beauty of Array
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Lunch Time
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Convert QWERTY to Dvorak
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest May Day Holiday
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Demacia of the Ancients
    zjuoj The 12th Zhejiang Provincial Collegiate Programming Contest Ace of Aces
    csuoj 1335: 高桥和低桥
  • 原文地址:https://www.cnblogs.com/okong/p/docker-six.html
Copyright © 2011-2022 走看看