简介

Registry作为Docker的核心组件之一负责镜像内容的存储与分发,客户端执行docker pull(push)命令都将直接与Registry交互。

Registry V2的改进: - 安全性改进 - 权限控制 - Pull性能改进 - 其他改进

环境说明

ip port description
192.168.1.161 5000 CentOS-7-x86_64 Registry服务器

Docker Registry V2

下载镜像(最新)

OFFICIAL REPOSITORY·Registry

1
docker pull registry:2.6.1

运行Registry服务

  • 运行容器

    1
    2
    3
    4
    5
    6
    7
    8
    
    docker run -d \
        --name registry \
        --restart=always \
        --privileged=true \
        -p 5000:5000 \ 
        -v /home/docker/registry:/var/lib/registry \
        -v /home/docker/registry/config.yml:/etc/docker/registry/config.yml \
        registry:2.6.1

Note:

  • registry:2.6.1会把上传的镜像保存在/var/lib/registry目录下
  • privileged=true: CentOS7的安全模块SELinux把权限禁用了,该参数用于开启容器的特权,不加会报 限错误。
  • 两个 -v 分别挂载镜像和配置文件目录到主机
  • 测试Registry服务是否成功运行

  • 有关配置文件 /etc/docker/registry/config.yml 的使用及说明

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    version: 0.1
    log:
      fields:
         service: registry
    storage:
       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

    上传镜像

    创建好私有仓库后,使用docker tag来标记一个镜像,然后推送它到仓库,就可供其他机器下载使用。

    • 设置标签
    • 格式
      • docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
    • 实例

      • docker tag alpine:latest 192.168.1.161:5000/alpine:test
    • 上传镜像

    • docker push 192.168.1.161:5000/alpine:test

    上面命令执行完后会有如下错误,错误原因链接:http: server gave HTTP response to HTTPS client

    • 上传镜像错误解决方案

    • 方案一

      • 在docker host端的 /etc/docker 目录下新建文件: daemon.json

        • vim /etc/docker/daemon.json
      • 添加如下内容:

        • cat /etc/docker/daemon.json
        • {"insecure-registries":["192.168.1.161:5000"]}
      • 重启dockerd服务

        • systemctl restart docker
      • 当有多个registry服务时:daemon.json数据如下:

        • {"insecure-registries":["192.168.1.161:5000","192.168.1.169:5000"]}
      • 重新上传文件,成功返回如下数据

      1
      2
      3
      4
      
          The push refers to a repository [192.168.1.161:5000/alpine]       
          5bef08742407: Pushed        
          latest: digest:sha256:0930dd4cc97ed5771ebe9be9caf3e8dc5341e0b5e32e8fb143394d7dfdfa100e 
          size: 528

      拉取registry上的镜像

      所有客户端daemon服务都必须加入Docker Registry地址, 不加则会报上述HTTPS相关错误。

      • 切换到客户端:192.168.1.169
      • 拉去镜像
      • docker pull 192.168.1.161:5000/alpine:test

      操作registry镜像

      一下操作都是通过http请求访问,如果配置了证书则需要以https方式请求

      列出当前所有镜像

      http http://192.168.1.161:5000/v2/_catalog {“repositories”:[“alpine”,“api”]}

      列出当前指定镜像

      curl http://192.168.1.161:5000/v2/_catalog?n=100

      搜索私有仓库镜像

      url http://192.168.1.161:5000/v2/alpine/tags/list

      删除镜像

      前提条件:启动仓库服务时,需要在配置文件的 storage 配置选项中增加 delete=true(允许删除镜像), 测试配置文件如下:

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      
      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
  • 删除镜像

    • API格式:DELETE /v2/< name >/manifests/< reference >

      • name: 镜像名称
      • refernece: 镜像对应的sha256值
    • 查看要删除镜像的sha256值

      • ls /home/docker/registry/docker/registry/v2/repositories/alpine/_manifests/revisions/sha256
      • 0930dd4cc97ed5771ebe9be9caf3e8dc5341e0b5e32e8fb143394d7dfdfa100e
    • 执行删除

    • 进行垃圾回收

      • 垃圾回收命令:
        • registry garbage-collect /path/to/config.yml
      • 实例:
        • docker exec -it registry bash
        • registry garbage-collect /etc/docker/registry/config.yml
    • 可在删除前后查看仓库数据大小

      • du -sh /home/docker/registory/docker/registry/v2/

注意:在目录中删除该镜像,然后重启docker daemon也会达到删除镜像的目的。

用户认证

FAQ

Issue1

  • Issue:

  • Why:

    • docker默认开启 HTTPS 服务,而实际上我们创建的私有仓库registry没有启用HTTPS加密
  • How:

See Also

Thanks to the authors 🙂