zoukankan      html  css  js  c++  java
  • docker之register搭建私有镜像仓库以及删除docker历史的临时镜像(虚悬镜像)

    一,介绍

      一般docker提供了Docker  Hub来维护管理所有的镜像,但是一般出于安全和网络原因,我们不可能把商业项目上传到docker上,我们会在本地局域网搭建私有镜像仓库。
      所谓私有仓库,也就是在本地(局域网)搭建的一个类似公共仓库的东西,搭建好之后,我们可以将镜像提交到私有仓库中。这样我们既能使用 Docker 来运行我们的项目镜像,也避免了商业项目暴露出去的风险。

    删除虚悬镜像

    1 搞容器开发一段时间后,想看看都有哪些镜像,执行了一下docker images -a,蒙圈了,有一堆:的镜像。不知有什么用,不知能不能删,不知会不会占用很多空间。接下来我们探索一下吧。

    再构建镜像中,多次使用build指令构建Dockerfile,并且镜像的名字以及版本一致的时候,或者多次pull指令,拉取相同名字:相同版本的镜像的时候,就会出现虚悬镜像;
    例如:下载了一个nginx默认版本的镜像;

    docker pull nginx:latest
    

    过一段时间,再次拉取(相当于更新本地镜像为最新版本)的时候;就会出现虚悬镜像;

    2 镜像也有好坏吗?
    这些:镜像可分为两类:好与坏、有用与无用、不建议删除和建议删除的。

    2.1 好的none
    好的:镜像是由于镜像分层的中间镜像。它们只会在docker images -a才会显示出来,用docker images是不会显示的。它们也不会造成空间问题。

    2.2 坏的none
    坏的:镜像会占用空间,主要是由于新加镜像替换原来相对标签的镜像,原来镜像就变成了:而不会被删除。

    我们执行docker images查看:

    $ docker images
    REPOSITORY                TAG       IMAGE ID            CREATED             SIZE
    pkslow/springboot-mongo   0.0.6     f029f9b6e703        28 minutes ago      356MB
    pkslow/springboot-mongo   latest    f029f9b6e703        28 minutes ago      356MB
    <none>                    <none>    56de36189ad6        29 minutes ago      356MB
    <none>                    <none>    9e00dfd258dc        40 hours ago        356MB
    <none>                    <none>    2d736eaaafd0        2 weeks ago         346MB
    

    然后再docker build一次,用同样的标签0.0.6。

    $ docker images
    REPOSITORY                TAG       IMAGE ID            CREATED             SIZE
    pkslow/springboot-mongo   0.0.6     2119e4fbc6e8        43 seconds ago      356MB
    pkslow/springboot-mongo   latest    2119e4fbc6e8        43 seconds ago      356MB
    <none>                    <none>    f029f9b6e703        30 minutes ago      356MB
    <none>                    <none>    56de36189ad6        31 minutes ago      356MB
    <none>                    <none>    9e00dfd258dc        40 hours ago        356MB
    <none>                    <none>    2d736eaaafd0        2 weeks ago         346MB
    

    认真查看可以得出,以前最新的镜像ID为f029f9b6e703,后来变成了:

    这些坏坏的镜像也叫dangling images,空悬镜像

    单独查看虚悬镜像

    docker images -q -f dangling=true
    
    -f:表示filter,过滤
    -q:表示只显示镜像ID;
    

    3 如何删除dangling images
    既然没用,又还占用空间,不如就删掉它。Docker没有自动删除这些镜像的机制,可以通过以下命令删除:

    删除指令镜像
    docker rmi $(docker images -q -f dangling=true)

    检查一下,已经没有的镜像了。

    1) registry 私有镜像仓库常用命令
    # 查询registry中所有的镜像名称
    curl -XGET http://registry_ip:5000/v2/_catalog
    
    # 依据镜像名称查询镜像版本
    curl -XGET http://registry_ip:5000/v2/nginx/tags/list
    
    
    # 打开镜像的存储目录,如有-V操作打开挂载目录也可以,删除镜像文件夹
    docker exec <容器名> rm -rf /var/lib/registry/docker/registry/v2/repositories/<镜像名>
    
    # 利用请求api删除历史遗留的镜像
    for i in  `ls -t /app/data/registry/registry/docker/registry/v2/repositories 
    /dafu/app/shopping-shop-api-test/_manifests/revisions/sha256/ | tail -100`; 
    do 
    curl -XDELETE http://127.0.0.1:5000/v2/dafu/app/shopping-shop-api-test/manifests/sha256:$i; 
    done
    
    # 执行垃圾回收操作,注意2.4版本以上的registry才有此功能
    docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml
    
    2) registry 镜像仓库私有目录说明
    # registry默认仓库目录是/var/lib/registry 挂载宿主机上的/data/registry
    [root@docker-register ~]# tree /data/registry/
    /data/registry/
    └── docker
        └── registry
            └── v2 #仓库版本
                ├── blobs # 二进制对象斑点(记录所有镜像层级)
                │   └── sha256
                │       ├── 1c
                │       │   └── 1ccc0a0ca577e5fb5a0bdf2150a1a9f842f47c8865e861fa0062c5d343eb8cac
                │       │       └── data
                │       ├── 38
                │       │   └── 388056c9a6838deea3792e8f00705b35b439cf57b3c9c2634fb4e95cfc896de6
                │       │       └── data
                │       └── f5
                │           └── f531cdc67389c92deac44e019e7a1b6fba90d1aaa58ae3e8192f0e0eed747152
                │               └── data
                └── repositories # 仓库
                    └── busybox-v0.1 # 镜像名称
                        ├── _layers # 镜像使用到的层次
                        │   └── sha256
                        │       ├── 388056c9a6838deea3792e8f00705b35b439cf57b3c9c2634fb4e95cfc896de6
                        │       │   └── link
                        │       └── f531cdc67389c92deac44e019e7a1b6fba90d1aaa58ae3e8192f0e0eed747152
                        │           └── link
                        ├── _manifests # 记录镜像引用的layer(描述镜像的信息) 
                        │   ├── revisions
                        │   │   └── sha256
                        │   │       └── 1ccc0a0ca577e5fb5a0bdf2150a1a9f842f47c8865e861fa0062c5d343eb8cac
                        │   │           └── link
                        │   └── tags # 镜像的标签
                        │       └── latest # 最新版本
                        │           ├── current # 当前
                        │           │   └── link
                        │           └── index
                        │               └── sha256
                        │                   └── 1ccc0a0ca577e5fb5a0bdf2150a1a9f842f47c8865e861fa0062c5d343eb8cac
                        │                       └── link
                        └── _uploads # 保存镜像push时的数据
     
    28 directories, 8 files
    
    
    

    简单步骤参考图

    二,环境

    服务端机器 (主机名为registry):docker私有仓库服务器,运行registry容器。
    测试端机器 (主机名为node):普通的docker服务器,在这台服务器上下载一个测试镜像busybox,然后上传到registry服务器进行测试。

    三. 部署

    1)registry主机下操作:

    1. 下载镜像
      docker pull registry
    2. 查看镜像是否下载成功

    [root@docker-register ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
    registry     latest    1fd8e1b0bb7e   8 days ago   26.2MB
    
    1. 运行镜像
    docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
    

    4. 查看镜像仓库中的所有镜像

    [root@docker-register ~]# curl -XGET http://127.0.0.1:5000/v2/_catalog
    {"repositories":[]}
    
    2)registry节点node主机下操作:

    1. 为镜像打标签
    10.0.0.50:5000是registry私有镜像服务器的IP地址和端口后面加上镜像的名称 要推送到自己的私有仓库必须加上前缀ip地址和端口的名称
    [root@docker-test ~]# docker tag busybox 10.0.0.50:5000/busybox-v0.1

    2. 查看打好标签的镜像

    [root@docker-test ~]# docker tag busybox 10.0.0.50:5000/busybox-v0.1 
    [root@docker-test ~]# docker images
    REPOSITORY                    TAG       IMAGE ID       CREATED       SIZE
    10.0.0.50:5000/busybox-v0.1   latest    388056c9a683   2 weeks ago   1.23MB
    busybox                       latest    388056c9a683   2 weeks ago   1.23MB
    
    

    3. 上传到镜像服务器

    # 推送镜像到自己私有的仓库如果报错
    [root@docker-test ~]# docker push 10.0.0.50:5000/busybox-v0.1:latest
    The push refers to repository [10.0.0.50:5000/busybox-v0.1]
    Get https://10.0.0.50:5000/v2/: http: server gave HTTP response to HTTPS client
    
    # 修改daemon.json文件 添加私有镜像服务器地址
    [root@docker-test ~]# vim /etc/docker/daemon.json 
    {
      "insecure-registries": ["10.0.0.50:5000"],
    }
    
    # 重启docker服务或则重载
    systemctl restar  docker
    systemctl reload docker
    
    # 推送正常的镜像到自己的私有仓库
    [root@docker-test ~]# docker push 10.0.0.50:5000/busybox-v0.2
    Using default tag: latest
    The push refers to repository [10.0.0.50:5000/busybox-v0.2]
    67f770da229b: Mounted from busybox-v0.1 
    latest: digest: sha256:1ccc0a0ca577e5fb5a0bdf2150a1a9f842f47c8865e861fa0062c5d343eb8cac size: 527
    
    # 推送不是 ip:端口/镜像 格式的镜像默认是推送到官方仓库里面
    [root@docker-test ~]# docker push busybox
    Using default tag: latest
    The push refers to repository [docker.io/library/busybox]
    ......
    

    四,镜像名字补充

    1) 构建同名同版本的不同ID的镜像 会顶掉以前的旧镜像 名字跟Id变成none状态 旧镜像只有一个的情况下
    # 查看镜像
    [root@docker-test ~]# docker images
    REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
    test1                  latest    c4e303a5d487   18 minutes ago   1.23MB
    10.0.0.50:5000/test1   latest    5bf3d586f010   41 minutes ago   1.23MB
    busybox                latest    388056c9a683   2 weeks ago      1.23MB
    
    # 构建一个同名的镜像(test1)
    [root@docker-test ~]# docker build -t test1 . --no-cache
    Sending build context to Docker daemon  17.92kB
    Step 1/2 : from busybox
     ---> 388056c9a683
    Step 2/2 : run mkdir -p /test7
     ---> Running in 1d1f9efa907f
    Removing intermediate container 1d1f9efa907f
     ---> 22da1e98032d
    Successfully built 22da1e98032d
    Successfully tagged test1:latest
    
    # 旧同名镜像(test1)名字跟标签变成none状态了
    [root@docker-test ~]# docker images
    REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
    test1                  latest    22da1e98032d   4 seconds ago    1.23MB
    <none>                 <none>    c4e303a5d487   18 minutes ago   1.23MB
    10.0.0.50:5000/test1   latest    5bf3d586f010   42 minutes ago   1.23MB
    busybox                latest    388056c9a683   2 weeks ago      1.23MB
    
    2) 构建同名同版本的不同ID的镜像 会顶掉以前的旧镜像 名字跟Id变成none状态 旧镜像有两个的情况下
    # 查看镜像同ID的个两个
    [root@docker-test ~]# docker images
    REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
    test1                  latest    22da1e98032d   4 minutes ago    1.23MB
    test2                  latest    22da1e98032d   4 minutes ago    1.23MB
    <none>                 <none>    c4e303a5d487   23 minutes ago   1.23MB
    10.0.0.50:5000/test1   latest    5bf3d586f010   47 minutes ago   1.23MB
    busybox                latest    388056c9a683   2 weeks ago      1.23MB
    
    # 构建一个已有相同名字的镜像
    [root@docker-test ~]# docker build -t test1 . --no-cache
    Sending build context to Docker daemon  17.92kB
    Step 1/2 : from busybox
     ---> 388056c9a683
    Step 2/2 : run mkdir -p /test7
     ---> Running in 434da5d47d0b
    Removing intermediate container 434da5d47d0b
     ---> 840a4834a6af
    Successfully built 840a4834a6af
    Successfully tagged test1:latest
    
    # 旧镜像相同名字的直接不见了
    [root@docker-test ~]# docker images
    REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
    test1                  latest    840a4834a6af   1 second ago     1.23MB
    test2                  latest    22da1e98032d   5 minutes ago    1.23MB
    <none>                 <none>    c4e303a5d487   24 minutes ago   1.23MB
    10.0.0.50:5000/test1   latest    5bf3d586f010   47 minutes ago   1.23MB
    busybox                latest    388056c9a683   2 weeks ago      1.23MB
    
  • 相关阅读:
    揭秘淘宝286亿海量图片存储与处理架构
    从能做的事做起,做越来越多的事
    用表驱动代替switchcase
    文件过滤驱动中的重入处理
    谈谈对APC的一点理解
    StartIo例程的作用
    C++各大名库的介绍
    IRQL
    FastIO
    一道面试题,看这段代码最后抛出什么异常
  • 原文地址:https://www.cnblogs.com/xiaolang666/p/14694121.html
Copyright © 2011-2022 走看看