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
    
  • 相关阅读:
    10 个深恶痛绝的 Java 异常。。
    为什么公司宁愿 25K 重新招人,也不给你加到 20K?原因太现实……
    推荐一款代码神器,代码量至少省一半!
    Spring Cloud Greenwich 正式发布,Hystrix 即将寿终正寝。。
    hdu 3853 LOOPS(概率 dp 期望)
    hdu 5245 Joyful(期望的计算,好题)
    hdu 4336 Card Collector(期望 dp 状态压缩)
    hdu 4405 Aeroplane chess(概率+dp)
    hdu 5036 Explosion(概率期望+bitset)
    hdu 5033 Building (单调栈 或 暴力枚举 )
  • 原文地址:https://www.cnblogs.com/xiaolang666/p/14694121.html
Copyright © 2011-2022 走看看