• 我的docker随笔38:用 registry 搭建私有仓库


    本文涉及一种在服务器部使用 registry 署私有镜像仓库的方法。经验证,可达到预期目标,并能应用在实际工作中。

    一、引言

    由于测试服务器无法使用外部网络,而又需要容器化部署应用程序。经考虑,使用 registry 搭建 docker 镜像仓库服务。当然,能提供类似的软件很多,功能也比较强大,但时间紧任务重,使用最简单的方式即可。

    二、技术小结

    • 拉取 registry 镜像。
    • 运行 registry 容器,注意挂载目录。
    • 编辑daemon.json文件,添加仓库地址。

    三、实践

    3.1 下载、运行

    拉取registry镜像:

    docker pull registry:2
    
    • 1

    注:

    实际操作中,因为服务器无法连接外部网络,因为是先在虚拟机下载好镜像,再通过docker save导出镜像,再用scp上传到服务器,再用docker load导入到服务器,完成“下载”动作。

    新建工程目录,用于存储配置文件及数据文件。

    新建config.yml配置文件:

    version: 0.1
    log:
      fields:
        service: registry
    storage:
      delete:
        enabled: true
      cache:
        blobdescriptor: inmemory
      filesystem:
        rootdirectory: /var/lib/registry
    http:
      addr: :5000
      headers:
        X-Content-Type-Options: [nosniff]
    health:
      storagedriver:
        enabled: true
        interval: 10s
        threshold: 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    注:上述config.yml文件实际是笔者启动容器后,直接取 /etc/docker/registry/config.yml 文件内容的,因为要加配置,所以单独拿出挂载。

    上述文件加了删除使能配置。

    docker-compose.yaml配置文件:

    version: '2'
    
    services:
      ttregistry:
        image: registry:2
        container_name: ttregistry
        restart: always
        volumes:
            - ./registry_data:/var/lib/registry
            - ./config.yml:/etc/docker/registry/config.yml 
        environment:
            - TZ=Asia/Shanghai
        ports:
            - "5000:5000"
        networks:
          - registry-net
    
    networks:
      registry-net:
        driver: bridge
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    启动:

    docker-compose up -d
    
    • 1

    3.2 配置仓库地址

    因为本文registry没有配置https模式,而docker命令默认是该模式,因此需要设置非安全仓库地址。在daemon.json 中添加,示例:

    $ cat /etc/docker/daemon.json 
    {
      "registry-mirrors": [
        "https://a8qh6yqv.mirror.aliyuncs.com",
        "http://hub-mirror.c.163.com"
      ],
      "insecure-registries": ["http://172.18.18.168:5000"]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    不管推送镜像还是拉取镜像,都可能遇到此问题。因此,都要在相应的机器上进行设置。

    设置好后,需要重启docker服务:

    sudo systemctl restart docker
    
    • 1

    如不配置,则在推送或拉取镜像出错,示例:

    Using default tag: latest
    Error response from daemon: Get https://172.18.18.168:5000/v2/: http: server gave HTTP response to HTTPS client
    
    • 1
    • 2

    3.3 测试

    拉取官方镜像

    docker pull busybox
    
    • 1

    需要将镜像打上标签,否则默认上传到 docker 官方仓库。

    #标记镜像
    $ docker tag busybox 172.18.18.168:5000/busybox
    
    • 1
    • 2

    推送镜像到私有仓库

    $ docker push 172.18.18.168:5000/busybox
    Using default tag: latest
    The push refers to repository [172.18.18.168:5000/busybox]
    01fd6df81c8e: Pushed 
    latest: digest: sha256:62ffc2ed7554e4c6d360bce40bbcf196573dd27c4ce080641a2c59867e732dee size: 527
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在另一机器上尝试拉取:

    docker pull 172.18.18.168:5000/busybox
    
    • 1

    四、操作

    4.1 接口

    访问:http://172.18.18.168:5000/v2/,显示{},说明服务运行正常。

    查询有哪些镜像:http://172.18.18.168:5000/v2/_catalog

    查询某个镜像的版本:http://172.18.18.168:5000/v2/busybox/tags/list

    4.2 命令

    4.2.1 获取镜像信息
    curl -H "Accept:application/vnd.docker.distribution.manifest.v2+json" http://172.18.18.168:5000/v2/<镜像名称>/manifests/<镜像版本>
    
    • 1

    示例:

    $curl  -H "Accept:application/vnd.docker.distribution.manifest.v2+json" http://172.18.18.168:5000/v2/busybox/manifests/latest
    
    {
       "schemaVersion": 2,
       "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
       "config": {
          "mediaType": "application/vnd.docker.container.image.v1+json",
          "size": 1456,
          "digest": "sha256:beae173ccac6ad749f76713cf4440fe3d21d1043fe616dfbe30775815d1d0f6a"
       },
       "layers": [
          {
             "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
             "size": 772788,
             "digest": "sha256:5cc84ad355aaa64f46ea9c7bbcc319a9d808ab15088a27209c9e70ef86e5a2aa"
          }
       ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    注:

    如果curl没有加-H字段,得到的结果较乱,不太方便分析,因此加上。

    在浏览器直接访问亦可,但笔者测试发现,要下载文件再分析,故不采用。

    4.2.2 删除镜像(测试不成功)

    删除镜像需指定digest值,从获取镜像信息的config字段中找到即可。命令:

    curl -X DELETE http://172.18.18.168:5000/v2/<镜像>/manifests/sha256:
    
    • 1

    示例:

    curl -X DELETE http://172.18.18.168:5000/v2/busybox/manifests/sha256:beae173ccac6ad749f76713cf4440fe3d21d1043fe616dfbe30775815d1d0f6a
    
    
    • 1
    • 2

    垃圾回收:

    docker exec -it ttregistry bin/registry garbage-collect /etc/docker/registry/config.yml
    
    • 1
    4.2.3 删除镜像另一法(有效)

    些法是直接在物理层面删除,通过重启服务方式彻底删除。可不用上面配置delete功能。

    删除存储卷上的镜像:

    rm -rf registry_data/docker/registry/v2/repositories/busybox/
    
    • 1

    执行垃圾回收。

    重启registry容器。

    五、小结

    本着适目的(其实是时间不足),本文仅使用 registry 即能达到目标,因此不再继续研究 Harbor 等高端的服务,日后如有必要,再进行亦未晚。实际上,笔者对 Harbor 也有接触,那时有雄心有干劲(挣钱),但那是很多年前的事了。

    李迟 2022.10.20 周四 夜

  • 相关阅读:
    算法入门 | 分治策略
    【MLT】MLT多媒体框架生产消费架构解析(二)
    继认证后弄清Spring Security实现授权
    前端面试(3)—— CSS盒模型及BFC
    看我简单教会你如何按关键字搜索淘宝商品
    原码反码补码疑惑解答记录:127+1=-128
    动态代理与静态代理
    【Kafka】分区与复制机制:解锁高性能与容错的密钥
    vector的使用
    如何对用OpenCV开发的API进行测试 (Google Test 版本)
  • 原文地址:https://blog.csdn.net/subfate/article/details/127437161